From 135fdf977d75e9912fe0125749667570a87f12a3 Mon Sep 17 00:00:00 2001 From: Medvediev Date: Wed, 23 Jun 2021 16:03:27 +0300 Subject: [PATCH 001/674] Eliminated Aspect Mock usage from ActionMergeUtilTest --- .../Test/Util/ActionMergeUtilTest.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php index 8c55210a4..099d8ef81 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php @@ -5,7 +5,6 @@ */ namespace tests\unit\Magento\FunctionalTestFramework\Test\Util; -use AspectMock\Test as AspectMock; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject; use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; @@ -110,8 +109,13 @@ public function testResolveActionStepEntityData() $mockDataObject = new EntityDataObject($dataObjectName, $dataObjectType, $mockData, null, null, null); // Set up mock DataObject Handler - $mockDOHInstance = AspectMock::double(DataObjectHandler::class, ['getObject' => $mockDataObject])->make(); - AspectMock::double(DataObjectHandler::class, ['getInstance' => $mockDOHInstance]); + $mockDOHInstance = $this->createMock(DataObjectHandler::class); + $mockDOHInstance->expects($this->any()) + ->method('getObject') + ->willReturn($mockDataObject); + $property = new \ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($mockDOHInstance); // Create test object and action object $actionAttributes = [$userInputKey => $userInputValue]; From 9484d8584d0b4593af50c7a9071963aedbcb258b Mon Sep 17 00:00:00 2001 From: silinmykola Date: Sun, 27 Jun 2021 18:19:48 +0300 Subject: [PATCH 002/674] 33294 eliminate aspectMock from allureHelperTest --- .../Allure/AllureHelperTest.php | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php index b009af5ff..9e0e8ca93 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php @@ -7,13 +7,12 @@ use Magento\FunctionalTestingFramework\Allure\AllureHelper; use Magento\FunctionalTestingFramework\Allure\Event\AddUniqueAttachmentEvent; +use PHPUnit\Framework\TestCase; use Yandex\Allure\Adapter\Allure; -use Yandex\Allure\Adapter\Event\AddAttachmentEvent; +use Yandex\Allure\Adapter\AllureException; use Yandex\Allure\Adapter\Event\StepFinishedEvent; use Yandex\Allure\Adapter\Event\StepStartedEvent; use Yandex\Allure\Adapter\Model\Attachment; -use AspectMock\Test as AspectMock; -use PHPUnit\Framework\TestCase; class AllureHelperTest extends TestCase { @@ -25,12 +24,11 @@ class AllureHelperTest extends TestCase public function tearDown(): void { Allure::setDefaultLifecycle(); - AspectMock::clean(); } /** - * AddAtachmentToStep should add an attachment to the current step - * @throws \Yandex\Allure\Adapter\AllureException + * AddAttachmentToStep should add an attachment to the current step + * @throws AllureException */ public function testAddAttachmentToStep() { @@ -52,7 +50,7 @@ public function testAddAttachmentToStep() /** * AddAttachmentToLastStep should add an attachment only to the last step - * @throws \Yandex\Allure\Adapter\AllureException + * @throws AllureException */ public function testAddAttachmentToLastStep() { @@ -88,14 +86,15 @@ public function testAddAttachmentToLastStep() /** * AddAttachment actions should have files with different attachment names - * @throws \Yandex\Allure\Adapter\AllureException + * @throws AllureException */ public function testAddAttachementUniqueName() { - $this->mockCopyFile(); $expectedData = "string"; $expectedCaption = "caption"; + $this->mockCopyFile($expectedData, $expectedCaption); + //Prepare Allure lifecycle Allure::lifecycle()->fire(new StepStartedEvent('firstStep')); @@ -112,23 +111,26 @@ public function testAddAttachementUniqueName() /** * Mock entire attachment writing mechanisms - * @throws \Exception */ public function mockAttachmentWriteEvent() { - AspectMock::double(AddUniqueAttachmentEvent::class, [ - "getAttachmentFileName" => self::MOCK_FILENAME - ]); + $this->createMock(AddUniqueAttachmentEvent::class) + ->expects($this->any()) + ->method('getAttachmentFileName') + ->willReturn(self::MOCK_FILENAME); } /** * Mock only file writing mechanism - * @throws \Exception + * @throws \ReflectionException */ - public function mockCopyFile() + public function mockCopyFile(string $expectedData, string $expectedCaption) { - AspectMock::double(AddUniqueAttachmentEvent::class, [ - "copyFile" => true - ]); + $addUniqueAttachmentEvent = new AddUniqueAttachmentEvent($expectedData, $expectedCaption); + $reflection = new \ReflectionClass(AddUniqueAttachmentEvent::class); + $reflectionMethod = $reflection->getMethod('copyFile'); + $reflectionMethod->setAccessible(true); + $output = $reflectionMethod->invoke($addUniqueAttachmentEvent); + $this->assertEquals(true, $output); } } From 3396029a043c714b07653317d0019c98b9284d3e Mon Sep 17 00:00:00 2001 From: silinmykola Date: Mon, 28 Jun 2021 13:20:18 +0300 Subject: [PATCH 003/674] 33292 replace AspectMock from BaseGenerateCommandTest --- .../Console/BaseGenerateCommandTest.php | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php index d2a58c0ff..ce43cde78 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php @@ -5,7 +5,6 @@ */ namespace tests\unit\Magento\FunctionalTestFramework\Console; -use AspectMock\Test as AspectMock; use PHPUnit\Framework\TestCase; use Magento\FunctionalTestingFramework\Console\BaseGenerateCommand; use Magento\FunctionalTestingFramework\Suite\Objects\SuiteObject; @@ -15,11 +14,6 @@ class BaseGenerateCommandTest extends TestCase { - public function tearDown(): void - { - AspectMock::clean(); - } - public function testOneTestOneSuiteConfig() { $testOne = new TestObject('Test1', [], [], []); @@ -182,13 +176,25 @@ public function testSuiteToTestSyntax() */ public function mockHandlers($testArray, $suiteArray) { - AspectMock::double(TestObjectHandler::class, ['initTestData' => ''])->make(); + $testObjectHandler = TestObjectHandler::getInstance(); + $reflection = new \ReflectionClass(TestObjectHandler::class); + $reflectionMethod = $reflection->getMethod('initTestData'); + $reflectionMethod->setAccessible(true); + $output = $reflectionMethod->invoke($testObjectHandler); + $this->assertEquals('', $output); + $handler = TestObjectHandler::getInstance(); $property = new \ReflectionProperty(TestObjectHandler::class, 'tests'); $property->setAccessible(true); $property->setValue($handler, $testArray); - AspectMock::double(SuiteObjectHandler::class, ['initSuiteData' => ''])->make(); + $suiteObjectHandler = SuiteObjectHandler::getInstance(); + $reflection = new \ReflectionClass(SuiteObjectHandler::class); + $reflectionMethod = $reflection->getMethod('initSuiteData'); + $reflectionMethod->setAccessible(true); + $output = $reflectionMethod->invoke($suiteObjectHandler); + $this->assertEquals('', $output); + $handler = SuiteObjectHandler::getInstance(); $property = new \ReflectionProperty(SuiteObjectHandler::class, 'suiteObjects'); $property->setAccessible(true); From e8bbf77f2b1639604560507c7733df21deee904c Mon Sep 17 00:00:00 2001 From: Karyna Date: Thu, 1 Jul 2021 14:04:37 +0300 Subject: [PATCH 004/674] Eliminate AspectMock from FileStorageTest --- .../SecretStorage/FileStorageTest.php | 23 +++++++++++++------ .../Handlers/SecretStorage/FileStorage.php | 19 +++++++++------ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php index 62cb9798e..be97e04ab 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php @@ -3,29 +3,38 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\DataGenerator\Handlers\SecretStorage; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\SecretStorage\FileStorage; +use ReflectionClass; use tests\unit\Util\MagentoTestCase; -use AspectMock\Test as AspectMock; class FileStorageTest extends MagentoTestCase { - /** * Test basic encryption/decryption functionality in FileStorage class. */ - public function testBasicEncryptDecrypt() + public function testBasicEncryptDecrypt(): void { $testKey = 'magento/myKey'; $testValue = 'myValue'; - - AspectMock::double(FileStorage::class, [ - 'readInCredentialsFile' => ["$testKey=$testValue"] - ]); + $creds = ["$testKey=$testValue"]; $fileStorage = new FileStorage(); + $reflection = new ReflectionClass(FileStorage::class); + + // Emulate initialize() function result with the test credentials + $reflectionMethod = $reflection->getMethod('encryptCredFileContents'); + $reflectionMethod->setAccessible(true); + $secretData = $reflectionMethod->invokeArgs($fileStorage, [$creds]); + + // Set encrypted test credentials to the private 'secretData' property + $reflectionProperty = $reflection->getProperty('secretData'); + $reflectionProperty->setAccessible(true); + $reflectionProperty->setValue($fileStorage, $secretData); + $encryptedCred = $fileStorage->getEncryptedValue($testKey); // assert the value we've gotten is in fact not identical to our test value diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php index be77a6de2..62ecfbedc 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php @@ -21,14 +21,17 @@ class FileStorage extends BaseStorage private $secretData = []; /** - * FileStorage constructor + * Initialize secret data value which represents encrypted credentials + * + * @return void * @throws TestFrameworkException */ - public function __construct() + private function initialize(): void { - parent::__construct(); - $creds = $this->readInCredentialsFile(); - $this->secretData = $this->encryptCredFileContents($creds); + if (!$this->secretData) { + $creds = $this->readInCredentialsFile(); + $this->secretData = $this->encryptCredFileContents($creds); + } } /** @@ -36,10 +39,12 @@ public function __construct() * * @param string $key * @return string|null + * @throws TestFrameworkException */ - public function getEncryptedValue($key) + public function getEncryptedValue($key): ?string { - $value = null; + $this->initialize(); + // Check if secret is in cached array if (null !== ($value = parent::getEncryptedValue($key))) { return $value; From 888d7cde0f1e3ab1a7a85a18ce26963918e76cc7 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Sun, 4 Jul 2021 19:01:53 +0300 Subject: [PATCH 005/674] MFTF-33305: Eliminate AspectMock from ObjectExtensionUtilTest --- .../Test/Util/ObjectExtensionUtilTest.php | 153 ++++++++++-------- .../unit/Util/MockModuleResolverBuilder.php | 33 ++-- 2 files changed, 112 insertions(+), 74 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php index 6bf2da577..fc1893e0b 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php @@ -3,32 +3,31 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\Test\Util; -use AspectMock\Proxy\Verifier; -use AspectMock\Test as AspectMock; -use Magento\FunctionalTestingFramework\ObjectManager\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use Exception; +use Magento\FunctionalTestingFramework\ObjectManager; use Magento\FunctionalTestingFramework\Test\Handlers\ActionGroupObjectHandler; use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Test\Parsers\ActionGroupDataParser; use Magento\FunctionalTestingFramework\Test\Parsers\TestDataParser; -use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; -use Monolog\Handler\TestHandler; -use Monolog\Logger; use PHPUnit\Framework\TestCase; +use ReflectionProperty; +use tests\unit\Util\MockModuleResolverBuilder; use tests\unit\Util\TestDataArrayBuilder; use tests\unit\Util\TestLoggingUtil; -use tests\unit\Util\MockModuleResolverBuilder; class ObjectExtensionUtilTest extends TestCase { /** - * Before test functionality + * Before test functionality. + * * @return void + * @throws Exception */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); $resolverMock = new MockModuleResolverBuilder(); @@ -36,7 +35,8 @@ public function setUp(): void } /** - * After class functionality + * After class functionality. + * * @return void */ public static function tearDownAfterClass(): void @@ -45,10 +45,12 @@ public static function tearDownAfterClass(): void } /** - * Tests generating a test that extends another test - * @throws \Exception + * Tests generating a test that extends another test. + * + * @return void + * @throws Exception */ - public function testGenerateExtendedTest() + public function testGenerateExtendedTest(): void { $mockActions = [ "mockStep" => ["nodeName" => "mockNode", "stepKey" => "mockStep"] @@ -86,10 +88,12 @@ public function testGenerateExtendedTest() } /** - * Tests generating a test that extends another test - * @throws \Exception + * Tests generating a test that extends another test. + * + * @return void + * @throws Exception */ - public function testGenerateExtendedWithHooks() + public function testGenerateExtendedWithHooks(): void { $mockBeforeHooks = [ "beforeHookAction" => ["nodeName" => "mockNodeBefore", "stepKey" => "mockStepBefore"] @@ -132,10 +136,12 @@ public function testGenerateExtendedWithHooks() } /** - * Tests generating a test that extends another test - * @throws \Exception + * Tests generating a test that extends another test. + * + * @return void + * @throws Exception */ - public function testExtendedTestNoParent() + public function testExtendedTestNoParent(): void { $testDataArrayBuilder = new TestDataArrayBuilder(); $mockExtendedTest = $testDataArrayBuilder @@ -158,10 +164,12 @@ public function testExtendedTestNoParent() } /** - * Tests generating a test that extends another test - * @throws \Exception + * Tests generating a test that extends another test. + * + * @return void + * @throws Exception */ - public function testExtendingExtendedTest() + public function testExtendingExtendedTest(): void { $testDataArrayBuilder = new TestDataArrayBuilder(); $mockParentTest = $testDataArrayBuilder @@ -200,10 +208,12 @@ public function testExtendingExtendedTest() } /** - * Tests generating an action group that extends another action group - * @throws \Exception + * Tests generating an action group that extends another action group. + * + * @return void + * @throws Exception */ - public function testGenerateExtendedActionGroup() + public function testGenerateExtendedActionGroup(): void { $mockSimpleActionGroup = [ "nodeName" => "actionGroup", @@ -259,10 +269,12 @@ public function testGenerateExtendedActionGroup() } /** - * Tests generating an action group that extends an action group that does not exist - * @throws \Exception + * Tests generating an action group that extends an action group that does not exist. + * + * @return void + * @throws Exception */ - public function testGenerateExtendedActionGroupNoParent() + public function testGenerateExtendedActionGroupNoParent(): void { $mockExtendedActionGroup = [ "nodeName" => "actionGroup", @@ -292,10 +304,12 @@ public function testGenerateExtendedActionGroupNoParent() } /** - * Tests generating an action group that extends another action group that is already extended - * @throws \Exception + * Tests generating an action group that extends another action group that is already extended. + * + * @return void + * @throws Exception */ - public function testExtendingExtendedActionGroup() + public function testExtendingExtendedActionGroup(): void { $mockParentActionGroup = [ "nodeName" => "actionGroup", @@ -333,7 +347,7 @@ public function testExtendingExtendedActionGroup() // parse and generate test object with mocked data try { ActionGroupObjectHandler::getInstance()->getObject('mockExtendedActionGroup'); - } catch (\Exception $e) { + } catch (Exception $e) { // validate log statement TestLoggingUtil::getInstance()->validateMockLogStatement( 'error', @@ -347,11 +361,12 @@ public function testExtendingExtendedActionGroup() } /** - * Tests generating a test that extends a skipped parent test + * Tests generating a test that extends a skipped parent test. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testExtendedTestSkippedParent() + public function testExtendedTestSkippedParent(): void { $testDataArrayBuilder = new TestDataArrayBuilder(); $mockParentTest = $testDataArrayBuilder @@ -384,43 +399,55 @@ public function testExtendedTestSkippedParent() /** * Function used to set mock for parser return and force init method to run between tests. * - * @param array $testData - * @throws \Exception + * @param array|null $testData + * @param array|null $actionGroupData + * + * @return void + * @throws Exception */ - private function setMockTestOutput($testData = null, $actionGroupData = null) + private function setMockTestOutput(array $testData = null, array $actionGroupData = null): void { // clear test object handler value to inject parsed content - $property = new \ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); + $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); $property->setAccessible(true); $property->setValue(null); // clear test object handler value to inject parsed content - $property = new \ReflectionProperty(ActionGroupObjectHandler::class, 'instance'); + $property = new ReflectionProperty(ActionGroupObjectHandler::class, 'instance'); $property->setAccessible(true); $property->setValue(null); - $mockDataParser = AspectMock::double(TestDataParser::class, ['readTestData' => $testData])->make(); - $mockActionGroupParser = AspectMock::double( - ActionGroupDataParser::class, - ['readActionGroupData' => $actionGroupData] - )->make(); - $instance = AspectMock::double( - ObjectManager::class, - [ - 'create' => function ($className) use ( - $mockDataParser, - $mockActionGroupParser - ) { - if ($className == TestDataParser::class) { - return $mockDataParser; - } - if ($className == ActionGroupDataParser::class) { - return $mockActionGroupParser; + $mockDataParser = $this->createMock(TestDataParser::class); + $mockDataParser + ->method('readTestData') + ->willReturn($testData); + + $mockActionGroupParser = $this->createMock(ActionGroupDataParser::class); + $mockActionGroupParser + ->method('readActionGroupData') + ->willReturn($actionGroupData); + + $instance = $this->createMock(ObjectManager::class); + $instance + ->method('create') + ->will( + $this->returnCallback( + function ($className) use ($mockDataParser, $mockActionGroupParser) { + if ($className === TestDataParser::class) { + return $mockDataParser; + } + + if ($className === ActionGroupDataParser::class) { + return $mockActionGroupParser; + } + + return null; } - } - ] - )->make(); - // bypass the private constructor - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); + ) + ); + // clear object manager value to inject expected instance + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue($instance); } } diff --git a/dev/tests/unit/Util/MockModuleResolverBuilder.php b/dev/tests/unit/Util/MockModuleResolverBuilder.php index 0e1b6fc31..8bf30aa00 100644 --- a/dev/tests/unit/Util/MockModuleResolverBuilder.php +++ b/dev/tests/unit/Util/MockModuleResolverBuilder.php @@ -3,31 +3,35 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace tests\unit\Util; use AspectMock\Test as AspectMock; +use Exception; +use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; use Magento\FunctionalTestingFramework\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; use Magento\FunctionalTestingFramework\Util\ModuleResolver; -use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; +use ReflectionProperty; class MockModuleResolverBuilder { /** - * Default paths for mock ModuleResolver + * Default paths for mock ModuleResolver. * * @var array */ private $defaultPaths = ['Magento_Module' => '/base/path/some/other/path/Magento/Module']; /** - * Mock ModuleResolver builder + * Mock ModuleResolver builder. + * + * @param array|null $paths * - * @param array $paths * @return void - * @throws \Exception + * @throws Exception */ - public function setup($paths = null) + public function setup(array $paths = null): void { if (empty($paths)) { $paths = $this->defaultPaths; @@ -35,9 +39,12 @@ public function setup($paths = null) $mockConfig = AspectMock::double(MftfApplicationConfig::class, ['forceGenerateEnabled' => false]); $instance = AspectMock::double(ObjectManager::class, ['create' => $mockConfig->make(), 'get' => null])->make(); - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); + // clear object manager value to inject expected instance + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue($instance); - $property = new \ReflectionProperty(ModuleResolver::class, 'instance'); + $property = new ReflectionProperty(ModuleResolver::class, 'instance'); $property->setAccessible(true); $property->setValue(null); @@ -51,10 +58,14 @@ public function setup($paths = null) ); $instance = AspectMock::double(ObjectManager::class, ['create' => $mockResolver->make(), 'get' => null]) ->make(); - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); + + // clear object manager value to inject expected instance + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue($instance); $resolver = ModuleResolver::getInstance(); - $property = new \ReflectionProperty(ModuleResolver::class, 'enabledModuleNameAndPaths'); + $property = new ReflectionProperty(ModuleResolver::class, 'enabledModuleNameAndPaths'); $property->setAccessible(true); $property->setValue($resolver, $paths); } From a016b291c60b62f064182db72de7ad0519b451ea Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Sun, 4 Jul 2021 20:19:47 +0300 Subject: [PATCH 006/674] MFTF-33301: Eliminated AspectMock usage for TestObjectHandlerTest --- .../Test/Handlers/TestObjectHandlerTest.php | 70 +++++++++++-------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php index 6d259cca2..b5d461db9 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php @@ -3,29 +3,32 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\Test\Handlers; -use AspectMock\Test as AspectMock; - -use Magento\FunctionalTestingFramework\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use Exception; use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Test\Objects\TestHookObject; use Magento\FunctionalTestingFramework\Test\Objects\TestObject; -use Magento\FunctionalTestingFramework\Test\Parsers\TestDataParser; use Magento\FunctionalTestingFramework\Test\Util\TestObjectExtractor; +use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; use tests\unit\Util\MagentoTestCase; +use tests\unit\Util\MockModuleResolverBuilder; use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestDataArrayBuilder; -use tests\unit\Util\MockModuleResolverBuilder; use tests\unit\Util\TestLoggingUtil; -use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; class TestObjectHandlerTest extends MagentoTestCase { - public function setUp(): void + /** + * Before test functionality. + * + * @return void + * @throws Exception + */ + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -33,9 +36,10 @@ public function setUp(): void /** * Basic test to validate array => test object conversion. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testGetTestObject() + public function testGetTestObject(): void { // set up mock data $testDataArrayBuilder = new TestDataArrayBuilder(); @@ -53,7 +57,6 @@ public function testGetTestObject() // run object handler method $toh = TestObjectHandler::getInstance(); - $mockConfig = AspectMock::double(TestObjectHandler::class, ['initTestData' => false]); $actualTestObject = $toh->getObject($testDataArrayBuilder->testName); // perform asserts @@ -114,9 +117,11 @@ public function testGetTestObject() } /** - * Tests basic getting of a test that has a fileName + * Tests basic getting of a test that has a fileName. + * + * @return void */ - public function testGetTestWithFileName() + public function testGetTestWithFileName(): void { $this->markTestIncomplete('TODO'); } @@ -124,9 +129,10 @@ public function testGetTestWithFileName() /** * Tests the function used to get a series of relevant tests by group. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testGetTestsByGroup() + public function testGetTestsByGroup(): void { // set up mock data with Exclude Test $includeTest = (new TestDataArrayBuilder()) @@ -155,11 +161,12 @@ public function testGetTestsByGroup() } /** - * Tests the function used to parse and determine a test's Module (used in allure Features annotation) + * Tests the function used to parse and determine a test's Module (used in allure Features annotation). * - * @throws \Exception + * @return void + * @throws Exception */ - public function testGetTestWithModuleName() + public function testGetTestWithModuleName(): void { // set up Test Data $moduleExpected = "SomeModuleName"; @@ -201,11 +208,12 @@ public function testGetTestWithModuleName() } /** - * getObject should throw exception if test extends from itself + * getObject should throw exception if test extends from itself. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testGetTestObjectWithInvalidExtends() + public function testGetTestObjectWithInvalidExtends(): void { // set up Test Data $testOne = (new TestDataArrayBuilder()) @@ -230,11 +238,12 @@ public function testGetTestObjectWithInvalidExtends() } /** - * getAllObjects should throw exception if test extends from itself + * getAllObjects should throw exception if test extends from itself. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testGetAllTestObjectsWithInvalidExtends() + public function testGetAllTestObjectsWithInvalidExtends(): void { // set up Test Data $testOne = (new TestDataArrayBuilder()) @@ -270,11 +279,12 @@ public function testGetAllTestObjectsWithInvalidExtends() } /** - * Validate test object when ENABLE_PAUSE is set to true + * Validate test object when ENABLE_PAUSE is set to true. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testGetTestObjectWhenEnablePause() + public function testGetTestObjectWhenEnablePause(): void { // set up mock data putenv('ENABLE_PAUSE=true'); @@ -293,7 +303,6 @@ public function testGetTestObjectWhenEnablePause() // run object handler method $toh = TestObjectHandler::getInstance(); - $mockConfig = AspectMock::double(TestObjectHandler::class, ['initTestData' => false]); $actualTestObject = $toh->getObject($testDataArrayBuilder->testName); // perform asserts @@ -363,14 +372,13 @@ public function testGetTestObjectWhenEnablePause() } /** - * After method functionality + * After method functionality. * * @return void */ - public function tearDown(): void + protected function tearDown(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); - AspectMock::clean(); parent::tearDownAfterClass(); } } From e63c603700ac004e2f585218dcca3a6f1a7c21c8 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Sun, 4 Jul 2021 20:42:56 +0300 Subject: [PATCH 007/674] 33300: Eliminated AspectMock usage from SuiteObjectHandlerTest.php --- .../Suite/Handlers/SuiteObjectHandlerTest.php | 79 +++++++++++-------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php index 6f337b05c..f8f8d6b48 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php @@ -3,32 +3,29 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace tests\unit\Magento\FunctionalTestFramework\Suite\Handlers; -use AspectMock\Test as AspectMock; -use Magento\FunctionalTestingFramework\ObjectManager\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use Exception; +use Magento\FunctionalTestingFramework\ObjectManager; use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler; use Magento\FunctionalTestingFramework\Suite\Parsers\SuiteDataParser; use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Test\Parsers\TestDataParser; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\SuiteDataArrayBuilder; use tests\unit\Util\TestDataArrayBuilder; -use tests\unit\Util\MockModuleResolverBuilder; class SuiteObjectHandlerTest extends MagentoTestCase { - public function setUp(): void - { - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup(); - } - /** - * Tests basic parsing and accesors of suite object and suite object supporting classes + * Tests basic parsing and accessors of suite object and suite object supporting classes. + * + * @throws Exception */ - public function testGetSuiteObject() + public function testGetSuiteObject(): void { $suiteDataArrayBuilder = new SuiteDataArrayBuilder(); $mockData = $suiteDataArrayBuilder @@ -82,35 +79,53 @@ public function testGetSuiteObject() * Function used to set mock for parser return and force init method to run between tests. * * @param array $testData - * @throws \Exception + * @param array $suiteData + * + * @throws Exception */ - private function setMockTestAndSuiteParserOutput($testData, $suiteData) + private function setMockTestAndSuiteParserOutput(array $testData, array $suiteData): void { // clear test object handler value to inject parsed content - $property = new \ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); + $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); $property->setAccessible(true); $property->setValue(null); // clear suite object handler value to inject parsed content - $property = new \ReflectionProperty(SuiteObjectHandler::class, 'instance'); + $property = new ReflectionProperty(SuiteObjectHandler::class, 'instance'); $property->setAccessible(true); $property->setValue(null); - $mockDataParser = AspectMock::double(TestDataParser::class, ['readTestData' => $testData])->make(); - $mockSuiteDataParser = AspectMock::double(SuiteDataParser::class, ['readSuiteData' => $suiteData])->make(); - $instance = AspectMock::double( - ObjectManager::class, - ['create' => function ($clazz) use ($mockDataParser, $mockSuiteDataParser) { - if ($clazz == TestDataParser::class) { - return $mockDataParser; - } - - if ($clazz == SuiteDataParser::class) { - return $mockSuiteDataParser; - } - }] - )->make(); - // bypass the private constructor - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); + $mockDataParser = $this->createMock(TestDataParser::class); + $mockDataParser + ->method('readTestData') + ->willReturn($testData); + + $mockSuiteDataParser = $this->createMock(SuiteDataParser::class); + $mockSuiteDataParser + ->method('readSuiteData') + ->willReturn($suiteData); + + $instance = $this->createMock(ObjectManager::class); + $instance + ->method('create') + ->will( + $this->returnCallback( + function ($clazz) use ($mockDataParser, $mockSuiteDataParser) { + if ($clazz == TestDataParser::class) { + return $mockDataParser; + } + + if ($clazz == SuiteDataParser::class) { + return $mockSuiteDataParser; + } + + return null; + } + ) + ); + + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue($instance); } } From a45647689037e269484caa2a0457c03722d8bb18 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Sun, 4 Jul 2021 20:57:21 +0300 Subject: [PATCH 008/674] 33300: Added return type for methods --- .../Suite/Handlers/SuiteObjectHandlerTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php index f8f8d6b48..c672d20b7 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php @@ -23,6 +23,7 @@ class SuiteObjectHandlerTest extends MagentoTestCase /** * Tests basic parsing and accessors of suite object and suite object supporting classes. * + * @return void * @throws Exception */ public function testGetSuiteObject(): void @@ -81,6 +82,7 @@ public function testGetSuiteObject(): void * @param array $testData * @param array $suiteData * + * @return void * @throws Exception */ private function setMockTestAndSuiteParserOutput(array $testData, array $suiteData): void From 55709f004b9e7c2e979b3178e193a487d6aeb8cd Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Sun, 4 Jul 2021 21:25:51 +0300 Subject: [PATCH 009/674] 33307: Removed not used mocked object --- .../Util/GenerationErrorHandlerTest.php | 34 ++++++------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/GenerationErrorHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/GenerationErrorHandlerTest.php index 470d84041..35ffd6d3b 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/GenerationErrorHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/GenerationErrorHandlerTest.php @@ -10,7 +10,6 @@ use ReflectionProperty; use tests\unit\Util\MagentoTestCase; use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; -use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; /** * Class GenerationErrorHandlerTest @@ -20,12 +19,8 @@ class GenerationErrorHandlerTest extends MagentoTestCase /** * Test get errors when all errors are distinct */ - public function testGetDistinctErrors() + public function testGetDistinctErrors():void { - $this->createMock(MftfApplicationConfig::class) - ->method('getPhase') - ->willReturn(MftfApplicationConfig::GENERATION_PHASE); - $expectedAllErrors = [ 'test' => [ 'Sameple1Test' => [ @@ -77,12 +72,8 @@ public function testGetDistinctErrors() /** * Test get errors when some errors have the same key */ - public function testGetErrorsWithSameKey() + public function testGetErrorsWithSameKey(): void { - $this->createMock(MftfApplicationConfig::class) - ->method('getPhase') - ->willReturn(MftfApplicationConfig::GENERATION_PHASE); - $expectedAllErrors = [ 'test' => [ 'Sameple1Test' => [ @@ -160,12 +151,8 @@ public function testGetErrorsWithSameKey() /** * Test get errors when some errors are duplicate */ - public function testGetAllErrorsDuplicate() + public function testGetAllErrorsDuplicate(): void { - $this->createMock(MftfApplicationConfig::class) - ->method('getPhase') - ->willReturn(MftfApplicationConfig::GENERATION_PHASE); - $expectedAllErrors = [ 'test' => [ 'Sameple1Test' => [ @@ -245,9 +232,11 @@ public function testGetAllErrorsDuplicate() * * @param string $expectedErrMessages * @param array $errors + * + * @return void * @dataProvider getAllErrorMessagesDataProvider */ - public function testGetAllErrorMessages($expectedErrMessages, $errors) + public function testGetAllErrorMessages(string $expectedErrMessages, array $errors): void { $handler = GenerationErrorHandler::getInstance(); $handler->reset(); @@ -265,7 +254,7 @@ public function testGetAllErrorMessages($expectedErrMessages, $errors) * * @return array */ - public function getAllErrorMessagesDataProvider() + public function getAllErrorMessagesDataProvider(): array { return [ ['', []], @@ -330,12 +319,8 @@ public function getAllErrorMessagesDataProvider() /** * Test reset */ - public function testResetError() + public function testResetError(): void { - $this->createMock(MftfApplicationConfig::class) - ->method('getPhase') - ->willReturn(MftfApplicationConfig::GENERATION_PHASE); - GenerationErrorHandler::getInstance()->addError('something', 'some', 'error'); GenerationErrorHandler::getInstance()->addError('otherthing', 'other', 'error'); GenerationErrorHandler::getInstance()->reset(); @@ -348,6 +333,9 @@ public function testResetError() $this->assertEquals([], GenerationErrorHandler::getInstance()->getErrorsByType('nothing')); } + /** + * @inheritdoc + */ public function tearDown(): void { $property = new ReflectionProperty(GenerationErrorHandler::class, 'instance'); From 648f8b2b8a9c5fcc81508fa1ebd64b2540f94226 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Sun, 4 Jul 2021 21:34:17 +0300 Subject: [PATCH 010/674] MFTF-33302: Eliminated AspectMock from ActionGroupObjectTest --- .../Test/Objects/ActionGroupObjectTest.php | 131 +++++++++++++----- 1 file changed, 97 insertions(+), 34 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php index 4424989f8..60e97e79c 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php @@ -3,10 +3,10 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\Test\Objects; -use AspectMock\Test as AspectMock; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; use Magento\FunctionalTestingFramework\Page\Handlers\SectionObjectHandler; @@ -15,9 +15,10 @@ use Magento\FunctionalTestingFramework\Test\Objects\ActionGroupObject; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Test\Objects\ArgumentObject; -use tests\unit\Util\MagentoTestCase; +use ReflectionProperty; use tests\unit\Util\ActionGroupObjectBuilder; use tests\unit\Util\EntityDataObjectBuilder; +use tests\unit\Util\MagentoTestCase; use tests\unit\Util\TestLoggingUtil; class ActionGroupObjectTest extends MagentoTestCase @@ -25,18 +26,22 @@ class ActionGroupObjectTest extends MagentoTestCase const ACTION_GROUP_MERGE_KEY = 'TestKey'; /** - * Before test functionality + * Before test functionality. + * * @return void */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } /** - * Tests a string literal in an action group + * Tests a string literal in an action group. + * + * @return void + * @throws TestReferenceException */ - public function testGetStepsWithDefaultCase() + public function testGetStepsWithDefaultCase(): void { $entity = (new EntityDataObjectBuilder()) ->withDataFields(['field1' => 'testValue']) @@ -48,9 +53,12 @@ public function testGetStepsWithDefaultCase() } /** - * Tests a data reference in an action group, replaced by the user + * Tests a data reference in an action group, replaced by the user. + * + * @return void + * @throws TestReferenceException */ - public function testGetStepsWithCustomArgs() + public function testGetStepsWithCustomArgs(): void { $this->setEntityObjectHandlerReturn(function ($entityName) { if ($entityName == "data2") { @@ -87,8 +95,11 @@ public function testGetStepsWithCustomArgs() /** * Tests a data reference in an action group replaced with a persisted reference. + * + * @return void + * @throws TestReferenceException */ - public function testGetStepsWithPersistedArgs() + public function testGetStepsWithPersistedArgs(): void { $actionGroupUnderTest = (new ActionGroupObjectBuilder()) ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1.field2}}'])]) @@ -110,8 +121,11 @@ public function testGetStepsWithPersistedArgs() /** * Tests a data reference in an action group replaced with a data.field reference. + * + * @return void + * @throws TestReferenceException */ - public function testGetStepsWithNoFieldArg() + public function testGetStepsWithNoFieldArg(): void { $this->setEntityObjectHandlerReturn(function ($entityName) { if ($entityName == "data2") { @@ -130,8 +144,11 @@ public function testGetStepsWithNoFieldArg() /** * Tests a data reference in an action group resolved with its default state. + * + * @return void + * @throws TestReferenceException */ - public function testGetStepsWithNoArgs() + public function testGetStepsWithNoArgs(): void { $this->setEntityObjectHandlerReturn(function ($entityName) { if ($entityName == "data1") { @@ -149,8 +166,11 @@ public function testGetStepsWithNoArgs() /** * Tests a parameterized section reference in an action group resolved with user args. + * + * @return void + * @throws TestReferenceException */ - public function testGetStepsWithParameterizedArg() + public function testGetStepsWithParameterizedArg(): void { // Mock Entity Object Handler $this->setEntityObjectHandlerReturn(function ($entityName) { @@ -161,9 +181,14 @@ public function testGetStepsWithParameterizedArg() // mock the section object handler response $element = new ElementObject("element1", "textArea", ".selector {{var1}}", null, null, true); $section = new SectionObject("testSection", ["element1" => $element]); + $sectionInstance = $this->createMock(SectionObjectHandler::class); + $sectionInstance + ->method('getObject') + ->willReturn($section); // bypass the private constructor - $sectionInstance = AspectMock::double(SectionObjectHandler::class, ['getObject' => $section])->make(); - AspectMock::double(SectionObjectHandler::class, ['getInstance' => $sectionInstance]); + $property = new ReflectionProperty(SectionObjectHandler::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($sectionInstance); $actionGroupUnderTest = (new ActionGroupObjectBuilder()) ->withActionObjects( @@ -183,8 +208,11 @@ public function testGetStepsWithParameterizedArg() /** * Tests a parameterized section reference in an action group resolved with user simpleArgs. + * + * @return void + * @throws TestReferenceException */ - public function testGetStepsWithParameterizedSimpleArg() + public function testGetStepsWithParameterizedSimpleArg(): void { // Mock Entity Object Handler $this->setEntityObjectHandlerReturn(function ($entityName) { @@ -195,9 +223,15 @@ public function testGetStepsWithParameterizedSimpleArg() // mock the section object handler response $element = new ElementObject("element1", "textArea", ".selector {{var1}}", null, null, true); $section = new SectionObject("testSection", ["element1" => $element]); + + $sectionInstance = $this->createMock(SectionObjectHandler::class); + $sectionInstance + ->method('getObject') + ->willReturn($section); // bypass the private constructor - $sectionInstance = AspectMock::double(SectionObjectHandler::class, ['getObject' => $section])->make(); - AspectMock::double(SectionObjectHandler::class, ['getInstance' => $sectionInstance]); + $property = new ReflectionProperty(SectionObjectHandler::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($sectionInstance); $actionGroupUnderTest = (new ActionGroupObjectBuilder()) ->withActionObjects( @@ -221,8 +255,11 @@ public function testGetStepsWithParameterizedSimpleArg() /** * Tests a data reference in an action group resolved with a persisted reference used in another function. + * + * @return void + * @throws TestReferenceException */ - public function testGetStepsWithOuterScopePersistence() + public function testGetStepsWithOuterScopePersistence(): void { $actionGroupUnderTest = (new ActionGroupObjectBuilder()) ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1.field1}}'])]) @@ -235,8 +272,10 @@ public function testGetStepsWithOuterScopePersistence() /** * Tests an action group with mismatching args. + * + * @return void */ - public function testExceptionOnMissingActions() + public function testExceptionOnMissingActions(): void { $actionGroupUnderTest = (new ActionGroupObjectBuilder()) ->withArguments([new ArgumentObject('arg1', null, 'entity')]) @@ -249,8 +288,10 @@ public function testExceptionOnMissingActions() /** * Tests an action group with missing args. + * + * @return void */ - public function testExceptionOnMissingArguments() + public function testExceptionOnMissingArguments(): void { $actionGroupUnderTest = (new ActionGroupObjectBuilder()) ->withArguments([new ArgumentObject('arg1', null, 'entity')]) @@ -262,10 +303,12 @@ public function testExceptionOnMissingArguments() } /** - * Tests the stepKey replacement with "stepKey + invocationKey" process filter - * Specific to actions that make it past a "require stepKey replacement" filter + * Tests the stepKey replacement with "stepKey + invocationKey" process filter. + * Specific to actions that make it past a "require stepKey replacement" filter. + * + * @return void */ - public function testStepKeyReplacementFilteredIn() + public function testStepKeyReplacementFilteredIn(): void { $createStepKey = "createDataStepKey"; $updateStepKey = "updateDataStepKey"; @@ -293,10 +336,12 @@ public function testStepKeyReplacementFilteredIn() } /** - * Tests the stepKey replacement with "stepKey + invocationKey" process filter - * Specific to actions that make are removed by a "require stepKey replacement" filter + * Tests the stepKey replacement with "stepKey + invocationKey" process filter. + * Specific to actions that make are removed by a "require stepKey replacement" filter. + * + * @return void */ - public function testStepKeyReplacementFilteredOut() + public function testStepKeyReplacementFilteredOut(): void { $clickStepKey = "clickStepKey"; $fillFieldStepKey = "fillFieldStepKey"; @@ -322,13 +367,26 @@ public function testStepKeyReplacementFilteredOut() * duration of a single test case. * * @param mixed $return + * * @return void */ - private function setEntityObjectHandlerReturn($return) + private function setEntityObjectHandlerReturn($return): void { - $instance = AspectMock::double(DataObjectHandler::class, ['getObject' => $return]) - ->make(); // bypass the private constructor - AspectMock::double(DataObjectHandler::class, ['getInstance' => $instance]); + $instance = $this->createMock(DataObjectHandler::class); + + if (is_callable($return)) { + $instance + ->method('getObject') + ->will($this->returnCallback($return)); + } else { + $instance + ->method('getObject') + ->willReturn($return); + } + // bypass the private constructor + $property = new ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($instance); } /** @@ -337,11 +395,15 @@ private function setEntityObjectHandlerReturn($return) * * @param array $actions * @param array $expectedValue - * @param string $expectedMergeKey + * @param string|null $expectedMergeKey + * * @return void */ - private function assertOnMergeKeyAndActionValue($actions, $expectedValue, $expectedMergeKey = null) - { + private function assertOnMergeKeyAndActionValue( + array $actions, + array $expectedValue, + ?string $expectedMergeKey = null + ): void { $expectedMergeKey = $expectedMergeKey ?? ActionGroupObjectBuilder::DEFAULT_ACTION_OBJECT_NAME . self::ACTION_GROUP_MERGE_KEY; $this->assertArrayHasKey($expectedMergeKey, $actions); @@ -352,7 +414,8 @@ private function assertOnMergeKeyAndActionValue($actions, $expectedValue, $expec } /** - * After class functionality + * After class functionality. + * * @return void */ public static function tearDownAfterClass(): void From 6b12ed005adffb750d4a0fd74366769f75b13e53 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Mon, 5 Jul 2021 11:24:47 +0300 Subject: [PATCH 011/674] MFTF-33303: Eliminated AspectMock usage from ActionObjectTest --- .../Test/Objects/ActionObjectTest.php | 210 +++++++++++++----- 1 file changed, 154 insertions(+), 56 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php index 8bf71d542..f3c75a073 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php @@ -3,21 +3,24 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\Test\Objects; -use AspectMock\Test as AspectMock; +use Exception; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject; +use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; +use Magento\FunctionalTestingFramework\Exceptions\XmlException; use Magento\FunctionalTestingFramework\Page\Handlers\PageObjectHandler; +use Magento\FunctionalTestingFramework\Page\Handlers\SectionObjectHandler; use Magento\FunctionalTestingFramework\Page\Objects\ElementObject; use Magento\FunctionalTestingFramework\Page\Objects\PageObject; -use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; -use Magento\FunctionalTestingFramework\Page\Handlers\SectionObjectHandler; use Magento\FunctionalTestingFramework\Page\Objects\SectionObject; -use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; -use tests\unit\Util\TestLoggingUtil; +use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; +use tests\unit\Util\TestLoggingUtil; /** * Class ActionObjectTest @@ -25,36 +28,45 @@ class ActionObjectTest extends MagentoTestCase { /** - * Before test functionality + * Before test functionality. + * * @return void */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } /** - * The order offset should be 0 when the action is instantiated with 'before' + * The order offset should be 0 when the action is instantiated with 'before'. + * + * @return void */ - public function testConstructOrderBefore() + public function testConstructOrderBefore(): void { $actionObject = new ActionObject('stepKey', 'type', [], null, 'before'); $this->assertEquals(0, $actionObject->getOrderOffset()); } /** - * The order offset should be 1 when the action is instantiated with 'after' + * The order offset should be 1 when the action is instantiated with 'after'. + * + * @return void */ - public function testConstructOrderAfter() + public function testConstructOrderAfter(): void { $actionObject = new ActionObject('stepKey', 'type', [], null, 'after'); $this->assertEquals(1, $actionObject->getOrderOffset()); } /** - * {{Section.element}} should be replaced with #theElementSelector + * {{Section.element}} should be replaced with #theElementSelector. + * + * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testResolveElementInSelector() + public function testResolveElementInSelector(): void { // Set up mocks $actionObject = new ActionObject('merge123', 'fillField', [ @@ -76,9 +88,13 @@ public function testResolveElementInSelector() } /** - * {{Section.element(param)}} should replace correctly with 'stringLiterals' + * {{Section.element(param)}} should replace correctly with 'stringLiterals'. + * + * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testResolveSelectorWithOneStringLiteral() + public function testResolveSelectorWithOneStringLiteral(): void { $actionObject = new ActionObject('key123', 'fillField', [ 'selector' => "{{SectionObject.elementObject('stringliteral')}}", @@ -99,9 +115,13 @@ public function testResolveSelectorWithOneStringLiteral() } /** - * {{Section.element(param)}} should replace correctly with {{data.key}} references + * {{Section.element(param)}} should replace correctly with {{data.key}} references. + * + * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testResolveSelectorWithOneDataReference() + public function testResolveSelectorWithOneDataReference(): void { $actionObject = new ActionObject('key123', 'fillField', [ 'selector' => "{{SectionObject.elementObject(dataObject.key)}}", @@ -128,9 +148,13 @@ public function testResolveSelectorWithOneDataReference() } /** - * {{Section.element(param)}} should replace correctly with $data.key$ references + * {{Section.element(param)}} should replace correctly with $data.key$ references. + * + * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testResolveSelectorWithOnePersistedReference() + public function testResolveSelectorWithOnePersistedReference(): void { $actionObject = new ActionObject('key123', 'fillField', [ 'selector' => '{{SectionObject.elementObject($data.key$)}}', @@ -154,8 +178,12 @@ public function testResolveSelectorWithOnePersistedReference() /** * {{Section.element(param1,param2,param3)}} should replace correctly with all 3 data types. + * + * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testResolveSelectorWithManyParams() + public function testResolveSelectorWithManyParams(): void { $actionObject = new ActionObject('key123', 'fillField', [ 'selector' => "{{SectionObject.elementObject('stringLiteral', data.key, \$data.key\$)}}", @@ -182,9 +210,13 @@ public function testResolveSelectorWithManyParams() } /** - * Timeout property on the ActionObject should be set if the ElementObject has a timeout + * Timeout property on the ActionObject should be set if the ElementObject has a timeout. + * + * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testTimeoutFromElement() + public function testTimeoutFromElement(): void { // Set up mocks $actionObject = new ActionObject('merge123', 'click', [ @@ -201,20 +233,27 @@ public function testTimeoutFromElement() } /** - * {{PageObject.url}} should be replaced with someUrl.html + * {{PageObject.url}} should be replaced with someUrl.html. * - * @throws /Exception + * @return void + * @throws Exception */ - public function testResolveUrl() + public function testResolveUrl(): void { // Set up mocks $actionObject = new ActionObject('merge123', 'amOnPage', [ 'url' => '{{PageObject.url}}' ]); $pageObject = new PageObject('PageObject', '/replacement/url.html', 'Test', [], false, "test"); - $instance = AspectMock::double(PageObjectHandler::class, ['getObject' => $pageObject]) - ->make(); // bypass the private constructor - AspectMock::double(PageObjectHandler::class, ['getInstance' => $instance]); + + $instance = $this->createMock(PageObjectHandler::class); + $instance + ->method('getObject') + ->willReturn($pageObject); + // bypass the private constructor + $property = new ReflectionProperty(PageObjectHandler::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($instance); // Call the method under test $actionObject->resolveReferences(); @@ -227,11 +266,12 @@ public function testResolveUrl() } /** - * {{PageObject}} should not be replaced and should elicit a warning in console + * {{PageObject}} should not be replaced and should elicit a warning in console. * - * @throws /Exception + * @return void + * @throws Exception */ - public function testResolveUrlWithNoAttribute() + public function testResolveUrlWithNoAttribute(): void { $this->expectException(TestReferenceException::class); @@ -241,36 +281,51 @@ public function testResolveUrlWithNoAttribute() ]); $pageObject = new PageObject('PageObject', '/replacement/url.html', 'Test', [], false, "test"); $pageObjectList = ["PageObject" => $pageObject]; - $instance = AspectMock::double( - PageObjectHandler::class, - ['getObject' => $pageObject, 'getAllObjects' => $pageObjectList] - )->make(); // bypass the private constructor - AspectMock::double(PageObjectHandler::class, ['getInstance' => $instance]); + + $instance = $this->createMock(PageObjectHandler::class); + $instance + ->method('getObject') + ->willReturn($pageObject); + $instance + ->method('getAllObjects') + ->willReturn($pageObjectList); + // bypass the private constructor + $property = new ReflectionProperty(PageObjectHandler::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($instance); // Call the method under test $actionObject->resolveReferences(); } /** - * {{PageObject.url(param)}} should be replaced + * {{PageObject.url(param)}} should be replaced. + * + * @return void */ - public function testResolveUrlWithOneParam() + public function testResolveUrlWithOneParam(): void { $this->markTestIncomplete('TODO'); } /** - * {{PageObject.url(param1,param2,param3)}} should be replaced + * {{PageObject.url(param1,param2,param3)}} should be replaced. + * + * @return void */ - public function testResolveUrlWithManyParams() + public function testResolveUrlWithManyParams(): void { $this->markTestIncomplete('TODO'); } /** - * {{EntityDataObject.key}} should be replaced with someDataValue + * {{EntityDataObject.key}} should be replaced with someDataValue. + * + * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testResolveDataInUserInput() + public function testResolveDataInUserInput(): void { // Set up mocks $actionObject = new ActionObject('merge123', 'fillField', [ @@ -294,9 +349,13 @@ public function testResolveDataInUserInput() } /** - * {{EntityDataObject.values}} should be replaced with ["value1","value2"] + * {{EntityDataObject.values}} should be replaced with ["value1","value2"]. + * + * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testResolveArrayData() + public function testResolveArrayData(): void { // Set up mocks $actionObject = new ActionObject('merge123', 'fillField', [ @@ -325,8 +384,12 @@ public function testResolveArrayData() /** * Action object should throw an exception if a reference to a parameterized selector has too few given args. + * + * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testTooFewArgumentException() + public function testTooFewArgumentException(): void { $this->expectException(TestReferenceException::class); @@ -343,8 +406,12 @@ public function testTooFewArgumentException() /** * Action object should throw an exception if a reference to a parameterized selector has too many given args. + * + * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testTooManyArgumentException() + public function testTooManyArgumentException(): void { $this->expectException(TestReferenceException::class); @@ -361,8 +428,12 @@ public function testTooManyArgumentException() /** * Action object should throw an exception if the timezone provided is not valid. + * + * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testInvalidTimezoneException() + public function testInvalidTimezoneException(): void { $this->expectException(TestReferenceException::class); @@ -374,23 +445,50 @@ public function testInvalidTimezoneException() $actionObject->resolveReferences(); } - private function mockSectionHandlerWithElement($elementObject) + /** + * Mock section handler with the specified ElementObject. + * + * @param ElementObject $elementObject + * + * @return void + * @throws Exception + */ + private function mockSectionHandlerWithElement(ElementObject $elementObject): void { $sectionObject = new SectionObject('SectionObject', ['elementObject' => $elementObject]); - $instance = AspectMock::double(SectionObjectHandler::class, ['getObject' => $sectionObject]) - ->make(); // bypass the private constructor - AspectMock::double(SectionObjectHandler::class, ['getInstance' => $instance]); + $instance = $this->createMock(SectionObjectHandler::class); + $instance + ->method('getObject') + ->willReturn($sectionObject); + // bypass the private constructor + $property = new ReflectionProperty(SectionObjectHandler::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($instance); } - private function mockDataHandlerWithData($dataObject) + /** + * Mock data handler with the specified EntityDataObject. + * + * @param EntityDataObject $dataObject + * + * @return void + * @throws Exception + */ + private function mockDataHandlerWithData(EntityDataObject $dataObject): void { - $dataInstance = AspectMock::double(DataObjectHandler::class, ['getObject' => $dataObject]) - ->make(); - AspectMock::double(DataObjectHandler::class, ['getInstance' => $dataInstance]); + $dataInstance = $this->createMock(DataObjectHandler::class); + $dataInstance + ->method('getObject') + ->willReturn($dataObject); + // bypass the private constructor + $property = new ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($dataInstance); } /** - * After class functionality + * After class functionality. + * * @return void */ public static function tearDownAfterClass(): void From 73b6a91c20a9a67593e5be04083cd6348ba9d6a2 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Mon, 5 Jul 2021 11:38:29 +0300 Subject: [PATCH 012/674] MFTF-33303: Clearing AspectMock mocking before each test --- dev/tests/unit/Util/MagentoTestCase.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dev/tests/unit/Util/MagentoTestCase.php b/dev/tests/unit/Util/MagentoTestCase.php index 7760acfc6..bb38a0b5c 100644 --- a/dev/tests/unit/Util/MagentoTestCase.php +++ b/dev/tests/unit/Util/MagentoTestCase.php @@ -19,6 +19,8 @@ public static function setUpBeforeClass(): void if (!self::fileExists(DOCS_OUTPUT_DIR)) { mkdir(DOCS_OUTPUT_DIR, 0755, true); } + // Should be used to clean AspectMock mocking before using PHPUnit mocking and Reflection. + AspectMock::clean(); parent::setUpBeforeClass(); } From ef4f9ea708446c2baff77304df1a0549b1ccaedf Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Mon, 5 Jul 2021 11:41:38 +0300 Subject: [PATCH 013/674] MFTF-33305: Clearing AspectMock mocking before each test --- dev/tests/unit/Util/MagentoTestCase.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dev/tests/unit/Util/MagentoTestCase.php b/dev/tests/unit/Util/MagentoTestCase.php index 7760acfc6..c34236fc1 100644 --- a/dev/tests/unit/Util/MagentoTestCase.php +++ b/dev/tests/unit/Util/MagentoTestCase.php @@ -19,6 +19,9 @@ public static function setUpBeforeClass(): void if (!self::fileExists(DOCS_OUTPUT_DIR)) { mkdir(DOCS_OUTPUT_DIR, 0755, true); } + // Should be used to clean AspectMock mocking before using PHPUnit mocking and Reflection. + AspectMock::clean(); + parent::setUpBeforeClass(); parent::setUpBeforeClass(); } From 172a1efc1b3e0c911be11c25c438f5f46c26c476 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Tue, 6 Jul 2021 12:05:40 +0300 Subject: [PATCH 014/674] 33309: Eliminated AspectMock usage from TestGeneratorTest.php --- .../Util/TestGeneratorTest.php | 86 +++++++++++-------- .../Util/Filesystem/CestFileCreatorUtil.php | 66 ++++++++++++++ .../Util/TestGenerator.php | 13 +-- 3 files changed, 121 insertions(+), 44 deletions(-) create mode 100644 src/Magento/FunctionalTestingFramework/Util/Filesystem/CestFileCreatorUtil.php diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 8817d89c7..3bc06de59 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -3,16 +3,18 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\Util; -use AspectMock\Test as AspectMock; - +use Exception; +use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; use Magento\FunctionalTestingFramework\Filter\FilterList; -use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Test\Objects\TestHookObject; use Magento\FunctionalTestingFramework\Test\Objects\TestObject; +use Magento\FunctionalTestingFramework\Util\Filesystem\CestFileCreatorUtil; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; use Magento\FunctionalTestingFramework\Util\TestGenerator; use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; @@ -22,7 +24,7 @@ class TestGeneratorTest extends MagentoTestCase { /** - * Before method functionality + * Before method functionality. */ public function setUp(): void { @@ -30,35 +32,29 @@ public function setUp(): void } /** - * After method functionality + * After method functionality. * * @return void */ public function tearDown(): void { - AspectMock::clean(); GenerationErrorHandler::getInstance()->reset(); } /** * Basic test to check exceptions for incorrect entities. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testEntityException() + public function testEntityException(): void { $actionObject = new ActionObject('fakeAction', 'comment', [ 'userInput' => '{{someEntity.entity}}' ]); $testObject = new TestObject("sampleTest", ["merge123" => $actionObject], [], [], "filename"); - - AspectMock::double(TestObjectHandler::class, ['initTestData' => '']); - $testGeneratorObject = TestGenerator::getInstance("", ["sampleTest" => $testObject]); - - AspectMock::double(TestGenerator::class, ['loadAllTestObjects' => ["sampleTest" => $testObject]]); - $testGeneratorObject->createAllTestFiles(null, []); // assert that no exception for createAllTestFiles and generation error is stored in GenerationErrorHandler @@ -69,11 +65,12 @@ public function testEntityException() } /** - * Tests that skipped tests do not have a fully generated body + * Tests that skipped tests do not have a fully generated body. * - * @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException + * @return void + * @throws TestReferenceException */ - public function testSkippedNoGeneration() + public function testSkippedNoGeneration(): void { $actionInput = 'fakeInput'; $actionObject = new ActionObject('fakeAction', 'comment', [ @@ -91,14 +88,22 @@ public function testSkippedNoGeneration() } /** - * Tests that skipped tests have a fully generated body when --allowSkipped is passed in + * Tests that skipped tests have a fully generated body when --allowSkipped is passed in. * - * @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException + * @return void + * @throws TestReferenceException */ - public function testAllowSkipped() + public function testAllowSkipped(): void { // Mock allowSkipped for TestGenerator - AspectMock::double(MftfApplicationConfig::class, ['allowSkipped' => true]); + $mockConfig = $this->createMock(MftfApplicationConfig::class); + $mockConfig->expects($this->any()) + ->method('allowSkipped') + ->willReturn(true); + + $property = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); + $property->setAccessible(true); + $property->setValue($mockConfig); $actionInput = 'fakeInput'; $actionObject = new ActionObject('fakeAction', 'comment', [ @@ -128,17 +133,20 @@ public function testAllowSkipped() } /** - * Tests that TestGenerator createAllTestFiles correctly filters based on severity + * Tests that TestGenerator createAllTestFiles correctly filters based on severity. * - * @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException + * @return void + * @throws TestReferenceException */ - public function testFilter() + public function testFilter(): void { - // Mock filters for TestGenerator - AspectMock::double( - MftfApplicationConfig::class, - ['getFilterList' => new FilterList(['severity' => ["CRITICAL"]])] - ); + $mockConfig = $this->createMock(MftfApplicationConfig::class); + $fileList = new FilterList(['severity' => ["CRITICAL"]]); + $mockConfig->expects($this->once())->method('getFilterList')->willReturn($fileList); + + $property = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); + $property->setAccessible(true); + $property->setValue($mockConfig); $actionInput = 'fakeInput'; $actionObject = new ActionObject('fakeAction', 'comment', [ @@ -161,16 +169,26 @@ public function testFilter() [], "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; - }]); + $cestFileCreatorUtil = $this->createMock(CestFileCreatorUtil::class); + $cestFileCreatorUtil->expects($this->once()) + ->method('create') + ->will( + $this->returnCallback( + function ($filename) use (&$generatedTests) { + $generatedTests[$filename] = true; + } + ) + ); + + $property = new ReflectionProperty(CestFileCreatorUtil::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($cestFileCreatorUtil); $testGeneratorObject = TestGenerator::getInstance("", ["sampleTest" => $test1, "test2" => $test2]); - $testGeneratorObject->createAllTestFiles(null, []); + $testGeneratorObject->createAllTestFiles(); // Ensure Test1 was Generated but not Test 2 $this->assertArrayHasKey('test1Cest', $generatedTests); diff --git a/src/Magento/FunctionalTestingFramework/Util/Filesystem/CestFileCreatorUtil.php b/src/Magento/FunctionalTestingFramework/Util/Filesystem/CestFileCreatorUtil.php new file mode 100644 index 000000000..a1c408359 --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/Util/Filesystem/CestFileCreatorUtil.php @@ -0,0 +1,66 @@ +exportDirectory); - $exportFilePath = $this->exportDirectory . DIRECTORY_SEPARATOR . $filename . ".php"; - $file = fopen($exportFilePath, 'w'); - - if (!$file) { - throw new TestFrameworkException(sprintf('Could not open test file: "%s"', $exportFilePath)); - } - - fwrite($file, $testPhp); - fclose($file); + CestFileCreatorUtil::getInstance()->create($filename, $this->exportDirectory, $testPhp); } /** From ea1b727d52373f0b514cea3c352e4119127c4d88 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Tue, 6 Jul 2021 12:17:45 +0300 Subject: [PATCH 015/674] 33309: Fixed static-tests --- .../Util/Filesystem/CestFileCreatorUtil.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Filesystem/CestFileCreatorUtil.php b/src/Magento/FunctionalTestingFramework/Util/Filesystem/CestFileCreatorUtil.php index a1c408359..b3c896ccb 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Filesystem/CestFileCreatorUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Filesystem/CestFileCreatorUtil.php @@ -21,7 +21,9 @@ class CestFileCreatorUtil /** * CestFileCreatorUtil constructor. */ - private function __construct(){} + private function __construct() + { + } /** * Get CestFileCreatorUtil instance. @@ -41,9 +43,9 @@ public static function getInstance() * Create a single PHP file containing the $cestPhp using the $filename. * If the _generated directory doesn't exist it will be created. * + * @param string $filename * @param string $exportDirectory * @param string $testPhp - * @param string $filename * * @return void * @throws TestFrameworkException From d2182190782879c8c0322e24a10893322859f039 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Wed, 7 Jul 2021 17:57:37 +0300 Subject: [PATCH 016/674] 33308: Eliminated AspectMock usage from ModuleResolverTest.php --- .../Util/ModuleResolverTest.php | 1024 ++++++----------- .../Util/ModuleResolver.php | 186 +-- .../ModuleResolver/ModuleResolverService.php | 322 ++++++ 3 files changed, 682 insertions(+), 850 deletions(-) create mode 100644 src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php index f43f82fe2..286044d8a 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php @@ -3,36 +3,35 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\Util; -use AspectMock\Proxy\Verifier; -use AspectMock\Test as AspectMock; - +use Exception; use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; use Magento\FunctionalTestingFramework\Exceptions\FastFailException; -use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; -use Magento\FunctionalTestingFramework\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; -use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; +use Magento\FunctionalTestingFramework\Util\ModuleResolver\ModuleResolverService; use Magento\FunctionalTestingFramework\Util\ModuleResolver; +use PHPUnit\Framework\MockObject\MockObject; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; -use PHPUnit\Runner\Exception; use tests\unit\Util\TestLoggingUtil; class ModuleResolverTest extends MagentoTestCase { /** - * Before test functionality + * Before test functionality. + * * @return void */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } /** - * After class functionality + * After class functionality. + * * @return void */ public static function tearDownAfterClass(): void @@ -41,43 +40,47 @@ public static function tearDownAfterClass(): void } /** - * Validate that Paths that are already set are returned - * @throws \Exception + * Validate that Paths that are already set are returned. + * + * @return void + * @throws Exception */ - public function testGetModulePathsAlreadySet() + public function testGetModulePathsAlreadySet(): void { - $this->setMockResolverClass(); $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties($resolver, ["example" . DIRECTORY_SEPARATOR . "paths"]); $this->assertEquals(["example" . DIRECTORY_SEPARATOR . "paths"], $resolver->getModulesPath()); } /** - * Validate paths are aggregated correctly - * @throws \Exception + * Validate paths are aggregated correctly. + * + * @return void + * @throws Exception */ - public function testGetModulePathsAggregate() + public function testGetModulePathsAggregate(): void { $this->mockForceGenerate(false); - $this->setMockResolverClass( - false, - null, - null, - null, - [ - 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example' => ['example'], - 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample' => ['sample'], - ], - null, - [ - 'Magento_example' => 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example', - 'Magento_sample' => 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample', - ], - null, - null, - [], - [] - ); + + $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService->expects($this->any()) + ->method('getRegisteredModuleList') + ->willReturn( + [ + 'Magento_example' => 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example', + 'Magento_sample' => 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample', + ] + ); + $moduleResolverService->expects($this->any()) + ->method('aggregateTestModulePaths') + ->willReturn( + [ + 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example' => ['example'], + 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample' => ['sample'], + ] + ); + + $this->setMockResolverCreatorProperties($moduleResolverService); $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties($resolver, null, [0 => 'Magento_example', 1 => 'Magento_sample']); $this->assertEquals( @@ -90,141 +93,34 @@ public function testGetModulePathsAggregate() } /** - * Validate aggregateTestModulePaths() when module path part of DEV_TESTS - * - * @throws \Exception - */ - public function testAggregateTestModulePathsDevTests() - { - $origin = TESTS_MODULE_PATH; - $modulePath = ModuleResolver::DEV_TESTS . DIRECTORY_SEPARATOR . "Magento"; - putenv("TESTS_MODULE_PATH=$modulePath"); - - $this->mockForceGenerate(false); - $mockResolver = $this->setMockResolverClass( - true, - [], - null, - null, - [], - [], - [], - null, - null, - [], - [], - null, - function ($arg) { - return $arg; - }, - function ($arg) { - return $arg; - } - ); - $resolver = ModuleResolver::getInstance(); - $this->setMockResolverProperties($resolver, null, null); - $this->assertEquals( - [], - $resolver->getModulesPath() - ); - - $mockResolver->verifyNeverInvoked('globRelevantPaths', [$modulePath, '']); - - putenv("TESTS_MODULE_PATH=$origin"); - } - - /** - * Validate correct path locations are fed into globRelevantPaths - * @throws \Exception - */ - public function testGetModulePathsLocations() - { - // clear test object handler value to inject parsed content - $property = new \ReflectionProperty(ModuleResolver::class, 'instance'); - $property->setAccessible(true); - $property->setValue(null); - - $this->mockForceGenerate(false); - $mockResolver = $this->setMockResolverClass( - true, - [], - null, - null, - [], - [], - [], - null, - null, - [], - [], - null, - function ($arg) { - return $arg; - }, - function ($arg) { - return $arg; - } - ); - $resolver = ModuleResolver::getInstance(); - $this->setMockResolverProperties($resolver, null, null); - $this->assertEquals( - [], - $resolver->getModulesPath() - ); - - // Define the Module paths from app/code - $magentoBaseCodePath = MAGENTO_BP; - - // Define the Module paths from default TESTS_MODULE_PATH - $modulePath = defined('TESTS_MODULE_PATH') ? TESTS_MODULE_PATH : TESTS_BP; - - $mockResolver->verifyInvoked('globRelevantPaths', [$modulePath, '']); - $mockResolver->verifyInvoked( - 'globRelevantPaths', - [$magentoBaseCodePath . DIRECTORY_SEPARATOR . "vendor" , 'Test' . DIRECTORY_SEPARATOR .'Mftf'] - ); - $mockResolver->verifyInvoked( - 'globRelevantPaths', - [ - $magentoBaseCodePath . DIRECTORY_SEPARATOR . "app" . DIRECTORY_SEPARATOR . "code", - 'Test' . DIRECTORY_SEPARATOR .'Mftf' - ] - ); - } - - /** - * Validate aggregateTestModulePathsFromComposerJson + * Validate aggregateTestModulePathsFromComposerJson. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testAggregateTestModulePathsFromComposerJson() + public function testAggregateTestModulePathsFromComposerJson(): void { $this->mockForceGenerate(false); - $this->setMockResolverClass( - false, - null, // getEnabledModules - null, // applyCustomMethods - null, // globRelevantWrapper - [], // relevantPath - null, // getCustomModulePaths - null, // getRegisteredModuleList - null, // aggregateTestModulePathsFromComposerJson - [], // aggregateTestModulePathsFromComposerInstaller - [ - 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathA' => - [ - 'Magento_ModuleA', - 'Magento_ModuleB' - ], - 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathB' => - [ - 'Magento_ModuleB', - 'Magento_ModuleC' - ], - ], // getComposerJsonTestModulePaths - [] // getComposerInstalledTestModulePaths - ); + $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService->expects($this->any()) + ->method('getComposerJsonTestModulePaths') + ->willReturn( + [ + 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathA' => + [ + 'Magento_ModuleA', + 'Magento_ModuleB' + ], + 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathB' => + [ + 'Magento_ModuleB', + 'Magento_ModuleC' + ], + ] + ); + + $this->setMockResolverCreatorProperties($moduleResolverService); $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties($resolver, null, [0 => 'Magento_ModuleB', 1 => 'Magento_ModuleC']); $this->assertEquals( @@ -236,90 +132,33 @@ public function testAggregateTestModulePathsFromComposerJson() } /** - * Validate getComposerJsonTestModulePaths with paths invocation - * - * @throws \Exception - */ - public function testGetComposerJsonTestModulePathsForPathInvocation() - { - $this->mockForceGenerate(false); - $mockResolver = $this->setMockResolverClass( - false, - [], - null, - null, - [], - null, - null, - null, - null, - [], - [] - ); - - $resolver = ModuleResolver::getInstance(); - $this->setMockResolverProperties($resolver, null, null); - $this->assertEquals( - [], - $resolver->getModulesPath() - ); - - // Expected dev tests path - $expectedSearchPaths[] = MAGENTO_BP - . DIRECTORY_SEPARATOR - . 'dev' - . DIRECTORY_SEPARATOR - . 'tests' - . DIRECTORY_SEPARATOR - . 'acceptance' - . DIRECTORY_SEPARATOR - . 'tests' - . DIRECTORY_SEPARATOR - . 'functional'; - - // Expected test module path - $testModulePath = defined('TESTS_MODULE_PATH') ? TESTS_MODULE_PATH : TESTS_BP; - - if (array_search($testModulePath, $expectedSearchPaths) === false) { - $expectedSearchPaths[] = $testModulePath; - } - - $mockResolver->verifyInvoked('getComposerJsonTestModulePaths', [$expectedSearchPaths]); - } - - /** - * Validate aggregateTestModulePathsFromComposerInstaller + * Validate aggregateTestModulePathsFromComposerInstaller. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testAggregateTestModulePathsFromComposerInstaller() + public function testAggregateTestModulePathsFromComposerInstaller(): void { $this->mockForceGenerate(false); - $this->setMockResolverClass( - false, - null, - null, - null, - [], - null, - null, - null, - null, - [], - [ - 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathA' => - [ - 'Magento_ModuleA', - 'Magento_ModuleB' - ], - 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathB' => - [ - 'Magento_ModuleB', - 'Magento_ModuleC' - ], - ] - ); - + $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService->expects($this->any()) + ->method('getComposerInstalledTestModulePaths') + ->willReturn( + [ + 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathA' => + [ + 'Magento_ModuleA', + 'Magento_ModuleB' + ], + 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathB' => + [ + 'Magento_ModuleB', + 'Magento_ModuleC' + ], + ] + ); + + $this->setMockResolverCreatorProperties($moduleResolverService); $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties( $resolver, @@ -336,93 +175,62 @@ public function testAggregateTestModulePathsFromComposerInstaller() } /** - * Validate getComposerInstalledTestModulePaths with paths invocation - * - * @throws \Exception - */ - public function testGetComposerInstalledTestModulePathsForPathInvocation() - { - $this->mockForceGenerate(false); - $mockResolver = $this->setMockResolverClass( - false, - [], - null, - null, - [], - null, - null, - null, - null, - [], - [] - ); - - $resolver = ModuleResolver::getInstance(); - $this->setMockResolverProperties($resolver, null, null); - $this->assertEquals( - [], - $resolver->getModulesPath() - ); - - // Expected file path - $expectedSearchPath = MAGENTO_BP . DIRECTORY_SEPARATOR . 'composer.json'; - - $mockResolver->verifyInvoked('getComposerInstalledTestModulePaths', [$expectedSearchPath]); - } - - /** - * Validate mergeModulePaths() and flipAndFilterModulePathsArray() + * Validate mergeModulePaths() and flipAndFilterModulePathsArray(). * - * @throws \Exception + * @return void + * @throws Exception */ - public function testMergeFlipAndFilterModulePathsNoForceGenerate() + public function testMergeFlipAndFilterModulePathsNoForceGenerate(): void { $this->mockForceGenerate(false); - $this->setMockResolverClass( - false, - null, - null, - null, - null, - null, - null, - null, - null, - [ - 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathA' => - [ - 'Magento_ModuleA' - ], - 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathB' => - [ - 'Magento_ModuleB' - ], - ], - [ - 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathD' => - [ - 'Magento_ModuleD' - ], - 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathE' => - [ - 'Magento_ModuleE' - ], - 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathC' => - [ - 'Magento_ModuleC', - 'Magento_ModuleB', - ], - ], - [ - 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example' => ['Magento_Example'], - 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample' => ['Magento_Sample'], - 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'path1' => ['Magento_Path1'], - 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'path2' => ['Magento_Path2'], - 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'path3' => ['Magento_Path3'], - 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'path4' => ['Magento_Path4'], - ] - ); - + $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService->expects($this->any()) + ->method('getComposerJsonTestModulePaths') + ->willReturn( + [ + 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathA' => + [ + 'Magento_ModuleA' + ], + 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathB' => + [ + 'Magento_ModuleB' + ] + ] + ); + $moduleResolverService->expects($this->any()) + ->method('getComposerInstalledTestModulePaths') + ->willReturn( + [ + 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathD' => + [ + 'Magento_ModuleD' + ], + 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathE' => + [ + 'Magento_ModuleE' + ], + 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathC' => + [ + 'Magento_ModuleC', + 'Magento_ModuleB', + ] + ] + ); + $moduleResolverService->expects($this->any()) + ->method('aggregateTestModulePaths') + ->willReturn( + [ + 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example' => ['Magento_Example'], + 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample' => ['Magento_Sample'], + 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'path1' => ['Magento_Path1'], + 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'path2' => ['Magento_Path2'], + 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'path3' => ['Magento_Path3'], + 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'path4' => ['Magento_Path4'] + ] + ); + + $this->setMockResolverCreatorProperties($moduleResolverService); $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties( $resolver, @@ -454,55 +262,59 @@ public function testMergeFlipAndFilterModulePathsNoForceGenerate() } /** - * Validate mergeModulePaths() and flipAndSortModulePathsArray() + * Validate mergeModulePaths() and flipAndSortModulePathsArray(). * - * @throws \Exception + * @return void + * @throws Exception */ - public function testMergeFlipNoSortModulePathsNoForceGenerate() + public function testMergeFlipNoSortModulePathsNoForceGenerate(): void { $this->mockForceGenerate(false); - $this->setMockResolverClass( - false, - null, - null, - null, - null, - null, - null, - null, - null, - [ - 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR - . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleA' => - [ - 'Magento_ModuleA' - ], - 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR - . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleBC' => - [ - 'Magento_ModuleB', - 'Magento_ModuleC', - ], - ], - [ - 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR - . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleCD' => - [ - 'Magento_ModuleC', - 'Magento_ModuleD' - ], - 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR - . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleE' => - [ - 'Magento_ModuleE' - ], - ], - [ - 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example' => ['Magento_Example'], - 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample' => ['Magento_Sample'], - ] - ); - + $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService->expects($this->any()) + ->method('getComposerJsonTestModulePaths') + ->willReturn( + [ + 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR + . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleA' => + [ + 'Magento_ModuleA' + ], + 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR + . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleBC' => + [ + 'Magento_ModuleB', + 'Magento_ModuleC', + ] + ] + ); + $moduleResolverService->expects($this->any()) + ->method('getComposerInstalledTestModulePaths') + ->willReturn( + [ + 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR + . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleCD' => + [ + 'Magento_ModuleC', + 'Magento_ModuleD' + ], + 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR + . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleE' => + [ + 'Magento_ModuleE' + ] + ] + ); + $moduleResolverService->expects($this->any()) + ->method('aggregateTestModulePaths') + ->willReturn( + [ + 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example' => ['Magento_Example'], + 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample' => ['Magento_Sample'] + ] + ); + + $this->setMockResolverCreatorProperties($moduleResolverService); $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties( $resolver, @@ -529,55 +341,59 @@ public function testMergeFlipNoSortModulePathsNoForceGenerate() } /** - * Validate mergeModulePaths() and flipAndSortModulePathsArray() + * Validate mergeModulePaths() and flipAndSortModulePathsArray(). * - * @throws \Exception + * @return void + * @throws Exception */ - public function testMergeFlipAndSortModulePathsForceGenerate() + public function testMergeFlipAndSortModulePathsForceGenerate(): void { $this->mockForceGenerate(true); - $this->setMockResolverClass( - false, - null, - null, - null, - null, - null, - null, - null, - null, - [ - 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR + $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService->expects($this->any()) + ->method('getComposerJsonTestModulePaths') + ->willReturn( + [ + 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleA' => - [ - 'Magento_ModuleA' - ], - 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR + [ + 'Magento_ModuleA' + ], + 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleBC' => - [ - 'Magento_ModuleB', - 'Magento_ModuleC', - ], - ], - [ - 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR + [ + 'Magento_ModuleB', + 'Magento_ModuleC', + ] + ] + ); + $moduleResolverService->expects($this->any()) + ->method('getComposerInstalledTestModulePaths') + ->willReturn( + [ + 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleCD' => - [ - 'Magento_ModuleC', - 'Magento_ModuleD' - ], - 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR + [ + 'Magento_ModuleC', + 'Magento_ModuleD' + ], + 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleD' => - [ - 'Magento_ModuleD' - ], - ], - [ - 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example' => ['Magento_Example'], - 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample' => ['Magento_Sample'], - ] - ); - + [ + 'Magento_ModuleD' + ] + ] + ); + $moduleResolverService->expects($this->any()) + ->method('aggregateTestModulePaths') + ->willReturn( + [ + 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example' => ['Magento_Example'], + 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample' => ['Magento_Sample'] + ] + ); + + $this->setMockResolverCreatorProperties($moduleResolverService); $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties( $resolver, @@ -609,45 +425,45 @@ public function testMergeFlipAndSortModulePathsForceGenerate() } /** - * Validate logging warning in flipAndFilterModulePathsArray() + * Validate logging warning in flipAndFilterModulePathsArray(). * - * @throws \Exception + * @return void + * @throws Exception */ - public function testMergeFlipAndFilterModulePathsWithLogging() + public function testMergeFlipAndFilterModulePathsWithLogging(): void { $this->mockForceGenerate(false); - $this->setMockResolverClass( - false, - null, - null, - null, - [], - null, - null, - null, - null, - [ - 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathA' => - [ - 'Magento_ModuleA' - ], - 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathB' => - [ - 'Magento_ModuleB' - ], - ], - [ - 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathA' => - [ - 'Magento_ModuleA' - ], - 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathB' => - [ - 'Magento_ModuleC' - ], - ] - ); - + $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService->expects($this->any()) + ->method('getComposerJsonTestModulePaths') + ->willReturn( + [ + 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathA' => + [ + 'Magento_ModuleA' + ], + 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathB' => + [ + 'Magento_ModuleB' + ] + ] + ); + $moduleResolverService->expects($this->any()) + ->method('getComposerInstalledTestModulePaths') + ->willReturn( + [ + 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathA' => + [ + 'Magento_ModuleA' + ], + 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathB' => + [ + 'Magento_ModuleC' + ] + ] + ); + + $this->setMockResolverCreatorProperties($moduleResolverService); $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties( $resolver, @@ -666,37 +482,30 @@ public function testMergeFlipAndFilterModulePathsWithLogging() ], $resolver->getModulesPath() ); + $warnMsg = 'Path: composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR; $warnMsg .= 'pathA is ignored by ModuleResolver. ' . PHP_EOL . 'Path: composer' . DIRECTORY_SEPARATOR; $warnMsg .= 'json' . DIRECTORY_SEPARATOR . 'pathA is set for Module: Magento_ModuleA' . PHP_EOL; - TestLoggingUtil::getInstance()->validateMockLogStatement( - 'warning', - $warnMsg, - [] - ); + TestLoggingUtil::getInstance()->validateMockLogStatement('warning', $warnMsg, []); } /** - * Validate custom modules are added - * @throws \Exception + * Validate custom modules are added. + * + * @return void + * @throws Exception */ - public function testApplyCustomModuleMethods() + public function testApplyCustomModuleMethods(): void { - $this->setMockResolverClass( - false, - null, - null, - null, - [], - [ 'Magento_Module' => 'otherPath'], - null, - null, - null, - [], - [] - ); + $this->mockForceGenerate(true); + $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService->expects($this->any()) + ->method('getCustomModulePaths') + ->willReturn(['Magento_Module' => 'otherPath']); + + $this->setMockResolverCreatorProperties($moduleResolverService); $resolver = ModuleResolver::getInstance(); - $this->setMockResolverProperties($resolver, null, null, null); + $this->setMockResolverProperties($resolver); $this->assertEquals(['otherPath'], $resolver->getModulesPath()); TestLoggingUtil::getInstance()->validateMockLogStatement( 'info', @@ -709,35 +518,24 @@ public function testApplyCustomModuleMethods() * Validate blocklisted modules are removed * Module paths are sorted according to module name in alphabetically ascending order * - * @throws \Exception + * @throws Exception */ - public function testGetModulePathsBlocklist() + public function testGetModulePathsBlocklist(): void { - $this->setMockResolverClass( - false, - null, - null, - null, - [], - null, - null, - null, - null, - [], - [], - [ - 'thisPath/some/path4' => ['Some_Module4'], - 'devTests/Magento/path3' => ['Magento_Module3'], - 'appCode/Magento/path2' => ['Magento_Module2'], - 'vendor/amazon/path1' => ['Amazon_Module1'], - ], - function ($arg) { - return $arg; - }, - function ($arg) { - return $arg; - } - ); + $this->mockForceGenerate(true); + $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService->expects($this->any()) + ->method('aggregateTestModulePaths') + ->willReturn( + [ + 'thisPath/some/path4' => ['Some_Module4'], + 'devTests/Magento/path3' => ['Magento_Module3'], + 'appCode/Magento/path2' => ['Magento_Module2'], + 'vendor/amazon/path1' => ['Amazon_Module1'] + ] + ); + + $this->setMockResolverCreatorProperties($moduleResolverService); $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties($resolver, null, null, ['Magento_Module3']); $this->assertEquals( @@ -752,68 +550,33 @@ function ($arg) { } /** - * Validate that getEnabledModules errors out when no Admin Token is returned and --force is false - * @throws \Exception + * Validate that getEnabledModules errors out when no Admin Token is returned and --force is false. + * + * @return void + * @throws Exception */ - public function testGetModulePathsNoAdminToken() + public function testGetModulePathsNoAdminToken(): void { // Set --force to false $this->mockForceGenerate(false); - - // Mock ModuleResolver and $enabledModulesPath - $this->setMockResolverClass( - false, - null, - ["example" . DIRECTORY_SEPARATOR . "paths"], - [], - null, - null, - null, - null, - null, - [], - [] - ); $resolver = ModuleResolver::getInstance(); - $this->setMockResolverProperties($resolver, null, null); + $this->setMockResolverProperties($resolver); - // Cannot Generate if no --force was passed in and no Admin Token is returned succesfully + // Cannot Generate if no --force was passed in and no Admin Token is returned successfully $this->expectException(FastFailException::class); $resolver->getModulesPath(); } - /** - * Validates that getAdminToken is not called when --force is enabled - */ - public function testGetAdminTokenNotCalledWhenForce() - { - // Set --force to true - $this->mockForceGenerate(true); - - // Mock ModuleResolver and applyCustomModuleMethods() - $mockResolver = $this->setMockResolverClass(); - $resolver = ModuleResolver::getInstance(); - $this->setMockResolverProperties($resolver, null, null); - $resolver->getModulesPath(); - $mockResolver->verifyNeverInvoked("getAdminToken"); - - // verifyNeverInvoked does not add to assertion count - $this->addToAssertionCount(1); - } - /** * Verify the getAdminToken method returns throws an exception if ENV is not fully loaded. */ - public function testGetAdminTokenWithMissingEnv() + public function testGetAdminTokenWithMissingEnv(): void { - // Set --force to true + // Set --force to false $this->mockForceGenerate(false); // Unset env unset($_ENV['MAGENTO_ADMIN_USERNAME']); - - // Mock ModuleResolver and applyCustomModuleMethods() - $mockResolver = $this->setMockResolverClass(); $resolver = ModuleResolver::getInstance(); // Expect exception @@ -824,13 +587,10 @@ public function testGetAdminTokenWithMissingEnv() /** * Verify the getAdminToken method returns throws an exception if Token was bad. */ - public function testGetAdminTokenWithBadResponse() + public function testGetAdminTokenWithBadResponse(): void { - // Set --force to true + // Set --force to false $this->mockForceGenerate(false); - - // Mock ModuleResolver and applyCustomModuleMethods() - $mockResolver = $this->setMockResolverClass(); $resolver = ModuleResolver::getInstance(); // Expect exception @@ -839,153 +599,71 @@ public function testGetAdminTokenWithBadResponse() } /** - * Function used to set mock for parser return and force init method to run between tests. - * - * @param string $mockToken - * @param array $mockGetEnabledModules - * @param string[] $mockApplyCustomMethods - * @param string[] $mockGlobRelevantWrapper - * @param string[] $mockRelevantPaths - * @param string[] $mockGetCustomModulePaths - * @param string[] $mockGetRegisteredModuleList - * @param string[] $mockAggregateTestModulePathsFromComposerJson - * @param string[] $mockAggregateTestModulePathsFromComposerInstaller - * @param string[] $mockGetComposerJsonTestModulePaths - * @param string[] $mockGetComposerInstalledTestModulePaths - * @param string[] $mockAggregateTestModulePaths - * @param string[] $mockNormalizeModuleNames - * @param string[] $mockFlipAndFilterModulePathsArray - * @param string[] $mockFlipAndSortModulePathsArray - * @throws \Exception - * @return Verifier ModuleResolver double - */ - private function setMockResolverClass( - $mockToken = null, - $mockGetEnabledModules = null, - $mockApplyCustomMethods = null, - $mockGlobRelevantWrapper = null, - $mockRelevantPaths = null, - $mockGetCustomModulePaths = null, - $mockGetRegisteredModuleList = null, - $mockAggregateTestModulePathsFromComposerJson = null, - $mockAggregateTestModulePathsFromComposerInstaller = null, - $mockGetComposerJsonTestModulePaths = null, - $mockGetComposerInstalledTestModulePaths = null, - $mockAggregateTestModulePaths = null, - $mockNormalizeModuleNames = null, - $mockFlipAndFilterModulePathsArray = null, - $mockFlipAndSortModulePathsArray = null - ) { - $property = new \ReflectionProperty(ModuleResolver::class, 'instance'); - $property->setAccessible(true); - $property->setValue(null); - - $mockMethods = []; - if (isset($mockToken)) { - $mockMethods['getAdminToken'] = $mockToken; - } - if (isset($mockGetEnabledModules)) { - $mockMethods['getEnabledModules'] = $mockGetEnabledModules; - } - if (isset($mockApplyCustomMethods)) { - $mockMethods['applyCustomModuleMethods'] = $mockApplyCustomMethods; - } - if (isset($mockGlobRelevantWrapper)) { - $mockMethods['globRelevantWrapper'] = $mockGlobRelevantWrapper; - } - if (isset($mockRelevantPaths)) { - $mockMethods['globRelevantPaths'] = $mockRelevantPaths; - } - if (isset($mockGetCustomModulePaths)) { - $mockMethods['getCustomModulePaths'] = $mockGetCustomModulePaths; - } - if (isset($mockGetRegisteredModuleList)) { - $mockMethods['getRegisteredModuleList'] = $mockGetRegisteredModuleList; - } - if (isset($mockAggregateTestModulePathsFromComposerJson)) { - $mockMethods['aggregateTestModulePathsFromComposerJson'] = $mockAggregateTestModulePathsFromComposerJson; - } - if (isset($mockAggregateTestModulePathsFromComposerInstaller)) { - $mockMethods['aggregateTestModulePathsFromComposerInstaller'] = - $mockAggregateTestModulePathsFromComposerInstaller; - } - if (isset($mockGetComposerJsonTestModulePaths)) { - $mockMethods['getComposerJsonTestModulePaths'] = $mockGetComposerJsonTestModulePaths; - } - if (isset($mockGetComposerInstalledTestModulePaths)) { - $mockMethods['getComposerInstalledTestModulePaths'] = $mockGetComposerInstalledTestModulePaths; - } - if (isset($mockAggregateTestModulePaths)) { - $mockMethods['aggregateTestModulePaths'] = $mockAggregateTestModulePaths; - } - if (isset($mockNormalizeModuleNames)) { - $mockMethods['normalizeModuleNames'] = $mockNormalizeModuleNames; - } - if (isset($mockFlipAndFilterModulePathsArray)) { - $mockMethods['flipAndFilterModulePathsArray'] = $mockFlipAndFilterModulePathsArray; - } - if (isset($mockFlipAndSortModulePathsArray)) { - $mockMethods['flipAndSortModulePathsArray'] = $mockFlipAndSortModulePathsArray; - } - $mockResolver = AspectMock::double( - ModuleResolver::class, - $mockMethods - ); - $instance = AspectMock::double( - ObjectManager::class, - ['create' => $mockResolver->make(), 'get' => null] - )->make(); - // bypass the private constructor - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); - - return $mockResolver; - } - - /** - * Function used to set mock for Resolver properties + * Function used to set mock for Resolver properties. * * @param ModuleResolver $instance * @param array $mockPaths * @param array $mockModules * @param array $mockBlocklist - * @throws \Exception + * + * @return void + * @throws Exception */ - private function setMockResolverProperties($instance, $mockPaths = null, $mockModules = null, $mockBlocklist = []) - { - $property = new \ReflectionProperty(ModuleResolver::class, 'enabledModulePaths'); + private function setMockResolverProperties( + ModuleResolver $instance, + $mockPaths = null, + $mockModules = null, + $mockBlocklist = [] + ): void { + $property = new ReflectionProperty(ModuleResolver::class, 'enabledModulePaths'); $property->setAccessible(true); $property->setValue($instance, $mockPaths); - $property = new \ReflectionProperty(ModuleResolver::class, 'enabledModules'); + $property = new ReflectionProperty(ModuleResolver::class, 'enabledModules'); $property->setAccessible(true); $property->setValue($instance, $mockModules); - $property = new \ReflectionProperty(ModuleResolver::class, 'moduleBlocklist'); + $property = new ReflectionProperty(ModuleResolver::class, 'moduleBlocklist'); $property->setAccessible(true); $property->setValue($instance, $mockBlocklist); } + /** + * Function used to set mock for ResolverCreator properties. + * + * @param MockObject $moduleResolverService + * + * @return void + */ + private function setMockResolverCreatorProperties(MockObject $moduleResolverService): void + { + $property = new ReflectionProperty(ModuleResolverService::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($moduleResolverService); + } + /** * Mocks MftfApplicationConfig->forceGenerateEnabled() - * @param $forceGenerate - * @throws \Exception + * @param bool $forceGenerate + * * @return void + * @throws Exception */ - private function mockForceGenerate($forceGenerate) + private function mockForceGenerate(bool $forceGenerate): void { - $mockConfig = AspectMock::double( - MftfApplicationConfig::class, - ['forceGenerateEnabled' => $forceGenerate] - ); - $instance = AspectMock::double( - ObjectManager::class, - ['create' => $mockConfig->make(), 'get' => null] - )->make(); - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); + $mockConfig = $this->createMock(MftfApplicationConfig::class); + $mockConfig->expects($this->once()) + ->method('forceGenerateEnabled') + ->willReturn($forceGenerate); + + $property = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); + $property->setAccessible(true); + $property->setValue($mockConfig); } /** - * After method functionality + * After method functionality. + * * @return void */ protected function tearDown(): void @@ -994,7 +672,5 @@ protected function tearDown(): void if (!isset($_ENV['MAGENTO_ADMIN_USERNAME'])) { $_ENV['MAGENTO_ADMIN_USERNAME'] = "admin"; } - - AspectMock::clean(); } } diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php index b9a74de84..09ff90dfc 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php @@ -8,6 +8,7 @@ use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; +use Magento\FunctionalTestingFramework\Util\ModuleResolver\ModuleResolverService; use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; use Magento\FunctionalTestingFramework\Util\Path\FilePathFormatter; use Magento\FunctionalTestingFramework\Util\Path\UrlFormatter; @@ -136,27 +137,6 @@ class ModuleResolver 'SampleTests', 'SampleTemplates' ]; - /** - * Registered module list in magento system under test - * - * @var array - */ - private $registeredModuleList = []; - - /** - * Composer json based test module paths - * - * @var array - */ - private $composerJsonModulePaths = null; - - /** - * Composer installed test module paths - * - * @var array - */ - private $composerInstalledModulePaths = null; - /** * Get ModuleResolver instance. * @@ -311,90 +291,7 @@ protected function getModuleAllowlist() */ private function aggregateTestModulePaths() { - $allModulePaths = []; - - // Define the Module paths from magento bp - $magentoBaseCodePath = FilePathFormatter::format(MAGENTO_BP, false); - - // Define the Module paths from default TESTS_MODULE_PATH - $modulePath = defined('TESTS_MODULE_PATH') ? TESTS_MODULE_PATH : TESTS_BP; - $modulePath = FilePathFormatter::format($modulePath, false); - - // If $modulePath is DEV_TESTS path, we don't need to search by pattern - if (strpos($modulePath, self::DEV_TESTS) === false) { - $codePathsToPattern[$modulePath] = ''; - } - - $vendorCodePath = DIRECTORY_SEPARATOR . self::VENDOR; - $codePathsToPattern[$magentoBaseCodePath . $vendorCodePath] = self::TEST_MFTF_PATTERN; - - $appCodePath = DIRECTORY_SEPARATOR . self::APP_CODE; - $codePathsToPattern[$magentoBaseCodePath . $appCodePath] = self::TEST_MFTF_PATTERN; - - foreach ($codePathsToPattern as $codePath => $pattern) { - $allModulePaths = array_merge_recursive($allModulePaths, $this->globRelevantPaths($codePath, $pattern)); - } - - return $allModulePaths; - } - - /** - * Function which takes a code path and a pattern and determines if there are any matching subdir paths. Matches - * are returned as an associative array keyed by basename (the last dir excluding pattern) to an array containing - * the matching path. - * - * @param string $testPath - * @param string $pattern - * @return array - */ - private function globRelevantPaths($testPath, $pattern) - { - $modulePaths = []; - $relevantPaths = []; - - if (file_exists($testPath)) { - $relevantPaths = $this->globRelevantWrapper($testPath, $pattern); - } - - foreach ($relevantPaths as $codePath) { - // Reduce magento/app/code/Magento/AdminGws/ to magento/app/code/Magento/AdminGws to read symlink - // Symlinks must be resolved otherwise they will not match Magento's filepath to the module - $potentialSymlink = str_replace(DIRECTORY_SEPARATOR . $pattern, "", $codePath); - if (is_link($potentialSymlink)) { - $codePath = realpath($potentialSymlink) . DIRECTORY_SEPARATOR . $pattern; - } - $mainModName = basename(str_replace($pattern, '', $codePath)); - $modulePaths[$codePath] = [$mainModName]; - - if (MftfApplicationConfig::getConfig()->verboseEnabled()) { - LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->debug( - "including module", - ['module' => $mainModName, 'path' => $codePath] - ); - } - } - - return $modulePaths; - } - - /** - * Glob wrapper for globRelevantPaths function - * - * @param string $testPath - * @param string $pattern - * @return array - */ - private static function globRelevantWrapper($testPath, $pattern) - { - if ($pattern == "") { - return glob($testPath . '*' . DIRECTORY_SEPARATOR . '*' . $pattern); - } - $subDirectory = "*" . DIRECTORY_SEPARATOR; - $directories = glob($testPath . $subDirectory . $pattern, GLOB_ONLYDIR); - foreach (glob($testPath . $subDirectory, GLOB_ONLYDIR) as $dir) { - $directories = array_merge_recursive($directories, self::globRelevantWrapper($dir, $pattern)); - } - return $directories; + return ModuleResolverService::getInstance()->aggregateTestModulePaths(); } /** @@ -428,23 +325,14 @@ private function aggregateTestModulePathsFromComposerJson() * Retrieve all module code paths that have test module composer json files * * @param array $codePaths + * * @return array */ private function getComposerJsonTestModulePaths($codePaths) { - if (null !== $this->composerJsonModulePaths) { - return $this->composerJsonModulePaths; - } - try { - $this->composerJsonModulePaths = []; - $resolver = new ComposerModuleResolver(); - $this->composerJsonModulePaths = $resolver->getTestModulesFromPaths($codePaths); - } catch (TestFrameworkException $e) { - } - - return $this->composerJsonModulePaths; + return ModuleResolverService::getInstance()->getComposerJsonTestModulePaths($codePaths); } - + /** * Aggregate all code paths with composer installed test modules * @@ -462,22 +350,13 @@ private function aggregateTestModulePathsFromComposerInstaller() /** * Retrieve composer installed test module code paths * - * @params string $composerFile + * @param string $composerFile + * * @return array */ private function getComposerInstalledTestModulePaths($composerFile) { - if (null !== $this->composerInstalledModulePaths) { - return $this->composerInstalledModulePaths; - } - try { - $this->composerInstalledModulePaths = []; - $resolver = new ComposerModuleResolver(); - $this->composerInstalledModulePaths = $resolver->getComposerInstalledTestModules($composerFile); - } catch (TestFrameworkException $e) { - } - - return $this->composerInstalledModulePaths; + return ModuleResolverService::getInstance()->getComposerInstalledTestModulePaths($composerFile); } /** @@ -739,18 +618,7 @@ private function removeBlocklistModules($modulePaths) */ private function getCustomModulePaths() { - $customModulePaths = []; - $paths = getenv(self::CUSTOM_MODULE_PATHS); - - if (!$paths) { - return $customModulePaths; - } - - foreach (explode(',', $paths) as $path) { - $customModulePaths[$this->findVendorAndModuleNameFromPath(trim($path))] = $path; - } - - return $customModulePaths; + return ModuleResolverService::getInstance()->getCustomModulePaths(); } /** @@ -770,41 +638,7 @@ private function getModuleBlocklist() */ private function getRegisteredModuleList() { - if (!empty($this->registeredModuleList)) { - return $this->registeredModuleList; - } - - if (array_key_exists('MAGENTO_BP', $_ENV)) { - $autoloadPath = realpath(MAGENTO_BP . "/app/autoload.php"); - if ($autoloadPath) { - require_once($autoloadPath); - } else { - throw new TestFrameworkException("Magento app/autoload.php not found with given MAGENTO_BP:" - . MAGENTO_BP); - } - } - - try { - $allComponents = []; - if (!class_exists(self::REGISTRAR_CLASS)) { - throw new TestFrameworkException("Magento Installation not found when loading registered modules.\n"); - } - $components = new \Magento\Framework\Component\ComponentRegistrar(); - foreach (self::PATHS as $componentType) { - $allComponents = array_merge($allComponents, $components->getPaths($componentType)); - } - array_walk($allComponents, function (&$value) { - // Magento stores component paths with unix DIRECTORY_SEPARATOR, need to stay uniform and convert - $value = realpath($value); - $value .= DIRECTORY_SEPARATOR . self::TEST_MFTF_PATTERN; - }); - return $allComponents; - } catch (TestFrameworkException $e) { - LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->warning( - "$e" - ); - } - return []; + return ModuleResolverService::getInstance()->getRegisteredModuleList(); } /** diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php new file mode 100644 index 000000000..0f6513436 --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php @@ -0,0 +1,322 @@ +registeredModuleList)) { + return $this->registeredModuleList; + } + + if (array_key_exists('MAGENTO_BP', $_ENV)) { + $autoloadPath = realpath(MAGENTO_BP . "/app/autoload.php"); + + if ($autoloadPath) { + require_once($autoloadPath); + } else { + throw new TestFrameworkException( + "Magento app/autoload.php not found with given MAGENTO_BP:" . MAGENTO_BP + ); + } + } + + try { + $allComponents = []; + + if (!class_exists(ModuleResolver::REGISTRAR_CLASS)) { + throw new TestFrameworkException("Magento Installation not found when loading registered modules.\n"); + } + + $components = new ComponentRegistrar(); + + foreach (ModuleResolver::PATHS as $componentType) { + $allComponents = array_merge($allComponents, $components->getPaths($componentType)); + } + + array_walk($allComponents, function (&$value) { + // Magento stores component paths with unix DIRECTORY_SEPARATOR, need to stay uniform and convert + $value = realpath($value); + $value .= DIRECTORY_SEPARATOR . ModuleResolver::TEST_MFTF_PATTERN; + }); + + return $allComponents; + } catch (TestFrameworkException $exception) { + LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->warning("$exception"); + } + return []; + } + + /** + * Function which takes a code path and a pattern and determines if there are any matching subdir paths. Matches + * are returned as an associative array keyed by basename (the last dir excluding pattern) to an array containing + * the matching path. + * + * @param string $testPath + * @param string $pattern + * + * @return array + * @throws TestFrameworkException + */ + public function globRelevantPaths(string $testPath, string $pattern): array + { + $modulePaths = []; + $relevantPaths = []; + + if (file_exists($testPath)) { + $relevantPaths = $this->globRelevantWrapper($testPath, $pattern); + } + + foreach ($relevantPaths as $codePath) { + $potentialSymlink = str_replace(DIRECTORY_SEPARATOR . $pattern, "", $codePath); + + if (is_link($potentialSymlink)) { + $codePath = realpath($potentialSymlink) . DIRECTORY_SEPARATOR . $pattern; + } + + $mainModName = basename(str_replace($pattern, '', $codePath)); + $modulePaths[$codePath] = [$mainModName]; + + if (MftfApplicationConfig::getConfig()->verboseEnabled()) { + LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->debug( + "including module", + ['module' => $mainModName, 'path' => $codePath] + ); + } + } + + return $modulePaths; + } + + /** + * Glob wrapper for globRelevantPaths function. + * + * @param string $testPath + * @param string $pattern + * + * @return array + */ + private static function globRelevantWrapper(string $testPath, string $pattern): array + { + if ($pattern == "") { + return glob($testPath . '*' . DIRECTORY_SEPARATOR . '*' . $pattern); + } + + $subDirectory = "*" . DIRECTORY_SEPARATOR; + $directories = glob($testPath . $subDirectory . $pattern, GLOB_ONLYDIR); + + foreach (glob($testPath . $subDirectory, GLOB_ONLYDIR) as $dir) { + $directories = array_merge_recursive($directories, self::globRelevantWrapper($dir, $pattern)); + } + + return $directories; + } + + /** + * Retrieve all module code paths that have test module composer json files. + * + * @param array $codePaths + * + * @return array + */ + public function getComposerJsonTestModulePaths(array $codePaths): array + { + if (null !== $this->composerJsonModulePaths) { + return $this->composerJsonModulePaths; + } + + try { + $this->composerJsonModulePaths = []; + $resolver = new ComposerModuleResolver(); + $this->composerJsonModulePaths = $resolver->getTestModulesFromPaths($codePaths); + } catch (TestFrameworkException $e) { + } + + return $this->composerJsonModulePaths; + } + + /** + * Retrieve composer installed test module code paths. + * + * @param string $composerFile + * + * @return array + */ + public function getComposerInstalledTestModulePaths(string $composerFile): array + { + if (null !== $this->composerInstalledModulePaths) { + return $this->composerInstalledModulePaths; + } + + try { + $this->composerInstalledModulePaths = []; + $resolver = new ComposerModuleResolver(); + $this->composerInstalledModulePaths = $resolver->getComposerInstalledTestModules($composerFile); + } catch (TestFrameworkException $e) { + } + + return $this->composerInstalledModulePaths; + } + + /** + * Retrieves all module directories which might contain pertinent test code. + * + * @return array + * @throws TestFrameworkException + */ + public function aggregateTestModulePaths(): array + { + $allModulePaths = []; + + // Define the Module paths from magento bp + $magentoBaseCodePath = FilePathFormatter::format(MAGENTO_BP, false); + + // Define the Module paths from default TESTS_MODULE_PATH + $modulePath = defined('TESTS_MODULE_PATH') ? TESTS_MODULE_PATH : TESTS_BP; + $modulePath = FilePathFormatter::format($modulePath, false); + + // If $modulePath is DEV_TESTS path, we don't need to search by pattern + if (strpos($modulePath, ModuleResolver::DEV_TESTS) === false) { + $codePathsToPattern[$modulePath] = ''; + } + + $vendorCodePath = DIRECTORY_SEPARATOR . ModuleResolver::VENDOR; + $codePathsToPattern[$magentoBaseCodePath . $vendorCodePath] = ModuleResolver::TEST_MFTF_PATTERN; + + $appCodePath = DIRECTORY_SEPARATOR . ModuleResolver::APP_CODE; + $codePathsToPattern[$magentoBaseCodePath . $appCodePath] = ModuleResolver::TEST_MFTF_PATTERN; + + foreach ($codePathsToPattern as $codePath => $pattern) { + $allModulePaths = array_merge_recursive($allModulePaths, $this->globRelevantPaths($codePath, $pattern)); + } + + return $allModulePaths; + } + + /** + * Returns an array of custom module paths defined by the user. + * + * @return string[] + */ + public function getCustomModulePaths(): array + { + $customModulePaths = []; + $paths = getenv(ModuleResolver::CUSTOM_MODULE_PATHS); + + if (!$paths) { + return $customModulePaths; + } + + foreach (explode(',', $paths) as $path) { + $customModulePaths[$this->findVendorAndModuleNameFromPath(trim($path))] = $path; + } + + return $customModulePaths; + } + + /** + * Find vendor and module name from path. + * + * @param string $path + * + * @return string + */ + private function findVendorAndModuleNameFromPath(string $path): string + { + $path = str_replace(DIRECTORY_SEPARATOR . ModuleResolver::TEST_MFTF_PATTERN, '', $path); + + return $this->findVendorNameFromPath($path) . '_' . basename($path); + } + + /** + * Find vendor name from path. + * + * @param string $path + * + * @return string + */ + private function findVendorNameFromPath(string $path): string + { + $possibleVendorName = 'UnknownVendor'; + $dirPaths = [ + ModuleResolver::VENDOR, + ModuleResolver::APP_CODE, + ModuleResolver::DEV_TESTS + ]; + + foreach ($dirPaths as $dirPath) { + $regex = "~.+\\/" . $dirPath . "\/(?<" . ModuleResolver::VENDOR . ">[^\/]+)\/.+~"; + $match = []; + preg_match($regex, $path, $match); + + if (isset($match[ModuleResolver::VENDOR])) { + $possibleVendorName = ucfirst($match[ModuleResolver::VENDOR]); + return $possibleVendorName; + } + } + + return $possibleVendorName; + } +} From d50f5b983173e61e39a707304e6a1dcfa2481449 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Thu, 15 Jul 2021 11:08:40 +0300 Subject: [PATCH 017/674] 33293: Eliminated AspectMock usage from PersistedObjectHandlerTest.php --- .../Handlers/PersistedObjectHandlerTest.php | 210 ++++++++++++------ .../DataGenerator/Persist/CurlHandler.php | 30 ++- .../Persist/DataPersistenceHandler.php | 8 +- 3 files changed, 172 insertions(+), 76 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php index 7e39fe216..4d70444b6 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php @@ -3,18 +3,15 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\DataGenerator\Handlers; -use AspectMock\Test as AspectMock; -use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; +use Exception; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; -use Magento\FunctionalTestingFramework\DataGenerator\Parsers\DataProfileSchemaParser; use Magento\FunctionalTestingFramework\DataGenerator\Persist\CurlHandler; -use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; -use Magento\FunctionalTestingFramework\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestLoggingUtil; @@ -25,28 +22,31 @@ class PersistedObjectHandlerTest extends MagentoTestCase { /** - * Before test functionality - * @return void + * @inheritDoc */ public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } - public function testCreateEntityWithNonExistingName() + /** + * Validate testCreateEntityWithNonExistingName. + * + * @return void + * @throws TestReferenceException + */ + public function testCreateEntityWithNonExistingName(): void { // Test Data and Variables - $entityName = "InvalidEntity"; - $entityStepKey = "StepKey"; + $entityName = 'InvalidEntity'; + $entityStepKey = 'StepKey'; $scope = PersistedObjectHandler::TEST_SCOPE; $exceptionMessage = "Entity \"" . $entityName . "\" does not exist." . "\nException occurred executing action at StepKey \"" . $entityStepKey . "\""; $this->expectException(TestReferenceException::class); - $this->expectExceptionMessage($exceptionMessage); - $handler = PersistedObjectHandler::getInstance(); // Call method @@ -57,13 +57,19 @@ public function testCreateEntityWithNonExistingName() ); } - public function testCreateSimpleEntity() + /** + * Validate testCreateSimpleEntity. + * + * @return void + * @throws TestReferenceException + */ + public function testCreateSimpleEntity(): void { // Test Data and Variables - $entityName = "EntityOne"; - $entityStepKey = "StepKey"; - $dataKey = "testKey"; - $dataValue = "testValue"; + $entityName = 'EntityOne'; + $entityStepKey = 'StepKey'; + $dataKey = 'testKey'; + $dataValue = 'testValue'; $scope = PersistedObjectHandler::TEST_SCOPE; $parserOutput = [ 'entity' => [ @@ -78,7 +84,7 @@ public function testCreateSimpleEntity() ] ] ]; - $jsonResponse = " + $jsonResponse = " { \"" . strtolower($dataKey) . "\" : \"{$dataValue}\" } @@ -100,13 +106,19 @@ public function testCreateSimpleEntity() $this->assertEquals($dataValue, $persistedValue); } - public function testDeleteSimpleEntity() + /** + * Validate testDeleteSimpleEntity. + * + * @return void + * @throws TestReferenceException + */ + public function testDeleteSimpleEntity(): void { // Test Data and Variables - $entityName = "EntityOne"; - $entityStepKey = "StepKey"; - $dataKey = "testKey"; - $dataValue = "testValue"; + $entityName = 'EntityOne'; + $entityStepKey = 'StepKey'; + $dataKey = 'testKey'; + $dataValue = 'testValue'; $scope = PersistedObjectHandler::TEST_SCOPE; $parserOutput = [ 'entity' => [ @@ -121,7 +133,7 @@ public function testDeleteSimpleEntity() ] ] ]; - $jsonResponse = " + $jsonResponse = " { \"" . strtolower($dataKey) . "\" : \"{$dataValue}\" } @@ -148,13 +160,19 @@ public function testDeleteSimpleEntity() $this->addToAssertionCount(1); } - public function testGetSimpleEntity() + /** + * Validate testGetSimpleEntity. + * + * @return void + * @throws Exception + */ + public function testGetSimpleEntity(): void { // Test Data and Variables - $entityName = "EntityOne"; - $entityStepKey = "StepKey"; - $dataKey = "testKey"; - $dataValue = "testValue"; + $entityName = 'EntityOne'; + $entityStepKey = 'StepKey'; + $dataKey = 'testKey'; + $dataValue = 'testValue'; $scope = PersistedObjectHandler::TEST_SCOPE; $parserOutput = [ 'entity' => [ @@ -169,7 +187,7 @@ public function testGetSimpleEntity() ] ] ]; - $jsonResponse = " + $jsonResponse = " { \"" . strtolower($dataKey) . "\" : \"{$dataValue}\" } @@ -191,16 +209,22 @@ public function testGetSimpleEntity() $this->assertEquals($dataValue, $persistedValue); } - public function testUpdateSimpleEntity() + /** + * Validate testUpdateSimpleEntity. + * + * @return void + * @throws TestReferenceException + */ + public function testUpdateSimpleEntity(): void { - $this->markTestSkipped("Potential Bug in DataPersistenceHandler class"); + $this->markTestSkipped('Potential Bug in DataPersistenceHandler class'); // Test Data and Variables - $entityName = "EntityOne"; - $entityStepKey = "StepKey"; - $dataKey = "testKey"; - $dataValue = "testValue"; - $updateName = "EntityTwo"; - $updateValue = "newValue"; + $entityName = 'EntityOne'; + $entityStepKey = 'StepKey'; + $dataKey = 'testKey'; + $dataValue = 'testValue'; + $updateName = 'EntityTwo'; + $updateValue = 'newValue'; $scope = PersistedObjectHandler::TEST_SCOPE; $parserOutput = [ 'entity' => [ @@ -224,7 +248,7 @@ public function testUpdateSimpleEntity() ] ] ]; - $jsonResponse = " + $jsonResponse = " { \"" . strtolower($dataKey) . "\" : \"{$dataValue}\" } @@ -257,21 +281,27 @@ public function testUpdateSimpleEntity() $this->assertEquals($updateValue, $persistedValue); } - public function testRetrieveEntityAcrossScopes() + /** + * Validate testRetrieveEntityAcrossScopes. + * + * @return void + * @throws TestReferenceException + */ + public function testRetrieveEntityAcrossScopes(): void { // Test Data and Variables - $entityNameOne = "EntityOne"; - $entityStepKeyOne = "StepKeyOne"; - $dataKeyOne = "testKeyOne"; - $dataValueOne = "testValueOne"; - $entityNameTwo = "EntityTwo"; - $entityStepKeyTwo = "StepKeyTwo"; - $dataKeyTwo = "testKeyTwo"; - $dataValueTwo = "testValueTwo"; - $entityNameThree = "EntityThree"; - $entityStepKeyThree = "StepKeyThree"; - $dataKeyThree = "testKeyThree"; - $dataValueThree = "testValueThree"; + $entityNameOne = 'EntityOne'; + $entityStepKeyOne = 'StepKeyOne'; + $dataKeyOne = 'testKeyOne'; + $dataValueOne = 'testValueOne'; + $entityNameTwo = 'EntityTwo'; + $entityStepKeyTwo = 'StepKeyTwo'; + $dataKeyTwo = 'testKeyTwo'; + $dataValueTwo = 'testValueTwo'; + $entityNameThree = 'EntityThree'; + $entityStepKeyThree = 'StepKeyThree'; + $dataKeyThree = 'testKeyThree'; + $dataValueThree = 'testValueThree'; $parserOutputOne = [ 'entity' => [ @@ -368,6 +398,8 @@ public function testRetrieveEntityAcrossScopes() } /** + * Validate testRetrieveEntityValidField. + * * @param string $name * @param string $key * @param string $value @@ -375,9 +407,18 @@ public function testRetrieveEntityAcrossScopes() * @param string $scope * @param string $stepKey * @dataProvider entityDataProvider + * + * @return void + * @throws TestReferenceException */ - public function testRetrieveEntityValidField($name, $key, $value, $type, $scope, $stepKey) - { + public function testRetrieveEntityValidField( + string $name, + string $key, + string $value, + string $type, + string $scope, + string $stepKey + ): void { $parserOutputOne = [ 'entity' => [ $name => [ @@ -411,6 +452,8 @@ public function testRetrieveEntityValidField($name, $key, $value, $type, $scope, } /** + * Validate testRetrieveEntityInValidField. + * * @param string $name * @param string $key * @param string $value @@ -418,14 +461,21 @@ public function testRetrieveEntityValidField($name, $key, $value, $type, $scope, * @param string $scope * @param string $stepKey * @dataProvider entityDataProvider + * + * @return void * @throws TestReferenceException - * @throws TestFrameworkException */ - public function testRetrieveEntityInValidField($name, $key, $value, $type, $scope, $stepKey) - { - $invalidDataKey = "invalidDataKey"; + public function testRetrieveEntityInValidField( + string $name, + string $key, + string $value, + string $type, + string $scope, + string $stepKey + ): void { + $invalidDataKey = 'invalidDataKey'; $warnMsg = "Undefined field {$invalidDataKey} in entity object with a stepKey of {$stepKey}\n"; - $warnMsg .= "Please fix the invalid reference. This will result in fatal error in next major release."; + $warnMsg .= 'Please fix the invalid reference. This will result in fatal error in next major release.'; $parserOutputOne = [ 'entity' => [ @@ -465,8 +515,10 @@ public function testRetrieveEntityInValidField($name, $key, $value, $type, $scop /** * Data provider for testRetrieveEntityField + * + * @return array */ - public static function entityDataProvider() + public static function entityDataProvider(): array { return [ ['Entity1', 'testKey1', 'testValue1', 'testType', PersistedObjectHandler::HOOK_SCOPE, 'StepKey1'], @@ -475,20 +527,37 @@ public static function entityDataProvider() ]; } - public function mockCurlHandler($response) + /** + * Create mock curl handler. + * + * @param string $response + * @throws Exception + */ + public function mockCurlHandler(string $response): void { - AspectMock::double(CurlHandler::class, [ - "__construct" => null, - "executeRequest" => $response, - "getRequestDataArray" => [], - "isContentTypeJson" => true - ]); + $mockCurlHandler = $this->createMock(CurlHandler::class); + $mockCurlHandler->expects($this->any()) + ->method('executeRequest') + ->willReturn($response); + $mockCurlHandler->expects($this->once()) + ->method('getRequestDataArray') + ->willReturn([]); + $mockCurlHandler->expects($this->once()) + ->method('isContentTypeJson') + ->willReturn(true); + + $property = new ReflectionProperty(CurlHandler::class, "INSTANCE"); + $property->setAccessible(true); + $property->setValue($mockCurlHandler); } + /** + * @inheritDoc + */ public function tearDown(): void { // Clear out Singleton between tests - $property = new \ReflectionProperty(PersistedObjectHandler::class, "INSTANCE"); + $property = new ReflectionProperty(PersistedObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); $property->setValue(null); @@ -496,8 +565,7 @@ public function tearDown(): void } /** - * After class functionality - * @return void + * @inheritDoc */ public static function tearDownAfterClass(): void { diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php index 89055b83f..9931cc470 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php @@ -63,6 +63,13 @@ class CurlHandler */ private $isJson; + /** + * Singleton CurlHandler Instance. + * + * @var CurlHandler + */ + private static $INSTANCE; + /** * Operation to Curl method mapping. * @@ -82,7 +89,7 @@ class CurlHandler * @param EntityDataObject $entityObject * @param string $storeCode */ - public function __construct($operation, $entityObject, $storeCode = null) + private function __construct($operation, $entityObject, $storeCode = null) { $this->operation = $operation; $this->entityObject = $entityObject; @@ -95,6 +102,27 @@ public function __construct($operation, $entityObject, $storeCode = null) $this->isJson = false; } + /** + * Get CurlHandler instance. + * + * @param string $operation + * @param EntityDataObject $entityObject + * @param string|null $storeCode + * + * @return CurlHandler + */ + public static function getInstance( + string $operation, + EntityDataObject $entityObject, + ?string $storeCode = null + ) { + if (self::$INSTANCE === null) { + return new self($operation, $entityObject, $storeCode); + } + + return self::$INSTANCE; + } + /** * Executes an api request based on parameters given by constructor. * diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php index 73ee2be19..0be6cc24e 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php @@ -86,7 +86,7 @@ public function createEntity($storeCode = null) if (!empty($storeCode)) { $this->storeCode = $storeCode; } - $curlHandler = new CurlHandler('create', $this->entityObject, $this->storeCode); + $curlHandler = CurlHandler::getInstance('create', $this->entityObject, $this->storeCode); $result = $curlHandler->executeRequest($this->dependentObjects); $this->setCreatedObject( $result, @@ -111,7 +111,7 @@ public function updateEntity($updateDataName, $updateDependentObjects = []) $this->dependentObjects[] = $dependentObject->getCreatedObject(); } $updateEntityObject = DataObjectHandler::getInstance()->getObject($updateDataName); - $curlHandler = new CurlHandler('update', $updateEntityObject, $this->storeCode); + $curlHandler = CurlHandler::getInstance('update', $updateEntityObject, $this->storeCode); $result = $curlHandler->executeRequest(array_merge($this->dependentObjects, [$this->createdObject])); $this->setCreatedObject( $result, @@ -134,7 +134,7 @@ public function getEntity($index = null, $storeCode = null) if (!empty($storeCode)) { $this->storeCode = $storeCode; } - $curlHandler = new CurlHandler('get', $this->entityObject, $this->storeCode); + $curlHandler = CurlHandler::getInstance('get', $this->entityObject, $this->storeCode); $result = $curlHandler->executeRequest($this->dependentObjects); $this->setCreatedObject( $result, @@ -152,7 +152,7 @@ public function getEntity($index = null, $storeCode = null) */ public function deleteEntity() { - $curlHandler = new CurlHandler('delete', $this->createdObject, $this->storeCode); + $curlHandler = CurlHandler::getInstance('delete', $this->createdObject, $this->storeCode); $curlHandler->executeRequest($this->dependentObjects); } From d46a66d439cff45c47b65f320a94418138ccb173 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Thu, 15 Jul 2021 11:45:39 +0300 Subject: [PATCH 018/674] 33293: Fixed static-test --- .../DataGenerator/Persist/CurlHandler.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php index 9931cc470..d5250c890 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php @@ -105,9 +105,9 @@ private function __construct($operation, $entityObject, $storeCode = null) /** * Get CurlHandler instance. * - * @param string $operation + * @param string $operation * @param EntityDataObject $entityObject - * @param string|null $storeCode + * @param string|null $storeCode * * @return CurlHandler */ From a449f0709bbe60e98882e2facd5dc284aebbf0d7 Mon Sep 17 00:00:00 2001 From: silinmykola Date: Fri, 16 Jul 2021 13:40:15 +0300 Subject: [PATCH 019/674] 33292 change tearDown method --- .../Console/BaseGenerateCommandTest.php | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php index ce43cde78..e0e1c7233 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php @@ -14,6 +14,18 @@ class BaseGenerateCommandTest extends TestCase { + public function tearDown(): void + { + $handler = TestObjectHandler::getInstance(); + $property = new \ReflectionProperty(TestObjectHandler::class, 'tests'); + $property->setAccessible(true); + $property->setValue($handler, []); + + $handler = SuiteObjectHandler::getInstance(); + $property = new \ReflectionProperty(SuiteObjectHandler::class, 'suiteObjects'); + $property->setAccessible(true); + $property->setValue($handler, []); + } public function testOneTestOneSuiteConfig() { $testOne = new TestObject('Test1', [], [], []); @@ -176,25 +188,11 @@ public function testSuiteToTestSyntax() */ public function mockHandlers($testArray, $suiteArray) { - $testObjectHandler = TestObjectHandler::getInstance(); - $reflection = new \ReflectionClass(TestObjectHandler::class); - $reflectionMethod = $reflection->getMethod('initTestData'); - $reflectionMethod->setAccessible(true); - $output = $reflectionMethod->invoke($testObjectHandler); - $this->assertEquals('', $output); - $handler = TestObjectHandler::getInstance(); $property = new \ReflectionProperty(TestObjectHandler::class, 'tests'); $property->setAccessible(true); $property->setValue($handler, $testArray); - $suiteObjectHandler = SuiteObjectHandler::getInstance(); - $reflection = new \ReflectionClass(SuiteObjectHandler::class); - $reflectionMethod = $reflection->getMethod('initSuiteData'); - $reflectionMethod->setAccessible(true); - $output = $reflectionMethod->invoke($suiteObjectHandler); - $this->assertEquals('', $output); - $handler = SuiteObjectHandler::getInstance(); $property = new \ReflectionProperty(SuiteObjectHandler::class, 'suiteObjects'); $property->setAccessible(true); From bbec23ac32d455607a696bbb20ede41386a68ce4 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Mon, 19 Jul 2021 15:26:02 +0300 Subject: [PATCH 020/674] 33292: aspect mock replacement, unit test refactoring --- .../Console/BaseGenerateCommandTest.php | 115 +++++++++++++----- 1 file changed, 83 insertions(+), 32 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php index e0e1c7233..fe486b615 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php @@ -3,30 +3,46 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace tests\unit\Magento\FunctionalTestFramework\Console; -use PHPUnit\Framework\TestCase; +use Exception; use Magento\FunctionalTestingFramework\Console\BaseGenerateCommand; -use Magento\FunctionalTestingFramework\Suite\Objects\SuiteObject; use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler; -use Magento\FunctionalTestingFramework\Test\Objects\TestObject; +use Magento\FunctionalTestingFramework\Suite\Objects\SuiteObject; use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; +use Magento\FunctionalTestingFramework\Test\Objects\TestObject; +use PHPUnit\Framework\TestCase; +use ReflectionClass; +use ReflectionException; +use ReflectionProperty; class BaseGenerateCommandTest extends TestCase { - public function tearDown(): void + /** + * @inheritDoc + */ + protected function tearDown(): void { $handler = TestObjectHandler::getInstance(); - $property = new \ReflectionProperty(TestObjectHandler::class, 'tests'); - $property->setAccessible(true); - $property->setValue($handler, []); + $testsProperty = new ReflectionProperty(TestObjectHandler::class, 'tests'); + $testsProperty->setAccessible(true); + $testsProperty->setValue($handler, []); + $testObjectHandlerProperty = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); + $testObjectHandlerProperty->setAccessible(true); + $testObjectHandlerProperty->setValue($handler); $handler = SuiteObjectHandler::getInstance(); - $property = new \ReflectionProperty(SuiteObjectHandler::class, 'suiteObjects'); - $property->setAccessible(true); - $property->setValue($handler, []); + $suiteObjectsProperty = new ReflectionProperty(SuiteObjectHandler::class, 'suiteObjects'); + $suiteObjectsProperty->setAccessible(true); + $suiteObjectsProperty->setValue($handler, []); + $suiteObjectHandlerProperty = new ReflectionProperty(SuiteObjectHandler::class, 'instance'); + $suiteObjectHandlerProperty->setAccessible(true); + $suiteObjectHandlerProperty->setValue($handler); } - public function testOneTestOneSuiteConfig() + + public function testOneTestOneSuiteConfig(): void { $testOne = new TestObject('Test1', [], [], []); $suiteOne = new SuiteObject('Suite1', ['Test1' => $testOne], [], []); @@ -41,7 +57,7 @@ public function testOneTestOneSuiteConfig() $this->assertEquals($expected, $actual); } - public function testOneTestTwoSuitesConfig() + public function testOneTestTwoSuitesConfig(): void { $testOne = new TestObject('Test1', [], [], []); $suiteOne = new SuiteObject('Suite1', ['Test1' => $testOne], [], []); @@ -57,7 +73,7 @@ public function testOneTestTwoSuitesConfig() $this->assertEquals($expected, $actual); } - public function testOneTestOneGroup() + public function testOneTestOneGroup(): void { $testOne = new TestObject('Test1', [], ['group' => ['Group1']], []); @@ -71,7 +87,7 @@ public function testOneTestOneGroup() $this->assertEquals($expected, $actual); } - public function testThreeTestsTwoGroup() + public function testThreeTestsTwoGroup(): void { $testOne = new TestObject('Test1', [], ['group' => ['Group1']], []); $testTwo = new TestObject('Test2', [], ['group' => ['Group1']], []); @@ -87,7 +103,7 @@ public function testThreeTestsTwoGroup() $this->assertEquals($expected, $actual); } - public function testOneTestOneSuiteOneGroupConfig() + public function testOneTestOneSuiteOneGroupConfig(): void { $testOne = new TestObject('Test1', [], ['group' => ['Group1']], []); $suiteOne = new SuiteObject('Suite1', ['Test1' => $testOne], [], []); @@ -102,7 +118,7 @@ public function testOneTestOneSuiteOneGroupConfig() $this->assertEquals($expected, $actual); } - public function testTwoTestOneSuiteTwoGroupConfig() + public function testTwoTestOneSuiteTwoGroupConfig(): void { $testOne = new TestObject('Test1', [], ['group' => ['Group1']], []); $testTwo = new TestObject('Test2', [], ['group' => ['Group2']], []); @@ -118,7 +134,7 @@ public function testTwoTestOneSuiteTwoGroupConfig() $this->assertEquals($expected, $actual); } - public function testTwoTestTwoSuiteOneGroupConfig() + public function testTwoTestTwoSuiteOneGroupConfig(): void { $testOne = new TestObject('Test1', [], ['group' => ['Group1']], []); $testTwo = new TestObject('Test2', [], ['group' => ['Group1']], []); @@ -137,10 +153,12 @@ public function testTwoTestTwoSuiteOneGroupConfig() /** * Test specific usecase of a test that is in a group with the group being called along with the suite - * i.e. run:group Group1 Suite1 - * @throws \Exception + * i.e. run:group Group1 Suite1. + * + * @return void + * @throws Exception */ - public function testThreeTestOneSuiteOneGroupMix() + public function testThreeTestOneSuiteOneGroupMix(): void { $testOne = new TestObject('Test1', [], [], []); $testTwo = new TestObject('Test2', [], [], []); @@ -162,7 +180,7 @@ public function testThreeTestOneSuiteOneGroupMix() $this->assertEquals($expected, $actual); } - public function testSuiteToTestSyntax() + public function testSuiteToTestSyntax(): void { $testOne = new TestObject('Test1', [], [], []); $suiteOne = new SuiteObject( @@ -181,49 +199,82 @@ public function testSuiteToTestSyntax() } /** - * Mock handlers to skip parsing + * Mock handlers to skip parsing. + * * @param array $testArray * @param array $suiteArray - * @throws \Exception + * + * @return void + * @throws Exception */ - public function mockHandlers($testArray, $suiteArray) + public function mockHandlers(array $testArray, array $suiteArray): void { + // bypass the initTestData method + $testObjectHandlerClass = new ReflectionClass(TestObjectHandler::class); + $constructor = $testObjectHandlerClass->getConstructor(); + $constructor->setAccessible(true); + $testObjectHandlerObject = $testObjectHandlerClass->newInstanceWithoutConstructor(); + $constructor->invoke($testObjectHandlerObject); + + $testObjectHandlerProperty = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); + $testObjectHandlerProperty->setAccessible(true); + $testObjectHandlerProperty->setValue($testObjectHandlerObject); + $handler = TestObjectHandler::getInstance(); - $property = new \ReflectionProperty(TestObjectHandler::class, 'tests'); + $property = new ReflectionProperty(TestObjectHandler::class, 'tests'); $property->setAccessible(true); $property->setValue($handler, $testArray); + // bypass the initTestData method + $suiteObjectHandlerClass = new ReflectionClass(SuiteObjectHandler::class); + $constructor = $suiteObjectHandlerClass->getConstructor(); + $constructor->setAccessible(true); + $suiteObjectHandlerObject = $suiteObjectHandlerClass->newInstanceWithoutConstructor(); + $constructor->invoke($suiteObjectHandlerObject); + + $suiteObjectHandlerProperty = new ReflectionProperty(SuiteObjectHandler::class, 'instance'); + $suiteObjectHandlerProperty->setAccessible(true); + $suiteObjectHandlerProperty->setValue($suiteObjectHandlerObject); + $handler = SuiteObjectHandler::getInstance(); - $property = new \ReflectionProperty(SuiteObjectHandler::class, 'suiteObjects'); + $property = new ReflectionProperty(SuiteObjectHandler::class, 'suiteObjects'); $property->setAccessible(true); $property->setValue($handler, $suiteArray); } /** - * Changes visibility and runs getTestAndSuiteConfiguration + * Changes visibility and runs getTestAndSuiteConfiguration. + * * @param array $testArray + * * @return string + * @throws ReflectionException */ - public function callTestConfig($testArray) + public function callTestConfig(array $testArray): string { $command = new BaseGenerateCommand(); - $class = new \ReflectionClass($command); + $class = new ReflectionClass($command); $method = $class->getMethod('getTestAndSuiteConfiguration'); $method->setAccessible(true); + return $method->invokeArgs($command, [$testArray]); } /** - * Changes visibility and runs getGroupAndSuiteConfiguration + * Changes visibility and runs getGroupAndSuiteConfiguration. + * * @param array $groupArray + * * @return string + * @throws ReflectionException */ - public function callGroupConfig($groupArray) + public function callGroupConfig(array $groupArray): string { $command = new BaseGenerateCommand(); - $class = new \ReflectionClass($command); + $class = new ReflectionClass($command); $method = $class->getMethod('getGroupAndSuiteConfiguration'); $method->setAccessible(true); + return $method->invokeArgs($command, [$groupArray]); } } From 93a3a5bfd6135473a4b3af62446530ca97005b82 Mon Sep 17 00:00:00 2001 From: Andrii Beziazychnyi Date: Fri, 16 Jul 2021 15:39:38 +0300 Subject: [PATCH 021/674] CE-32868: Updated "monolog" to the latest version 2.3.1 --- composer.json | 6 +++--- composer.lock | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index 15a28c947..94ff6a35f 100755 --- a/composer.json +++ b/composer.json @@ -25,8 +25,9 @@ "csharpru/vault-php": "^4.2.1", "csharpru/vault-php-guzzle6-transport": "^2.0", "hoa/console": "~3.0", - "monolog/monolog": "^2.2", + "monolog/monolog": "^2.3", "mustache/mustache": "~2.5", + "nikic/php-parser": "^4.4", "php-webdriver/webdriver": "^1.9.0", "spomky-labs/otphp": "^10.0", "symfony/console": "^4.4", @@ -35,8 +36,7 @@ "symfony/mime": "^5.0", "symfony/process": "^4.4", "vlucas/phpdotenv": "^2.4", - "weew/helpers-array": "^1.3", - "nikic/php-parser": "^4.4" + "weew/helpers-array": "^1.3" }, "require-dev": { "brainmaestro/composer-git-hooks": "^2.3.1", diff --git a/composer.lock b/composer.lock index cfc6e4f9e..e2110d79b 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": "6e848e638ba77ff322a62b24136fb06a", + "content-hash": "dcd4540cf1aed5a943189676f90f43cb", "packages": [ { "name": "allure-framework/allure-codeception", @@ -2635,16 +2635,16 @@ }, { "name": "monolog/monolog", - "version": "2.2.0", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084" + "reference": "9738e495f288eec0b187e310b7cdbbb285777dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1cb1cde8e8dd0f70cc0fe51354a59acad9302084", - "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/9738e495f288eec0b187e310b7cdbbb285777dbe", + "reference": "9738e495f288eec0b187e310b7cdbbb285777dbe", "shasum": "" }, "require": { @@ -2663,7 +2663,7 @@ "php-amqplib/php-amqplib": "~2.4", "php-console/php-console": "^3.1.3", "phpspec/prophecy": "^1.6.1", - "phpstan/phpstan": "^0.12.59", + "phpstan/phpstan": "^0.12.91", "phpunit/phpunit": "^8.5", "predis/predis": "^1.1", "rollbar/rollbar": "^1.3", @@ -2715,7 +2715,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.2.0" + "source": "https://github.com/Seldaek/monolog/tree/2.3.1" }, "funding": [ { @@ -2727,7 +2727,7 @@ "type": "tidelift" } ], - "time": "2020-12-14T13:15:25+00:00" + "time": "2021-07-14T11:56:39+00:00" }, { "name": "mtdowling/jmespath.php", From 1a71fe7cd5581e099ef39f3a6a853af8865bc323 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Tue, 20 Jul 2021 11:52:09 +0300 Subject: [PATCH 022/674] 33294: Eliminated aspect mock from AllureHelperTest --- .../Allure/AllureHelperTest.php | 100 ++++++++++++------ .../Allure/AllureHelper.php | 20 ++-- .../Allure/Event/AddUniqueAttachmentEvent.php | 83 +++++++++------ 3 files changed, 135 insertions(+), 68 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php index 9e0e8ca93..638db3702 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php @@ -3,11 +3,14 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace tests\unit\Magento\FunctionalTestFramework\Allure; use Magento\FunctionalTestingFramework\Allure\AllureHelper; use Magento\FunctionalTestingFramework\Allure\Event\AddUniqueAttachmentEvent; use PHPUnit\Framework\TestCase; +use ReflectionProperty; use Yandex\Allure\Adapter\Allure; use Yandex\Allure\Adapter\AllureException; use Yandex\Allure\Adapter\Event\StepFinishedEvent; @@ -16,25 +19,32 @@ class AllureHelperTest extends TestCase { - const MOCK_FILENAME = 'filename'; + private const MOCK_FILENAME = 'filename'; /** - * Clear Allure Lifecycle + * Clear Allure Lifecycle. + * + * @return void */ - public function tearDown(): void + protected function tearDown(): void { Allure::setDefaultLifecycle(); + $instanceProperty = new ReflectionProperty(AddUniqueAttachmentEvent::class, 'instance'); + $instanceProperty->setAccessible(true); + $instanceProperty->setValue(null); } /** - * AddAttachmentToStep should add an attachment to the current step + * The AddAttachmentToStep should add an attachment to the current step. + * + * @return void * @throws AllureException */ - public function testAddAttachmentToStep() + public function testAddAttachmentToStep(): void { - $this->mockAttachmentWriteEvent(); - $expectedData = "string"; - $expectedCaption = "caption"; + $expectedData = 'string'; + $expectedCaption = 'caption'; + $this->mockAttachmentWriteEvent($expectedData, $expectedCaption); //Prepare Allure lifecycle Allure::lifecycle()->fire(new StepStartedEvent('firstStep')); @@ -49,14 +59,16 @@ public function testAddAttachmentToStep() } /** - * AddAttachmentToLastStep should add an attachment only to the last step + * The AddAttachmentToLastStep should add an attachment only to the last step. + * + * @return void * @throws AllureException */ - public function testAddAttachmentToLastStep() + public function testAddAttachmentToLastStep(): void { - $this->mockAttachmentWriteEvent(); - $expectedData = "string"; - $expectedCaption = "caption"; + $expectedData = 'string'; + $expectedCaption = 'caption'; + $this->mockAttachmentWriteEvent($expectedData, $expectedCaption); //Prepare Allure lifecycle Allure::lifecycle()->fire(new StepStartedEvent('firstStep')); @@ -85,14 +97,15 @@ public function testAddAttachmentToLastStep() } /** - * AddAttachment actions should have files with different attachment names + * The AddAttachment actions should have files with different attachment names. + * + * @return void * @throws AllureException */ - public function testAddAttachementUniqueName() + public function testAddAttachmentUniqueName(): void { - $expectedData = "string"; - $expectedCaption = "caption"; - + $expectedData = 'string'; + $expectedCaption = 'caption'; $this->mockCopyFile($expectedData, $expectedCaption); //Prepare Allure lifecycle @@ -110,27 +123,52 @@ public function testAddAttachementUniqueName() } /** - * Mock entire attachment writing mechanisms + * Mock entire attachment writing mechanisms. + * + * @param string $filePathOrContents + * @param string $caption + * + * @return void */ - public function mockAttachmentWriteEvent() + private function mockAttachmentWriteEvent(string $filePathOrContents, string $caption): void { - $this->createMock(AddUniqueAttachmentEvent::class) - ->expects($this->any()) + $mockInstance = $this->getMockBuilder(AddUniqueAttachmentEvent::class) + ->setConstructorArgs([$filePathOrContents, $caption]) + ->disallowMockingUnknownTypes() + ->onlyMethods(['getAttachmentFileName']) + ->getMock(); + + $mockInstance ->method('getAttachmentFileName') ->willReturn(self::MOCK_FILENAME); + + $instanceProperty = new ReflectionProperty(AddUniqueAttachmentEvent::class, 'instance'); + $instanceProperty->setAccessible(true); + $instanceProperty->setValue($mockInstance, $mockInstance); } /** - * Mock only file writing mechanism - * @throws \ReflectionException + * Mock only file writing mechanism. + * + * @param string $filePathOrContents + * @param string $caption + * + * @return void */ - public function mockCopyFile(string $expectedData, string $expectedCaption) + private function mockCopyFile(string $filePathOrContents, string $caption): void { - $addUniqueAttachmentEvent = new AddUniqueAttachmentEvent($expectedData, $expectedCaption); - $reflection = new \ReflectionClass(AddUniqueAttachmentEvent::class); - $reflectionMethod = $reflection->getMethod('copyFile'); - $reflectionMethod->setAccessible(true); - $output = $reflectionMethod->invoke($addUniqueAttachmentEvent); - $this->assertEquals(true, $output); + $mockInstance = $this->getMockBuilder(AddUniqueAttachmentEvent::class) + ->setConstructorArgs([$filePathOrContents, $caption]) + ->disallowMockingUnknownTypes() + ->onlyMethods(['copyFile']) + ->getMock(); + + $mockInstance + ->method('copyFile') + ->willReturn(true); + + $instanceProperty = new ReflectionProperty(AddUniqueAttachmentEvent::class, 'instance'); + $instanceProperty->setAccessible(true); + $instanceProperty->setValue($mockInstance, $mockInstance); } } diff --git a/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php b/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php index 58bbc55b8..6263908bc 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php +++ b/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php @@ -3,34 +3,40 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace Magento\FunctionalTestingFramework\Allure; use Magento\FunctionalTestingFramework\Allure\Event\AddUniqueAttachmentEvent; use Yandex\Allure\Adapter\Allure; -use Yandex\Allure\Adapter\Event\AddAttachmentEvent; +use Yandex\Allure\Adapter\AllureException; class AllureHelper { /** - * Adds attachment to the current step + * Adds attachment to the current step. + * * @param mixed $data * @param string $caption - * @throws \Yandex\Allure\Adapter\AllureException + * * @return void + * @throws AllureException */ - public static function addAttachmentToCurrentStep($data, $caption) + public static function addAttachmentToCurrentStep($data, $caption): void { - Allure::lifecycle()->fire(new AddUniqueAttachmentEvent($data, $caption)); + Allure::lifecycle()->fire(AddUniqueAttachmentEvent::getInstance($data, $caption)); } /** * Adds Attachment to the last executed step. * Use this when adding attachments outside of an $I->doSomething() step/context. + * * @param mixed $data * @param string $caption + * * @return void */ - public static function addAttachmentToLastStep($data, $caption) + public static function addAttachmentToLastStep($data, $caption): void { $rootStep = Allure::lifecycle()->getStepStorage()->getLast(); $trueLastStep = array_last($rootStep->getSteps()); @@ -40,7 +46,7 @@ public static function addAttachmentToLastStep($data, $caption) return; } - $attachmentEvent = new AddUniqueAttachmentEvent($data, $caption); + $attachmentEvent = AddUniqueAttachmentEvent::getInstance($data, $caption); $attachmentEvent->process($trueLastStep); } } diff --git a/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php b/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php index bf16e5b49..c5e7c0d31 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php +++ b/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php @@ -1,35 +1,63 @@ guessFileMimeType($filePath); - $this->type = $type; } - $fileExtension = $this->guessFileExtension($type); - $fileSha1 = uniqid(sha1_file($filePath)); $outputPath = parent::getOutputPath($fileSha1, $fileExtension); + if (!$this->copyFile($filePath, $outputPath)) { throw new AllureException("Failed to copy attachment from $filePath to $outputPath."); } @@ -56,51 +82,48 @@ public function getAttachmentFileName($filePathOrContents, $type) /** * Copies file from one path to another. Wrapper for mocking in unit test. + * * @param string $filePath * @param string $outputPath + * * @return boolean */ - private function copyFile($filePath, $outputPath) + public function copyFile(string $filePath, string $outputPath): bool { return copy($filePath, $outputPath); } /** - * Copy of parent private function + * Copy of parent private function. + * * @param string $filePath + * * @return string */ - private function guessFileMimeType($filePath) + private function guessFileMimeType(string $filePath): string { $type = MimeTypes::getDefault()->guessMimeType($filePath); + if (!isset($type)) { - return DEFAULT_MIME_TYPE; + return self::DEFAULT_MIME_TYPE; } return $type; } /** - * Copy of parent private function + * Copy of parent private function. + * * @param string $mimeType + * * @return string */ - private function guessFileExtension($mimeType) + private function guessFileExtension(string $mimeType): string { $candidate = MimeTypes::getDefault()->getExtensions($mimeType); + if (empty($candidate)) { - return DEFAULT_FILE_EXTENSION; + return self::DEFAULT_FILE_EXTENSION; } return reset($candidate); } - - /** - * Copy of parent private function - * @param string $sha1 - * @param string $extension - * @return string - */ - public function getOutputFileName($sha1, $extension) - { - return $sha1 . '-attachment.' . $extension; - } } From 15a240ec7a5875846088e2d534dd47cbab42bb5d Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Wed, 21 Jul 2021 08:35:19 +0300 Subject: [PATCH 023/674] 33305: Removed an extra line --- dev/tests/unit/Util/MagentoTestCase.php | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/tests/unit/Util/MagentoTestCase.php b/dev/tests/unit/Util/MagentoTestCase.php index c34236fc1..bb38a0b5c 100644 --- a/dev/tests/unit/Util/MagentoTestCase.php +++ b/dev/tests/unit/Util/MagentoTestCase.php @@ -22,7 +22,6 @@ public static function setUpBeforeClass(): void // Should be used to clean AspectMock mocking before using PHPUnit mocking and Reflection. AspectMock::clean(); parent::setUpBeforeClass(); - parent::setUpBeforeClass(); } /** From 7cc350ae7fe22a74b13475a3fd787ef5f7135d4a Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Wed, 21 Jul 2021 17:24:32 +0300 Subject: [PATCH 024/674] 33304: code refactoring, fixing test failed for all test cases --- .../Test/Util/ActionMergeUtilTest.php | 58 ++++++++++--------- dev/tests/unit/Util/MagentoTestCase.php | 2 + 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php index 099d8ef81..56bb0f0c5 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php @@ -3,6 +3,8 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace tests\unit\Magento\FunctionalTestFramework\Test\Util; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; @@ -12,16 +14,18 @@ use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Test\Util\ActionMergeUtil; use Magento\FunctionalTestingFramework\Test\Util\ActionObjectExtractor; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\TestLoggingUtil; class ActionMergeUtilTest extends MagentoTestCase { /** - * Before test functionality + * Before test functionality. + * * @return void */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -30,8 +34,10 @@ public function setUp(): void * Test to validate actions are properly ordered during a merge. * * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testResolveActionStepOrdering() + public function testResolveActionStepOrdering(): void { $actions = []; $actionsLength = 11; @@ -45,7 +51,6 @@ public function testResolveActionStepOrdering() $stepKey = 'stepKey'. $i; $type = 'testType'; $actionAttributes = []; - $actions[] = new ActionObject($stepKey, $type, $actionAttributes); } @@ -92,8 +97,10 @@ public function testResolveActionStepOrdering() * Test to validate action steps properly resolve entity data references. * * @return void + * @throws TestReferenceException + * @throws XmlException */ - public function testResolveActionStepEntityData() + public function testResolveActionStepEntityData(): void { $dataObjectName = 'myObject'; $dataObjectType = 'testObject'; @@ -110,40 +117,34 @@ public function testResolveActionStepEntityData() // Set up mock DataObject Handler $mockDOHInstance = $this->createMock(DataObjectHandler::class); - $mockDOHInstance->expects($this->any()) + $mockDOHInstance + ->expects($this->any()) ->method('getObject') ->willReturn($mockDataObject); - $property = new \ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); + $property = new ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($mockDOHInstance); + $property->setValue($mockDOHInstance, $mockDOHInstance); // Create test object and action object $actionAttributes = [$userInputKey => $userInputValue]; $actions[$actionName] = new ActionObject($actionName, $actionType, $actionAttributes); - $this->assertEquals($userInputValue, $actions[$actionName]->getCustomActionAttributes()[$userInputKey]); $mergeUtil = new ActionMergeUtil("test", "TestCase"); $resolvedActions = $mergeUtil->resolveActionSteps($actions); - $this->assertEquals($dataFieldValue, $resolvedActions[$actionName]->getCustomActionAttributes()[$userInputKey]); } /** * Verify that an XmlException is thrown when an action references a non-existant action. * - * @throws TestReferenceException - * @throws XmlException * @return void - */ - /** * @throws TestReferenceException * @throws XmlException */ - public function testNoActionException() + public function testNoActionException(): void { $actionObjects = []; - $actionObjects[] = new ActionObject('actionKey1', 'bogusType', []); $actionObjects[] = new ActionObject( 'actionKey2', @@ -153,8 +154,7 @@ public function testNoActionException() ActionObject::MERGE_ACTION_ORDER_BEFORE ); - $this->expectException(\Magento\FunctionalTestingFramework\Exceptions\XmlException::class); - + $this->expectException(XmlException::class); $actionMergeUtil = new ActionMergeUtil("actionMergeUtilTest", "TestCase"); $actionMergeUtil->resolveActionSteps($actionObjects); } @@ -162,11 +162,11 @@ public function testNoActionException() /** * Verify that a action is added after actions that have a wait (timeout property). * + * @return void * @throws TestReferenceException * @throws XmlException - * @return void */ - public function testInsertWait() + public function testInsertWait(): void { $actionObjectOne = new ActionObject('actionKey1', 'bogusType', []); $actionObjectOne->setTimeout(42); @@ -189,10 +189,11 @@ public function testInsertWait() /** * Verify that a action is replaced by when secret _CREDS are referenced. * + * @return void * @throws TestReferenceException * @throws XmlException */ - public function testValidFillFieldSecretFunction() + public function testValidFillFieldSecretFunction(): void { $actionObjectOne = new ActionObject( 'actionKey1', @@ -202,7 +203,6 @@ public function testValidFillFieldSecretFunction() $actionObject = [$actionObjectOne]; $actionMergeUtil = new ActionMergeUtil('actionMergeUtilTest', 'TestCase'); - $result = $actionMergeUtil->resolveActionSteps($actionObject); $expectedValue = new ActionObject( @@ -216,10 +216,11 @@ public function testValidFillFieldSecretFunction() /** * Verify that a action uses when secret _CREDS are referenced. * + * @return void * @throws TestReferenceException * @throws XmlException */ - public function testValidMagentoCLISecretFunction() + public function testValidMagentoCLISecretFunction(): void { $actionObjectOne = new ActionObject( 'actionKey1', @@ -229,7 +230,6 @@ public function testValidMagentoCLISecretFunction() $actionObject = [$actionObjectOne]; $actionMergeUtil = new ActionMergeUtil('actionMergeUtilTest', 'TestCase'); - $result = $actionMergeUtil->resolveActionSteps($actionObject); $expectedValue = new ActionObject( @@ -243,10 +243,11 @@ public function testValidMagentoCLISecretFunction() /** * Verify that a override in a action uses when secret _CREDS are referenced. * + * @return void * @throws TestReferenceException * @throws XmlException */ - public function testValidCreateDataSecretFunction() + public function testValidCreateDataSecretFunction(): void { $actionObjectOne = new ActionObject( 'actionKey1', @@ -256,7 +257,6 @@ public function testValidCreateDataSecretFunction() $actionObject = [$actionObjectOne]; $actionMergeUtil = new ActionMergeUtil('actionMergeUtilTest', 'TestCase'); - $result = $actionMergeUtil->resolveActionSteps($actionObject); $expectedValue = new ActionObject( @@ -270,10 +270,11 @@ public function testValidCreateDataSecretFunction() /** * Verify that a action throws an exception when secret _CREDS are referenced. * + * @return void * @throws TestReferenceException * @throws XmlException */ - public function testInvalidSecretFunctions() + public function testInvalidSecretFunctions(): void { $this->expectException(TestReferenceException::class); $this->expectExceptionMessage( @@ -292,7 +293,8 @@ public function testInvalidSecretFunctions() } /** - * After class functionality + * After class functionality. + * * @return void */ public static function tearDownAfterClass(): void diff --git a/dev/tests/unit/Util/MagentoTestCase.php b/dev/tests/unit/Util/MagentoTestCase.php index 7760acfc6..bb38a0b5c 100644 --- a/dev/tests/unit/Util/MagentoTestCase.php +++ b/dev/tests/unit/Util/MagentoTestCase.php @@ -19,6 +19,8 @@ public static function setUpBeforeClass(): void if (!self::fileExists(DOCS_OUTPUT_DIR)) { mkdir(DOCS_OUTPUT_DIR, 0755, true); } + // Should be used to clean AspectMock mocking before using PHPUnit mocking and Reflection. + AspectMock::clean(); parent::setUpBeforeClass(); } From 4bcfac1046f355dc612089b3dd1a4de3a557b5dd Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Wed, 21 Jul 2021 18:03:29 +0300 Subject: [PATCH 025/674] 33294: Code refactoring after code review --- .../Allure/Event/AddUniqueAttachmentEvent.php | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php b/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php index c5e7c0d31..ccf95eb37 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php +++ b/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php @@ -21,30 +21,6 @@ class AddUniqueAttachmentEvent extends AddAttachmentEvent */ private static $instance; - /** - * An alternative way to instantiate an instance of this class. Used to mock this class object in unit tests. - * - * @param mixed $filePathOrContents - * @param string $caption - * @param string|null $type - * - * @return AddUniqueAttachmentEvent - */ - public static function getInstance( - $filePathOrContents, - string $caption, - ?string $type = null - ): AddUniqueAttachmentEvent { - if (!self::$instance) { - self::$instance = new AddUniqueAttachmentEvent( - $filePathOrContents, - $caption, - $type - ); - } - return self::$instance; - } - /** * Near copy of parent function, added uniqid call for filename to prevent buggy allure behavior. * @@ -93,6 +69,30 @@ public function copyFile(string $filePath, string $outputPath): bool return copy($filePath, $outputPath); } + /** + * Unit test helper function. + * + * @param mixed $filePathOrContents + * @param string $caption + * @param string|null $type + * + * @return AddUniqueAttachmentEvent + */ + public static function getInstance( + $filePathOrContents, + string $caption, + ?string $type = null + ): AddUniqueAttachmentEvent { + if (!self::$instance) { + self::$instance = new AddUniqueAttachmentEvent( + $filePathOrContents, + $caption, + $type + ); + } + return self::$instance; + } + /** * Copy of parent private function. * From c858eb1a0d82691913e13ba85f353023ab80b33a Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Wed, 21 Jul 2021 18:28:26 -0500 Subject: [PATCH 026/674] MQE-2806: changelog and version bump for release 3.6.0 --- CHANGELOG.md | 19 ++++++++++++++++++- composer.json | 2 +- composer.lock | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 328824514..741a15260 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ Magento Functional Testing Framework Changelog ================================================ +3.6.0 +--------- + +### Enhancements + +* Maintainability + * Updated composer dependencies to be PHP 8 compatible with the except of codeception/aspect-mock. + +### GitHub Pull Requests: + +* [#830](https://github.com/magento/magento2-functional-testing-framework/pull/830) -- Add ability to configure multiple OTPs +* [#832](https://github.com/magento/magento2-functional-testing-framework/pull/832) -- Updated monolog/monolog to ^2.2 +* [#833](https://github.com/magento/magento2-functional-testing-framework/pull/833) -- Removed usage of AspectMock in FilesystemTest +* [#834](https://github.com/magento/magento2-functional-testing-framework/pull/834) -- Removed usage of AspectMock in AnnotationsCheckTest +* [#838](https://github.com/magento/magento2-functional-testing-framework/pull/838) -- Removed usage of AspectMock in DeprecatedEntityUsageCheckTest +* [#841](https://github.com/magento/magento2-functional-testing-framework/pull/841) -- Removed usage of AspectMock in GenerationErrorHandlerTest +* [#854](https://github.com/magento/magento2-functional-testing-framework/pull/854) -- Updated "monolog" to the latest version 2.3.1 + 3.5.1 --------- @@ -7,7 +25,6 @@ Magento Functional Testing Framework Changelog * [#825](https://github.com/magento/magento2-functional-testing-framework/pull/825) -- Update allure-codeception in order to support php8 - 3.5.0 --------- diff --git a/composer.json b/composer.json index 94ff6a35f..bdf92ca3d 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": "3.5.1", + "version": "3.6.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index e2110d79b..226426ef8 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": "dcd4540cf1aed5a943189676f90f43cb", + "content-hash": "9bec96d8a169a4286803657bbf61004c", "packages": [ { "name": "allure-framework/allure-codeception", From 3bf364839d6df276abd6ee775371d178b811a244 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Thu, 22 Jul 2021 12:02:06 +0300 Subject: [PATCH 027/674] 33294: Code refactoring after code review --- .../Allure/AllureHelperTest.php | 26 --------------- .../Allure/Event/AddUniqueAttachmentEvent.php | 32 +++++++++++-------- 2 files changed, 19 insertions(+), 39 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php index 638db3702..1e17b780d 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php @@ -106,7 +106,6 @@ public function testAddAttachmentUniqueName(): void { $expectedData = 'string'; $expectedCaption = 'caption'; - $this->mockCopyFile($expectedData, $expectedCaption); //Prepare Allure lifecycle Allure::lifecycle()->fire(new StepStartedEvent('firstStep')); @@ -146,29 +145,4 @@ private function mockAttachmentWriteEvent(string $filePathOrContents, string $ca $instanceProperty->setAccessible(true); $instanceProperty->setValue($mockInstance, $mockInstance); } - - /** - * Mock only file writing mechanism. - * - * @param string $filePathOrContents - * @param string $caption - * - * @return void - */ - private function mockCopyFile(string $filePathOrContents, string $caption): void - { - $mockInstance = $this->getMockBuilder(AddUniqueAttachmentEvent::class) - ->setConstructorArgs([$filePathOrContents, $caption]) - ->disallowMockingUnknownTypes() - ->onlyMethods(['copyFile']) - ->getMock(); - - $mockInstance - ->method('copyFile') - ->willReturn(true); - - $instanceProperty = new ReflectionProperty(AddUniqueAttachmentEvent::class, 'instance'); - $instanceProperty->setAccessible(true); - $instanceProperty->setValue($mockInstance, $mockInstance); - } } diff --git a/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php b/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php index ccf95eb37..990cd5f10 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php +++ b/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php @@ -7,6 +7,8 @@ namespace Magento\FunctionalTestingFramework\Allure\Event; +use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Symfony\Component\Mime\MimeTypes; use Yandex\Allure\Adapter\AllureException; use Yandex\Allure\Adapter\Event\AddAttachmentEvent; @@ -56,19 +58,6 @@ public function getAttachmentFileName($filePathOrContents, $type): string return $this->getOutputFileName($fileSha1, $fileExtension); } - /** - * Copies file from one path to another. Wrapper for mocking in unit test. - * - * @param string $filePath - * @param string $outputPath - * - * @return boolean - */ - public function copyFile(string $filePath, string $outputPath): bool - { - return copy($filePath, $outputPath); - } - /** * Unit test helper function. * @@ -93,6 +82,23 @@ public static function getInstance( return self::$instance; } + /** + * Copies file from one path to another. Wrapper for mocking in unit test. + * + * @param string $filePath + * @param string $outputPath + * + * @return boolean + * @throws TestFrameworkException + */ + private function copyFile(string $filePath, string $outputPath): bool + { + if (MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::UNIT_TEST_PHASE) { + return true; + } + return copy($filePath, $outputPath); + } + /** * Copy of parent private function. * From 1fdb5b9b96dd7cd0c668c2f30b06a7bd2e50bb95 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Thu, 22 Jul 2021 12:36:17 +0300 Subject: [PATCH 028/674] 33305: Code refactoring after code review --- .../Test/Util/ObjectExtensionUtilTest.php | 133 +++++++++--------- .../unit/Util/MockModuleResolverBuilder.php | 33 ++--- 2 files changed, 76 insertions(+), 90 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php index fc1893e0b..b30e4b50e 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php @@ -15,7 +15,6 @@ use Magento\FunctionalTestingFramework\Test\Parsers\TestDataParser; use PHPUnit\Framework\TestCase; use ReflectionProperty; -use tests\unit\Util\MockModuleResolverBuilder; use tests\unit\Util\TestDataArrayBuilder; use tests\unit\Util\TestLoggingUtil; @@ -30,8 +29,6 @@ class ObjectExtensionUtilTest extends TestCase protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup(); } /** @@ -53,7 +50,7 @@ public static function tearDownAfterClass(): void public function testGenerateExtendedTest(): void { $mockActions = [ - "mockStep" => ["nodeName" => "mockNode", "stepKey" => "mockStep"] + 'mockStep' => ['nodeName' => 'mockNode', 'stepKey' => 'mockStep'] ]; $testDataArrayBuilder = new TestDataArrayBuilder(); @@ -66,7 +63,7 @@ public function testGenerateExtendedTest(): void $mockExtendedTest = $testDataArrayBuilder ->withName('extendedTest') ->withAnnotations(['title' => [['value' => 'extendedTest']]]) - ->withTestReference("simpleTest") + ->withTestReference('simpleTest') ->build(); $mockTestData = array_merge($mockSimpleTest, $mockExtendedTest); @@ -83,8 +80,8 @@ public function testGenerateExtendedTest(): void ); // assert that expected test is generated - $this->assertEquals($testObject->getParentName(), "simpleTest"); - $this->assertArrayHasKey("mockStep", $testObject->getOrderedActions()); + $this->assertEquals($testObject->getParentName(), 'simpleTest'); + $this->assertArrayHasKey('mockStep', $testObject->getOrderedActions()); } /** @@ -96,10 +93,10 @@ public function testGenerateExtendedTest(): void public function testGenerateExtendedWithHooks(): void { $mockBeforeHooks = [ - "beforeHookAction" => ["nodeName" => "mockNodeBefore", "stepKey" => "mockStepBefore"] + 'beforeHookAction' => ['nodeName' => 'mockNodeBefore', 'stepKey' => 'mockStepBefore'] ]; $mockAfterHooks = [ - "afterHookAction" => ["nodeName" => "mockNodeAfter", "stepKey" => "mockStepAfter"] + 'afterHookAction' => ['nodeName' => 'mockNodeAfter', 'stepKey' => 'mockStepAfter'] ]; $testDataArrayBuilder = new TestDataArrayBuilder(); @@ -113,7 +110,7 @@ public function testGenerateExtendedWithHooks(): void $mockExtendedTest = $testDataArrayBuilder ->withName('extendedTest') ->withAnnotations(['title' => [['value' => 'extendedTest']]]) - ->withTestReference("simpleTest") + ->withTestReference('simpleTest') ->build(); $mockTestData = array_merge($mockSimpleTest, $mockExtendedTest); @@ -130,9 +127,9 @@ public function testGenerateExtendedWithHooks(): void ); // assert that expected test is generated - $this->assertEquals($testObject->getParentName(), "simpleTest"); - $this->assertArrayHasKey("mockStepBefore", $testObject->getHooks()['before']->getActions()); - $this->assertArrayHasKey("mockStepAfter", $testObject->getHooks()['after']->getActions()); + $this->assertEquals($testObject->getParentName(), 'simpleTest'); + $this->assertArrayHasKey('mockStepBefore', $testObject->getHooks()['before']->getActions()); + $this->assertArrayHasKey('mockStepAfter', $testObject->getHooks()['after']->getActions()); } /** @@ -146,7 +143,7 @@ public function testExtendedTestNoParent(): void $testDataArrayBuilder = new TestDataArrayBuilder(); $mockExtendedTest = $testDataArrayBuilder ->withName('extendedTest') - ->withTestReference("simpleTest") + ->withTestReference('simpleTest') ->build(); $mockTestData = array_merge($mockExtendedTest); @@ -158,7 +155,7 @@ public function testExtendedTestNoParent(): void // validate log statement TestLoggingUtil::getInstance()->validateMockLogStatement( 'debug', - "parent test not defined. test will be skipped", + 'parent test not defined. test will be skipped', ['parent' => 'simpleTest', 'test' => 'extendedTest'] ); } @@ -181,19 +178,19 @@ public function testExtendingExtendedTest(): void ->withName('simpleTest') ->withAnnotations(['title' => [['value' => 'simpleTest']]]) ->withTestActions() - ->withTestReference("anotherTest") + ->withTestReference('anotherTest') ->build(); $mockExtendedTest = $testDataArrayBuilder ->withName('extendedTest') ->withAnnotations(['title' => [['value' => 'extendedTest']]]) - ->withTestReference("simpleTest") + ->withTestReference('simpleTest') ->build(); $mockTestData = array_merge($mockParentTest, $mockSimpleTest, $mockExtendedTest); $this->setMockTestOutput($mockTestData); - $this->expectExceptionMessage("Cannot extend a test that already extends another test. Test: simpleTest"); + $this->expectExceptionMessage('Cannot extend a test that already extends another test. Test: simpleTest'); // parse and generate test object with mocked data TestObjectHandler::getInstance()->getObject('extendedTest'); @@ -201,10 +198,10 @@ public function testExtendingExtendedTest(): void // validate log statement TestLoggingUtil::getInstance()->validateMockLogStatement( 'debug', - "parent test not defined. test will be skipped", + 'parent test not defined. test will be skipped', ['parent' => 'simpleTest', 'test' => 'extendedTest'] ); - $this->expectOutputString("Extending Test: anotherTest => simpleTest" . PHP_EOL); + $this->expectOutputString('Extending Test: anotherTest => simpleTest' . PHP_EOL); } /** @@ -216,30 +213,30 @@ public function testExtendingExtendedTest(): void public function testGenerateExtendedActionGroup(): void { $mockSimpleActionGroup = [ - "nodeName" => "actionGroup", - "name" => "mockSimpleActionGroup", - "filename" => "someFile", - "commentHere" => [ - "nodeName" => "comment", - "selector" => "selector", - "stepKey" => "commentHere" + 'nodeName' => 'actionGroup', + 'name' => 'mockSimpleActionGroup', + 'filename' => 'someFile', + 'commentHere' => [ + 'nodeName' => 'comment', + 'selector' => 'selector', + 'stepKey' => 'commentHere' ], - "parentComment" => [ - "nodeName" => "comment", - "selector" => "parentSelector", - "stepKey" => "parentComment" + 'parentComment' => [ + 'nodeName' => 'comment', + 'selector' => 'parentSelector', + 'stepKey' => 'parentComment' ], ]; $mockExtendedActionGroup = [ - "nodeName" => "actionGroup", - "name" => "mockExtendedActionGroup", - "filename" => "someFile", - "extends" => "mockSimpleActionGroup", - "commentHere" => [ - "nodeName" => "comment", - "selector" => "otherSelector", - "stepKey" => "commentHere" + 'nodeName' => 'actionGroup', + 'name' => 'mockExtendedActionGroup', + 'filename' => 'someFile', + 'extends' => 'mockSimpleActionGroup', + 'commentHere' => [ + 'nodeName' => 'comment', + 'selector' => 'otherSelector', + 'stepKey' => 'commentHere' ], ]; @@ -262,10 +259,10 @@ public function testGenerateExtendedActionGroup(): void ); // assert that expected test is generated - $this->assertEquals("mockSimpleActionGroup", $actionGroupObject->getParentName()); + $this->assertEquals('mockSimpleActionGroup', $actionGroupObject->getParentName()); $actions = $actionGroupObject->getActions(); - $this->assertEquals("otherSelector", $actions["commentHere"]->getCustomActionAttributes()["selector"]); - $this->assertEquals("parentSelector", $actions["parentComment"]->getCustomActionAttributes()["selector"]); + $this->assertEquals('otherSelector', $actions['commentHere']->getCustomActionAttributes()['selector']); + $this->assertEquals('parentSelector', $actions['parentComment']->getCustomActionAttributes()['selector']); } /** @@ -277,14 +274,14 @@ public function testGenerateExtendedActionGroup(): void public function testGenerateExtendedActionGroupNoParent(): void { $mockExtendedActionGroup = [ - "nodeName" => "actionGroup", - "name" => "mockExtendedActionGroup", - "filename" => "someFile", - "extends" => "mockSimpleActionGroup", - "commentHere" => [ - "nodeName" => "comment", - "selector" => "otherSelector", - "stepKey" => "commentHere" + 'nodeName' => 'actionGroup', + 'name' => 'mockExtendedActionGroup', + 'filename' => 'someFile', + 'extends' => 'mockSimpleActionGroup', + 'commentHere' => [ + 'nodeName' => 'comment', + 'selector' => 'otherSelector', + 'stepKey' => 'commentHere' ], ]; @@ -296,7 +293,7 @@ public function testGenerateExtendedActionGroupNoParent(): void $this->setMockTestOutput(null, $mockActionGroupData); $this->expectExceptionMessage( - "Parent Action Group mockSimpleActionGroup not defined for Test " . $mockExtendedActionGroup['name'] + 'Parent Action Group mockSimpleActionGroup not defined for Test ' . $mockExtendedActionGroup['name'] ); // parse and generate test object with mocked data @@ -312,23 +309,23 @@ public function testGenerateExtendedActionGroupNoParent(): void public function testExtendingExtendedActionGroup(): void { $mockParentActionGroup = [ - "nodeName" => "actionGroup", - "name" => "mockParentActionGroup", - "filename" => "someFile" + 'nodeName' => 'actionGroup', + 'name' => 'mockParentActionGroup', + 'filename' => 'someFile' ]; $mockSimpleActionGroup = [ - "nodeName" => "actionGroup", - "name" => "mockSimpleActionGroup", - "filename" => "someFile", - "extends" => "mockParentActionGroup", + 'nodeName' => 'actionGroup', + 'name' => 'mockSimpleActionGroup', + 'filename' => 'someFile', + 'extends' => 'mockParentActionGroup' ]; $mockExtendedActionGroup = [ - "nodeName" => "actionGroup", - "name" => "mockExtendedActionGroup", - "filename" => "someFile", - "extends" => "mockSimpleActionGroup", + 'nodeName' => 'actionGroup', + 'name' => 'mockExtendedActionGroup', + 'filename' => 'someFile', + 'extends' => 'mockSimpleActionGroup' ]; $mockActionGroupData = [ @@ -341,22 +338,22 @@ public function testExtendingExtendedActionGroup(): void $this->setMockTestOutput(null, $mockActionGroupData); $this->expectExceptionMessage( - "Cannot extend an action group that already extends another action group. " . $mockSimpleActionGroup['name'] + 'Cannot extend an action group that already extends another action group. ' . $mockSimpleActionGroup['name'] ); // parse and generate test object with mocked data try { ActionGroupObjectHandler::getInstance()->getObject('mockExtendedActionGroup'); - } catch (Exception $e) { + } catch (Exception $exception) { // validate log statement TestLoggingUtil::getInstance()->validateMockLogStatement( 'error', - "Cannot extend an action group that already extends another action group. " . + 'Cannot extend an action group that already extends another action group. ' . $mockSimpleActionGroup['name'], ['parent' => $mockSimpleActionGroup['name'], 'actionGroup' => $mockExtendedActionGroup['name']] ); - throw $e; + throw $exception; } } @@ -379,7 +376,7 @@ public function testExtendedTestSkippedParent(): void $testDataArrayBuilder->reset(); $mockExtendedTest = $testDataArrayBuilder ->withName('extendTest') - ->withTestReference("baseTest") + ->withTestReference('baseTest') ->build(); $mockTestData = array_merge($mockParentTest, $mockExtendedTest); @@ -391,7 +388,7 @@ public function testExtendedTestSkippedParent(): void // validate log statement TestLoggingUtil::getInstance()->validateMockLogStatement( 'debug', - "extendTest is skipped due to ParentTestIsSkipped", + 'extendTest is skipped due to ParentTestIsSkipped', [] ); } diff --git a/dev/tests/unit/Util/MockModuleResolverBuilder.php b/dev/tests/unit/Util/MockModuleResolverBuilder.php index 8bf30aa00..0e1b6fc31 100644 --- a/dev/tests/unit/Util/MockModuleResolverBuilder.php +++ b/dev/tests/unit/Util/MockModuleResolverBuilder.php @@ -3,35 +3,31 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ -declare(strict_types=1); - namespace tests\unit\Util; use AspectMock\Test as AspectMock; -use Exception; -use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; use Magento\FunctionalTestingFramework\ObjectManager; +use Magento\FunctionalTestingFramework\ObjectManagerFactory; use Magento\FunctionalTestingFramework\Util\ModuleResolver; -use ReflectionProperty; +use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; class MockModuleResolverBuilder { /** - * Default paths for mock ModuleResolver. + * Default paths for mock ModuleResolver * * @var array */ private $defaultPaths = ['Magento_Module' => '/base/path/some/other/path/Magento/Module']; /** - * Mock ModuleResolver builder. - * - * @param array|null $paths + * Mock ModuleResolver builder * + * @param array $paths * @return void - * @throws Exception + * @throws \Exception */ - public function setup(array $paths = null): void + public function setup($paths = null) { if (empty($paths)) { $paths = $this->defaultPaths; @@ -39,12 +35,9 @@ public function setup(array $paths = null): void $mockConfig = AspectMock::double(MftfApplicationConfig::class, ['forceGenerateEnabled' => false]); $instance = AspectMock::double(ObjectManager::class, ['create' => $mockConfig->make(), 'get' => null])->make(); - // clear object manager value to inject expected instance - $property = new ReflectionProperty(ObjectManager::class, 'instance'); - $property->setAccessible(true); - $property->setValue($instance); + AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); - $property = new ReflectionProperty(ModuleResolver::class, 'instance'); + $property = new \ReflectionProperty(ModuleResolver::class, 'instance'); $property->setAccessible(true); $property->setValue(null); @@ -58,14 +51,10 @@ public function setup(array $paths = null): void ); $instance = AspectMock::double(ObjectManager::class, ['create' => $mockResolver->make(), 'get' => null]) ->make(); - - // clear object manager value to inject expected instance - $property = new ReflectionProperty(ObjectManager::class, 'instance'); - $property->setAccessible(true); - $property->setValue($instance); + AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); $resolver = ModuleResolver::getInstance(); - $property = new ReflectionProperty(ModuleResolver::class, 'enabledModuleNameAndPaths'); + $property = new \ReflectionProperty(ModuleResolver::class, 'enabledModuleNameAndPaths'); $property->setAccessible(true); $property->setValue($resolver, $paths); } From 9f0135500a80c10f46092e146517f119e3ae3ccd Mon Sep 17 00:00:00 2001 From: Karyna Date: Thu, 22 Jul 2021 14:32:00 +0300 Subject: [PATCH 029/674] Issue 33296: Eliminate AspectMock from OperationDataArrayResolverTest --- .../OperationDataArrayResolverTest.php | 395 ++++++++++-------- 1 file changed, 218 insertions(+), 177 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php index 2721bd266..db043f860 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php @@ -3,13 +3,15 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace tests\unit\Magento\FunctionalTestFramework\DataGenerator\Persist; -use AspectMock\Test as AspectMock; +use Exception; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\OperationDefinitionObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Persist\OperationDataArrayResolver; -use Magento\FunctionalTestingFramework\Util\Iterator\AbstractIterator; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\EntityDataObjectBuilder; use tests\unit\Util\OperationDefinitionBuilder; @@ -18,27 +20,28 @@ class OperationDataArrayResolverTest extends MagentoTestCase { - const NESTED_METADATA_EXPECTED_RESULT = ["parentType" => [ - "name" => "Hopper", - "address" => ["city" => "Hawkins", "state" => "Indiana", "zip" => 78758], - "isPrimary" => true, - "gpa" => 3.5678, - "phone" => 5555555 + const NESTED_METADATA_EXPECTED_RESULT = ['parentType' => [ + 'name' => 'Hopper', + 'address' => ['city' => 'Hawkins', 'state' => 'Indiana', 'zip' => 78758], + 'isPrimary' => true, + 'gpa' => 3.5678, + 'phone' => 5555555 ]]; - const NESTED_METADATA_ARRAY_RESULT = ["parentType" => [ - "name" => "Hopper", - "isPrimary" => true, - "gpa" => 3.5678, - "phone" => 5555555, - "address" => [ - ["city" => "Hawkins", "state" => "Indiana", "zip" => 78758], - ["city" => "Austin", "state" => "Texas", "zip" => 78701], + const NESTED_METADATA_ARRAY_RESULT = ['parentType' => [ + 'name' => 'Hopper', + 'isPrimary' => true, + 'gpa' => 3.5678, + 'phone' => 5555555, + 'address' => [ + ['city' => 'Hawkins', 'state' => 'Indiana', 'zip' => 78758], + ['city' => 'Austin', 'state' => 'Texas', 'zip' => 78701], ] ]]; /** * Before test functionality + * * @return void */ public function setUp(): void @@ -54,8 +57,11 @@ public function setUp(): void * boolField * doubleField * + * + * @return void + * @throws Exception */ - public function testBasicPrimitiveMetadataResolve() + public function testBasicPrimitiveMetadataResolve(): void { // set up data object $entityObjectBuilder = new EntityDataObjectBuilder(); @@ -74,11 +80,11 @@ public function testBasicPrimitiveMetadataResolve() ); // assert on result - $expectedResult = ["testType" => [ - "name" => "Hopper", - "gpa" => 3.5678, - "phone" => 5555555, - "isPrimary" => true + $expectedResult = ['testType' => [ + 'name' => 'Hopper', + 'gpa' => 3.5678, + 'phone' => 5555555, + 'isPrimary' => true ]]; $this->assertEquals($expectedResult, $result); @@ -90,56 +96,54 @@ public function testBasicPrimitiveMetadataResolve() * someField * objectRef * + * + * @return void + * @throws Exception */ - public function testNestedMetadataResolve() + public function testNestedMetadataResolve(): void { // set up data objects $entityDataObjBuilder = new EntityDataObjectBuilder(); $parentDataObject = $entityDataObjBuilder - ->withName("parentObject") - ->withType("parentType") + ->withName('parentObject') + ->withType('parentType') ->withLinkedEntities(['childObject' => 'childType']) ->build(); $childDataObject = $entityDataObjBuilder - ->withName("childObject") - ->withType("childType") - ->withDataFields(["city" => "Hawkins", "state" => "Indiana", "zip" => "78758"]) + ->withName('childObject') + ->withType('childType') + ->withDataFields(['city' => 'Hawkins', 'state' => 'Indiana', 'zip' => '78758']) ->build(); // mock data object handler - $mockDOHInstance = AspectMock::double(DataObjectHandler::class, ['getObject' => $childDataObject])->make(); - AspectMock::double(DataObjectHandler::class, ['getInstance' => $mockDOHInstance]); + $this->mockDataObjectHandler($childDataObject); // set up metadata objects $parentOpElementBuilder = new OperationElementBuilder(); $parentElement = $parentOpElementBuilder - ->withKey("parentType") - ->withType("parentType") - ->addFields(["address" => "childType"]) + ->withKey('parentType') + ->withType('parentType') + ->addFields(['address' => 'childType']) ->build(); $operationDefinitionBuilder = new OperationDefinitionBuilder(); $childOperationDefinition = $operationDefinitionBuilder - ->withName("createChildType") - ->withOperation("create") - ->withType("childType") + ->withName('createChildType') + ->withOperation('create') + ->withType('childType') ->withMetadata([ - "city" => "string", - "state" => "string", - "zip" => "integer" + 'city' => 'string', + 'state' => 'string', + 'zip' => 'integer' ])->build(); // mock meta data object handler - $mockDOHInstance = AspectMock::double( - OperationDefinitionObjectHandler::class, - ['getObject' => $childOperationDefinition] - )->make(); - AspectMock::double(OperationDefinitionObjectHandler::class, ['getInstance' => $mockDOHInstance]); + $this->mockOperationDefinitionObjectHandler($childOperationDefinition); // resolve data object and metadata array $operationResolver = new OperationDataArrayResolver(); - $result = $operationResolver->resolveOperationDataArray($parentDataObject, [$parentElement], "create", false); + $result = $operationResolver->resolveOperationDataArray($parentDataObject, [$parentElement], 'create', false); // assert on the result $this->assertEquals(self::NESTED_METADATA_EXPECTED_RESULT, $result); @@ -153,45 +157,47 @@ public function testNestedMetadataResolve() * anotherField * * + * + * @return void + * @throws Exception */ - public function testNestedMetadata() + public function testNestedMetadata(): void { // set up data objects $entityDataObjectBuilder = new EntityDataObjectBuilder(); $parentDataObject = $entityDataObjectBuilder - ->withName("parentObject") - ->withType("parentType") + ->withName('parentObject') + ->withType('parentType') ->withLinkedEntities(['childObject' => 'childType']) ->build(); $childDataObject = $entityDataObjectBuilder - ->withName("childObject") - ->withType("childType") - ->withDataFields(["city" => "Hawkins", "state" => "Indiana", "zip" => "78758"]) + ->withName('childObject') + ->withType('childType') + ->withDataFields(['city' => 'Hawkins', 'state' => 'Indiana', 'zip' => '78758']) ->build(); // mock data object handler - $mockDOHInstance = AspectMock::double(DataObjectHandler::class, ['getObject' => $childDataObject])->make(); - AspectMock::double(DataObjectHandler::class, ['getInstance' => $mockDOHInstance]); + $this->mockDataObjectHandler($childDataObject); // set up metadata objects $childOpElementBuilder = new OperationElementBuilder(); $childElement = $childOpElementBuilder - ->withKey("address") - ->withType("childType") - ->withFields(["city" => "string", "state" => "string", "zip" => "integer"]) + ->withKey('address') + ->withType('childType') + ->withFields(['city' => 'string', 'state' => 'string', 'zip' => 'integer']) ->build(); $parentOpElementBuilder = new OperationElementBuilder(); $parentElement = $parentOpElementBuilder - ->withKey("parentType") - ->withType("parentType") - ->addElements(["address" => $childElement]) + ->withKey('parentType') + ->withType('parentType') + ->addElements(['address' => $childElement]) ->build(); // resolve data object and metadata array $operationResolver = new OperationDataArrayResolver(); - $result = $operationResolver->resolveOperationDataArray($parentDataObject, [$parentElement], "create", false); + $result = $operationResolver->resolveOperationDataArray($parentDataObject, [$parentElement], 'create', false); // assert on the result $this->assertEquals(self::NESTED_METADATA_EXPECTED_RESULT, $result); @@ -207,66 +213,69 @@ public function testNestedMetadata() * * + * + * @return void + * @throws Exception */ - public function testNestedMetadataArrayOfObjects() + public function testNestedMetadataArrayOfObjects(): void { // set up data objects $entityDataObjectBuilder = new EntityDataObjectBuilder(); $parentDataObject = $entityDataObjectBuilder - ->withName("parentObject") - ->withType("parentType") + ->withName('parentObject') + ->withType('parentType') ->withLinkedEntities(['childObject1' => 'childType', 'childObject2' => 'childType']) ->build(); // mock data object handler - $mockDOHInstance = AspectMock::double(DataObjectHandler::class, ["getObject" => function ($name) { + $callback = function ($name) { $entityDataObjectBuilder = new EntityDataObjectBuilder(); - if ($name == "childObject1") { + if ($name === 'childObject1') { return $entityDataObjectBuilder - ->withName("childObject1") - ->withType("childType") - ->withDataFields(["city" => "Hawkins", "state" => "Indiana", "zip" => "78758"]) + ->withName('childObject1') + ->withType('childType') + ->withDataFields(['city' => 'Hawkins', 'state' => 'Indiana', 'zip' => '78758']) ->build(); } - if ($name == "childObject2") { + if ($name === 'childObject2') { return $entityDataObjectBuilder - ->withName("childObject2") - ->withType("childType") - ->withDataFields(["city" => "Austin", "state" => "Texas", "zip" => "78701"]) + ->withName('childObject2') + ->withType('childType') + ->withDataFields(['city' => 'Austin', 'state' => 'Texas', 'zip' => '78701']) ->build(); } - }])->make(); - AspectMock::double(DataObjectHandler::class, ['getInstance' => $mockDOHInstance]); + }; + $this->mockDataObjectHandler($callback); // set up metadata objects $childOpElementBuilder = new OperationElementBuilder(); $childElement = $childOpElementBuilder - ->withKey("childType") - ->withType("childType") - ->withFields(["city" => "string", "state" => "string", "zip" => "integer"]) + ->withKey('childType') + ->withType('childType') + ->withFields(['city' => 'string', 'state' => 'string', 'zip' => 'integer']) ->build(); $arrayOpElementBuilder = new OperationElementBuilder(); $arrayElement = $arrayOpElementBuilder - ->withKey("address") - ->withType("childType") + ->withKey('address') + ->withType('childType') ->withFields([]) ->withElementType(OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY) - ->withNestedElements(["childType" => $childElement]) + ->withNestedElements(['childType' => $childElement]) ->build(); $parentOpElementBuilder = new OperationElementBuilder(); $parentElement = $parentOpElementBuilder - ->withKey("parentType") - ->withType("parentType") - ->addElements(["address" => $arrayElement]) + ->withKey('parentType') + ->withType('parentType') + ->addElements(['address' => $arrayElement]) ->build(); // resolve data object and metadata array $operationResolver = new OperationDataArrayResolver(); - $result = $operationResolver->resolveOperationDataArray($parentDataObject, [$parentElement], "create", false); + $result = $operationResolver->resolveOperationDataArray($parentDataObject, [$parentElement], 'create', false); // Do assert on result here $this->assertEquals(self::NESTED_METADATA_ARRAY_RESULT, $result); @@ -280,44 +289,47 @@ public function testNestedMetadataArrayOfObjects() * object * + * + * @return void + * @throws Exception */ - public function testNestedMetadataArrayOfValue() + public function testNestedMetadataArrayOfValue(): void { // set up data objects $entityDataObjectBuilder = new EntityDataObjectBuilder(); $parentDataObject = $entityDataObjectBuilder - ->withName("parentObject") - ->withType("parentType") + ->withName('parentObject') + ->withType('parentType') ->withLinkedEntities(['childObject1' => 'childType', 'childObject2' => 'childType']) ->build(); - // mock data object handler - $mockDOHInstance = AspectMock::double(DataObjectHandler::class, ["getObject" => function ($name) { + $callback = function ($name) { $entityDataObjectBuilder = new EntityDataObjectBuilder(); - if ($name == "childObject1") { + if ($name == 'childObject1') { return $entityDataObjectBuilder - ->withName("childObject1") - ->withType("childType") - ->withDataFields(["city" => "Hawkins", "state" => "Indiana", "zip" => "78758"]) + ->withName('childObject1') + ->withType('childType') + ->withDataFields(['city' => 'Hawkins', 'state' => 'Indiana', 'zip' => '78758']) ->build(); }; - if ($name == "childObject2") { + if ($name == 'childObject2') { return $entityDataObjectBuilder - ->withName("childObject2") - ->withType("childType") - ->withDataFields(["city" => "Austin", "state" => "Texas", "zip" => "78701"]) + ->withName('childObject2') + ->withType('childType') + ->withDataFields(['city' => 'Austin', 'state' => 'Texas', 'zip' => '78701']) ->build(); } - }])->make(); - AspectMock::double(DataObjectHandler::class, ['getInstance' => $mockDOHInstance]); + }; + // mock data object handler + $this->mockDataObjectHandler($callback); // set up metadata objects $arrayOpElementBuilder = new OperationElementBuilder(); $arrayElement = $arrayOpElementBuilder - ->withKey("address") - ->withType("childType") + ->withKey('address') + ->withType('childType') ->withElementType(OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY) ->withNestedElements([]) ->withFields([]) @@ -325,44 +337,39 @@ public function testNestedMetadataArrayOfValue() $parentOpElementBuilder = new OperationElementBuilder(); $parentElement = $parentOpElementBuilder - ->withKey("parentType") - ->withType("parentType") - ->addElements(["address" => $arrayElement]) + ->withKey('parentType') + ->withType('parentType') + ->addElements(['address' => $arrayElement]) ->build(); $operationDefinitionBuilder = new OperationDefinitionBuilder(); $childOperationDefinition = $operationDefinitionBuilder - ->withName("createChildType") - ->withOperation("create") - ->withType("childType") + ->withName('createChildType') + ->withOperation('create') + ->withType('childType') ->withMetadata([ - "city" => "string", - "state" => "string", - "zip" => "integer" + 'city' => 'string', + 'state' => 'string', + 'zip' => 'integer' ])->build(); // mock meta data object handler - $mockDOHInstance = AspectMock::double( - OperationDefinitionObjectHandler::class, - ['getObject' => $childOperationDefinition] - )->make(); - AspectMock::double(OperationDefinitionObjectHandler::class, ['getInstance' => $mockDOHInstance]); + $this->mockOperationDefinitionObjectHandler($childOperationDefinition); // resolve data object and metadata array $operationResolver = new OperationDataArrayResolver(); - $result = $operationResolver->resolveOperationDataArray($parentDataObject, [$parentElement], "create", false); + $result = $operationResolver->resolveOperationDataArray($parentDataObject, [$parentElement], 'create', false); // Do assert on result here $this->assertEquals(self::NESTED_METADATA_ARRAY_RESULT, $result); } - public function testNestedMetadataArrayOfDiverseObjects() + public function testNestedMetadataArrayOfDiverseObjects(): void { - $entityDataObjBuilder = new EntityDataObjectBuilder(); $parentDataObject = $entityDataObjBuilder - ->withName("parentObject") - ->withType("parentType") + ->withName('parentObject') + ->withType('parentType') ->withLinkedEntities(['child1Object' => 'childType1','child2Object' => 'childType2']) ->build(); @@ -378,22 +385,15 @@ public function testNestedMetadataArrayOfDiverseObjects() ->withDataFields(['city' => 'Testcity 2','zip' => 54321,'state' => 'Teststate']) ->build(); - $mockDOHInstance = AspectMock::double( - DataObjectHandler::class, - [ - 'getObject' => function ($name) use ($child1DataObject, $child2DataObject) { - switch ($name) { - case 'child1Object': - return $child1DataObject; - case 'child2Object': - return $child2DataObject; - } - } - ] - )->make(); - AspectMock::double(DataObjectHandler::class, [ - 'getInstance' => $mockDOHInstance - ]); + $dataObjectCallback = function ($name) use ($child1DataObject, $child2DataObject) { + switch ($name) { + case 'child1Object': + return $child1DataObject; + case 'child2Object': + return $child2DataObject; + } + }; + $this->mockDataObjectHandler($dataObjectCallback); $operationDefinitionBuilder = new OperationDefinitionBuilder(); $child1OperationDefinition = $operationDefinitionBuilder @@ -415,25 +415,15 @@ public function testNestedMetadataArrayOfDiverseObjects() 'state' => 'string' ])->build(); - $mockODOHInstance = AspectMock::double( - OperationDefinitionObjectHandler::class, - [ - 'getObject' => function ($name) use ($child1OperationDefinition, $child2OperationDefinition) { - switch ($name) { - case 'createchildType1': - return $child1OperationDefinition; - case 'createchildType2': - return $child2OperationDefinition; - } - } - ] - )->make(); - AspectMock::double( - OperationDefinitionObjectHandler::class, - [ - 'getInstance' => $mockODOHInstance - ] - ); + $operationObjectCallback = function ($name) use ($child1OperationDefinition, $child2OperationDefinition) { + switch ($name) { + case 'createchildType1': + return $child1OperationDefinition; + case 'createchildType2': + return $child2OperationDefinition; + } + }; + $this->mockOperationDefinitionObjectHandler($operationObjectCallback); $arrayObElementBuilder = new OperationElementBuilder(); $arrayElement = $arrayObElementBuilder @@ -477,55 +467,55 @@ public function testNestedMetadataArrayOfDiverseObjects() $this->assertEquals($expectedResult, $result); } - public function testExtendedWithRequiredEntity() + public function testExtendedWithRequiredEntity(): void { $entityDataObjectBuilder = new EntityDataObjectBuilder(); $extEntityDataObject = $entityDataObjectBuilder - ->withName("extEntity") - ->withType("entity") - ->withLinkedEntities(["baseSubentity" => "subentity","extSubentity" => "subentity"]) + ->withName('extEntity') + ->withType('entity') + ->withLinkedEntities(['baseSubentity' => 'subentity','extSubentity' => 'subentity']) ->build(); - $mockDOHInstance = AspectMock::double(DataObjectHandler::class, ["getObject" => function ($name) { + $callback = function ($name) { $entityDataObjectBuilder = new EntityDataObjectBuilder(); - if ($name == "baseSubentity") { + if ($name === 'baseSubentity') { return $entityDataObjectBuilder - ->withName("baseSubentity") - ->withType("subentity") - ->withDataFields(["subtest" => "BaseSubtest"]) + ->withName('baseSubentity') + ->withType('subentity') + ->withDataFields(['subtest' => 'BaseSubtest']) ->build(); } - if ($name == "extSubentity") { + if ($name === 'extSubentity') { return $entityDataObjectBuilder - ->withName("extSubentity") - ->withType("subentity") - ->withDataFields(["subtest" => "ExtSubtest"]) + ->withName('extSubentity') + ->withType('subentity') + ->withDataFields(['subtest' => 'ExtSubtest']) ->build(); } - }])->make(); - AspectMock::double(DataObjectHandler::class, ['getInstance' => $mockDOHInstance]); + }; + $this->mockDataObjectHandler($callback); $subentityOpElementBuilder = new OperationElementBuilder(); $subentityOpElement = $subentityOpElementBuilder - ->withKey("sub") - ->withType("subentity") - ->withElementType("object") - ->withFields(["subtest" => "string"]) + ->withKey('sub') + ->withType('subentity') + ->withElementType('object') + ->withFields(['subtest' => 'string']) ->build(); $operationResolver = new OperationDataArrayResolver(); $result = $operationResolver->resolveOperationDataArray( $extEntityDataObject, [$subentityOpElement], - "create", + 'create', false ); $expected = [ - "sub" => [ - "subtest" => "ExtSubtest" + 'sub' => [ + 'subtest' => 'ExtSubtest' ] ]; @@ -533,10 +523,61 @@ public function testExtendedWithRequiredEntity() } /** * After class functionality + * * @return void */ public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } + + /** + * Set up mock DataObjectHandler + * + * @param $childDataObject + * + * @return void + */ + private function mockDataObjectHandler($childDataObject): void + { + $instance = $this->createMock(DataObjectHandler::class); + if (is_callable($childDataObject)) { + $instance->expects($this->any()) + ->method('getObject') + ->willReturnCallback($childDataObject); + } else { + $instance->expects($this->any()) + ->method('getObject') + ->willReturn($childDataObject); + } + + $property = new ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($instance); + } + + /** + * Set up mock OperationDefinitionObjectHandler + * + * @param $childOperationDefinition + * + * @return void + */ + private function mockOperationDefinitionObjectHandler($childOperationDefinition): void + { + $instance = $this->createPartialMock(OperationDefinitionObjectHandler::class, ['getObject']); + if (is_callable($childOperationDefinition)) { + $instance->expects($this->any()) + ->method('getObject') + ->willReturnCallback($childOperationDefinition); + } else { + $instance->expects($this->any()) + ->method('getObject') + ->willReturn($childOperationDefinition); + } + + $property = new ReflectionProperty(OperationDefinitionObjectHandler::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($instance); + } } From 2c6f9ecb7e24dc110199e18de7a0752422cababe Mon Sep 17 00:00:00 2001 From: Karyna Date: Thu, 22 Jul 2021 14:52:23 +0300 Subject: [PATCH 030/674] Issue 33297: Eliminate AspectMock from DataExtensionUtilTest --- .../Util/DataExtensionUtilTest.php | 82 +++++++++---------- dev/tests/unit/Util/MagentoTestCase.php | 2 + 2 files changed, 43 insertions(+), 41 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Util/DataExtensionUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Util/DataExtensionUtilTest.php index 3b79ffec3..513715cc1 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Util/DataExtensionUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Util/DataExtensionUtilTest.php @@ -3,37 +3,28 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\DataGenerator\Util; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Parsers\DataProfileSchemaParser; -use Magento\FunctionalTestingFramework\ObjectManager\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use Magento\FunctionalTestingFramework\ObjectManager; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; -use AspectMock\Test as AspectMock; /** * Class DataExtensionUtilTest */ class DataExtensionUtilTest extends MagentoTestCase { - /** - * Before method functionality - * @return void - */ - protected function setUp(): void - { - AspectMock::clean(); - } - - public function testNoParentData() + public function testNoParentData(): void { $extendedDataObject = [ 'entity' => [ 'extended' => [ 'type' => 'testType', - 'extends' => "parent", + 'extends' => 'parent', 'data' => [ 0 => [ 'key' => 'testKey', @@ -46,21 +37,21 @@ public function testNoParentData() $this->setMockEntities($extendedDataObject); - $this->expectExceptionMessage("Parent Entity parent not defined for Entity extended."); - DataObjectHandler::getInstance()->getObject("extended"); + $this->expectExceptionMessage('Parent Entity parent not defined for Entity extended.'); + DataObjectHandler::getInstance()->getObject('extended'); } - public function testAlreadyExtendedParentData() + public function testAlreadyExtendedParentData(): void { $extendedDataObjects = [ 'entity' => [ 'extended' => [ 'type' => 'testType', - 'extends' => "parent" + 'extends' => 'parent' ], 'parent' => [ 'type' => 'type', - 'extends' => "grandparent" + 'extends' => 'grandparent' ], 'grandparent' => [ 'type' => 'grand' @@ -71,18 +62,18 @@ public function testAlreadyExtendedParentData() $this->setMockEntities($extendedDataObjects); $this->expectExceptionMessage( - "Cannot extend an entity that already extends another entity. Entity: parent." . PHP_EOL + 'Cannot extend an entity that already extends another entity. Entity: parent.' . PHP_EOL ); - DataObjectHandler::getInstance()->getObject("extended"); + DataObjectHandler::getInstance()->getObject('extended'); } - public function testExtendedVarGetter() + public function testExtendedVarGetter(): void { $extendedDataObjects = [ 'entity' => [ 'extended' => [ 'type' => 'testType', - 'extends' => "parent" + 'extends' => 'parent' ], 'parent' => [ 'type' => 'type', @@ -98,18 +89,18 @@ public function testExtendedVarGetter() ]; $this->setMockEntities($extendedDataObjects); - $resultextendedDataObject = DataObjectHandler::getInstance()->getObject("extended"); + $resultextendedDataObject = DataObjectHandler::getInstance()->getObject('extended'); // Perform Asserts - $this->assertEquals("someOtherEntity->id", $resultextendedDataObject->getVarReference("someOtherEntity")); + $this->assertEquals('someOtherEntity->id', $resultextendedDataObject->getVarReference('someOtherEntity')); } - public function testGetLinkedEntities() + public function testGetLinkedEntities(): void { $extendedDataObjects = [ 'entity' => [ 'extended' => [ 'type' => 'testType', - 'extends' => "parent" + 'extends' => 'parent' ], 'parent' => [ 'type' => 'type', @@ -129,27 +120,36 @@ public function testGetLinkedEntities() $this->setMockEntities($extendedDataObjects); // Perform Asserts - $resultextendedDataObject = DataObjectHandler::getInstance()->getObject("extended"); - $this->assertEquals("linkedEntity1", $resultextendedDataObject->getLinkedEntitiesOfType("linkedEntityType")[0]); - $this->assertEquals("linkedEntity2", $resultextendedDataObject->getLinkedEntitiesOfType("otherEntityType")[0]); + $resultextendedDataObject = DataObjectHandler::getInstance()->getObject('extended'); + $this->assertEquals('linkedEntity1', $resultextendedDataObject->getLinkedEntitiesOfType('linkedEntityType')[0]); + $this->assertEquals('linkedEntity2', $resultextendedDataObject->getLinkedEntitiesOfType('otherEntityType')[0]); } - private function setMockEntities($mockEntityData) + /** + * Prepare mock entites. + * + * @param $mockEntityData + * + * @return void + */ + private function setMockEntities($mockEntityData): void { - $property = new \ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); + $property = new ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); $property->setValue(null); - $mockDataProfileSchemaParser = AspectMock::double(DataProfileSchemaParser::class, [ - 'readDataProfiles' => $mockEntityData - ])->make(); + $mockDataProfileSchemaParser = $this->createMock(DataProfileSchemaParser::class); + $mockDataProfileSchemaParser->expects($this->any()) + ->method('readDataProfiles') + ->willReturn($mockEntityData); - $mockObjectManager = AspectMock::double(ObjectManager::class, [ - 'create' => $mockDataProfileSchemaParser - ])->make(); + $mockObjectManager = $this->createMock(ObjectManager::class); + $mockObjectManager + ->method('create') + ->willReturn($mockDataProfileSchemaParser); - AspectMock::double(ObjectManagerFactory::class, [ - 'getObjectManager' => $mockObjectManager - ]); + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue($mockObjectManager); } } diff --git a/dev/tests/unit/Util/MagentoTestCase.php b/dev/tests/unit/Util/MagentoTestCase.php index 7760acfc6..bb38a0b5c 100644 --- a/dev/tests/unit/Util/MagentoTestCase.php +++ b/dev/tests/unit/Util/MagentoTestCase.php @@ -19,6 +19,8 @@ public static function setUpBeforeClass(): void if (!self::fileExists(DOCS_OUTPUT_DIR)) { mkdir(DOCS_OUTPUT_DIR, 0755, true); } + // Should be used to clean AspectMock mocking before using PHPUnit mocking and Reflection. + AspectMock::clean(); parent::setUpBeforeClass(); } From e8aad70f0df5b8bc69f80753a4aa1aa73c66bb44 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Thu, 22 Jul 2021 15:53:50 +0300 Subject: [PATCH 031/674] 33306: Eliminated AspectMock from the ParallelGroupSorterTest class --- .../Util/Sorter/ParallelGroupSorterTest.php | 239 ++++++++---------- 1 file changed, 102 insertions(+), 137 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php index 6b25a837a..e289532b5 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php @@ -3,23 +3,26 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace tests\unit\Magento\FunctionalTestFramework\Util\Sorter; -use AspectMock\Test as AspectMock; use Magento\FunctionalTestingFramework\Exceptions\FastFailException; -use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler; -use Magento\FunctionalTestingFramework\Suite\Objects\SuiteObject; use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Test\Objects\TestObject; use Magento\FunctionalTestingFramework\Util\Sorter\ParallelGroupSorter; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; class ParallelGroupSorterTest extends MagentoTestCase { /** - * Test a basic sort of available tests based on size + * Test a basic sort of available tests based on size. + * + * @return void + * @throws FastFailException */ - public function testBasicTestsSplitByTime() + public function testBasicTestsSplitByTime(): void { $sampleTestArray = [ 'test1' => 100, @@ -44,7 +47,6 @@ public function testBasicTestsSplitByTime() $testSorter = new ParallelGroupSorter(); $actualResult = $testSorter->getTestsGroupedBySize([], $sampleTestArray, 200); - $this->assertCount(5, $actualResult); foreach ($actualResult as $gropuNumber => $actualTests) { @@ -54,31 +56,15 @@ public function testBasicTestsSplitByTime() } /** - * Test a sort of both tests and a suite which is larger than the given line limitation + * Test a sort of both tests and a suite which is larger than the given line limitation. + * + * @return void + * @throws FastFailException */ - public function testTestsAndSuitesSplitByTime() + public function testTestsAndSuitesSplitByTime(): void { // mock tests for test object handler. - $numberOfCalls = 0; - $mockTest1 = AspectMock::double( - TestObject::class, - ['getEstimatedDuration' => function () use (&$numberOfCalls) { - $actionCount = [300, 275]; - $result = $actionCount[$numberOfCalls]; - $numberOfCalls++; - - return $result; - }] - )->make(); - - $mockHandler = AspectMock::double( - TestObjectHandler::class, - ['getObject' => function () use ($mockTest1) { - return $mockTest1; - }] - )->make(); - - AspectMock::double(TestObjectHandler::class, ['getInstance' => $mockHandler])->make(); + $this->createMockForTest(0); // create test to size array $sampleTestArray = [ @@ -115,9 +101,12 @@ public function testTestsAndSuitesSplitByTime() } /** - * Test splitting tests based on a fixed group number + * Test splitting tests based on a fixed group number. + * + * @return void + * @throws FastFailException */ - public function testBasicTestsSplitByGroup() + public function testBasicTestsSplitByGroup(): void { $sampleTestArray = [ 'test1' => 100, @@ -140,7 +129,7 @@ public function testBasicTestsSplitByGroup() 'test18' => 34, 'test19' => 45, 'test20' => 58, - 'test21' => 9, + 'test21' => 9 ]; $expectedResult = [ @@ -153,7 +142,6 @@ public function testBasicTestsSplitByGroup() $testSorter = new ParallelGroupSorter(); $actualResult = $testSorter->getTestsGroupedByFixedGroupCount([], $sampleTestArray, 5); - $this->assertCount(5, $actualResult); foreach ($actualResult as $gropuNumber => $actualTests) { @@ -163,16 +151,19 @@ public function testBasicTestsSplitByGroup() } /** - * Test splitting tests based a group number bigger than ever needed + * Test splitting tests based a group number bigger than ever needed. + * + * @return void + * @throws FastFailException */ - public function testBasicTestsSplitByBigGroupNumber() + public function testBasicTestsSplitByBigGroupNumber(): void { $sampleTestArray = [ 'test1' => 100, 'test2' => 300, 'test3' => 50, 'test4' => 60, - 'test5' => 25, + 'test5' => 25 ]; $expectedResult = [ @@ -185,7 +176,6 @@ public function testBasicTestsSplitByBigGroupNumber() $testSorter = new ParallelGroupSorter(); $actualResult = $testSorter->getTestsGroupedByFixedGroupCount([], $sampleTestArray, 10); - $this->assertCount(5, $actualResult); foreach ($actualResult as $gropuNumber => $actualTests) { @@ -195,9 +185,12 @@ public function testBasicTestsSplitByBigGroupNumber() } /** - * Test splitting tests based a minimum group number + * Test splitting tests based a minimum group number. + * + * @return void + * @throws FastFailException */ - public function testBasicTestsSplitByMinGroupNumber() + public function testBasicTestsSplitByMinGroupNumber(): void { $sampleTestArray = [ 'test1' => 100, @@ -213,7 +206,6 @@ public function testBasicTestsSplitByMinGroupNumber() $testSorter = new ParallelGroupSorter(); $actualResult = $testSorter->getTestsGroupedByFixedGroupCount([], $sampleTestArray, 1); - $this->assertCount(1, $actualResult); foreach ($actualResult as $gropuNumber => $actualTests) { @@ -223,31 +215,15 @@ public function testBasicTestsSplitByMinGroupNumber() } /** - * Test splitting tests and suites based on a fixed group number + * Test splitting tests and suites based on a fixed group number. + * + * @return void + * @throws FastFailException */ - public function testTestsAndSuitesSplitByGroup() + public function testTestsAndSuitesSplitByGroup(): void { // mock tests for test object handler. - $numberOfCalls = 0; - $mockTest1 = AspectMock::double( - TestObject::class, - ['getEstimatedDuration' => function () use (&$numberOfCalls) { - $actionCount = [300, 275, 300, 275]; - $result = $actionCount[$numberOfCalls]; - $numberOfCalls++; - - return $result; - }] - )->make(); - - $mockHandler = AspectMock::double( - TestObjectHandler::class, - ['getObject' => function () use ($mockTest1) { - return $mockTest1; - }] - )->make(); - - AspectMock::double(TestObjectHandler::class, ['getInstance' => $mockHandler])->make(); + $this->createMockForTest(0); // create test to size array $sampleTestArray = [ @@ -283,7 +259,7 @@ public function testTestsAndSuitesSplitByGroup() 'test30' => 93, 'test31' => 330, 'test32' => 85, - 'test33' => 291, + 'test33' => 291 ]; // create mock suite references @@ -294,7 +270,6 @@ public function testTestsAndSuitesSplitByGroup() // perform sort $testSorter = new ParallelGroupSorter(); $actualResult = $testSorter->getTestsGroupedByFixedGroupCount($sampleSuiteArray, $sampleTestArray, 15); - // verify the resulting groups $this->assertCount(15, $actualResult); @@ -313,7 +288,7 @@ public function testTestsAndSuitesSplitByGroup() 12 => ['test28', 'test2', 'test15'], 13 => ['test19', 'test16', 'test20'], 14 => ['mockSuite1_0_G'], - 15 => ['mockSuite1_1_G'], + 15 => ['mockSuite1_1_G'] ]; foreach ($actualResult as $groupNum => $group) { @@ -322,37 +297,21 @@ public function testTestsAndSuitesSplitByGroup() } /** - * Test splitting tests and suites based a group number bigger than ever needed + * Test splitting tests and suites based a group number bigger than ever needed. + * + * @return void + * @throws FastFailException */ - public function testTestsAndSuitesSplitByBigGroupNumber() + public function testTestsAndSuitesSplitByBigGroupNumber(): void { // mock tests for test object handler. - $numberOfCalls = 0; - $mockTest1 = AspectMock::double( - TestObject::class, - ['getEstimatedDuration' => function () use (&$numberOfCalls) { - $actionCount = [300, 275, 300, 275]; - $result = $actionCount[$numberOfCalls]; - $numberOfCalls++; - - return $result; - }] - )->make(); - - $mockHandler = AspectMock::double( - TestObjectHandler::class, - ['getObject' => function () use ($mockTest1) { - return $mockTest1; - }] - )->make(); - - AspectMock::double(TestObjectHandler::class, ['getInstance' => $mockHandler])->make(); + $this->createMockForTest(0); // create test to size array $sampleTestArray = [ 'test1' => 275, 'test2' => 190, - 'test3' => 200, + 'test3' => 200 ]; // create mock suite references @@ -363,7 +322,6 @@ public function testTestsAndSuitesSplitByBigGroupNumber() // perform sort $testSorter = new ParallelGroupSorter(); $actualResult = $testSorter->getTestsGroupedByFixedGroupCount($sampleSuiteArray, $sampleTestArray, 10); - // verify the resulting groups $this->assertCount(5, $actualResult); @@ -381,37 +339,21 @@ public function testTestsAndSuitesSplitByBigGroupNumber() } /** - * Test splitting tests and suites based a minimum group number + * Test splitting tests and suites based a minimum group number. + * + * @return void + * @throws FastFailException */ - public function testTestsAndSuitesSplitByMinGroupNumber() + public function testTestsAndSuitesSplitByMinGroupNumber(): void { // mock tests for test object handler. - $numberOfCalls = 0; - $mockTest1 = AspectMock::double( - TestObject::class, - ['getEstimatedDuration' => function () use (&$numberOfCalls) { - $actionCount = [300, 275, 300, 275]; - $result = $actionCount[$numberOfCalls]; - $numberOfCalls++; - - return $result; - }] - )->make(); - - $mockHandler = AspectMock::double( - TestObjectHandler::class, - ['getObject' => function () use ($mockTest1) { - return $mockTest1; - }] - )->make(); - - AspectMock::double(TestObjectHandler::class, ['getInstance' => $mockHandler])->make(); + $this->createMockForTest(0); // create test to size array $sampleTestArray = [ 'test1' => 1, 'test2' => 125, - 'test3' => 35, + 'test3' => 35 ]; // create mock suite references @@ -422,14 +364,13 @@ public function testTestsAndSuitesSplitByMinGroupNumber() // perform sort $testSorter = new ParallelGroupSorter(); $actualResult = $testSorter->getTestsGroupedByFixedGroupCount($sampleSuiteArray, $sampleTestArray, 3); - // verify the resulting groups $this->assertCount(3, $actualResult); $expectedResults = [ 1 => ['test2', 'test3', 'test1'], 2 => ['mockSuite1_0_G'], - 3 => ['mockSuite1_1_G'], + 3 => ['mockSuite1_1_G'] ]; foreach ($actualResult as $groupNum => $group) { @@ -438,39 +379,21 @@ public function testTestsAndSuitesSplitByMinGroupNumber() } /** - * Test splitting tests and suites with invalid group number + * Test splitting tests and suites with invalid group number. + * + * @return void */ - public function testTestsAndSuitesSplitByInvalidGroupNumber() + public function testTestsAndSuitesSplitByInvalidGroupNumber(): void { // mock tests for test object handler. - $numberOfCalls = 0; - $mockTest1 = AspectMock::double( - TestObject::class, - ['getEstimatedDuration' => function () use (&$numberOfCalls) { - $actionCount = [300, 275, 300, 275]; - $result = $actionCount[$numberOfCalls]; - $numberOfCalls++; - - return $result; - }] - )->make(); - - $mockHandler = AspectMock::double( - TestObjectHandler::class, - ['getObject' => function () use ($mockTest1) { - return $mockTest1; - }] - )->make(); - - AspectMock::double(TestObjectHandler::class, ['getInstance' => $mockHandler])->make(); + $this->createMockForTest(0); // create test to size array $sampleTestArray = [ 'test1' => 1, 'test2' => 125, - 'test3' => 35, + 'test3' => 35 ]; - // create mock suite references $sampleSuiteArray = [ 'mockSuite1' => ['mockTest1', 'mockTest2'] @@ -483,4 +406,46 @@ public function testTestsAndSuitesSplitByInvalidGroupNumber() $testSorter = new ParallelGroupSorter(); $testSorter->getTestsGroupedByFixedGroupCount($sampleSuiteArray, $sampleTestArray, 1); } + + /** + * @inheritDoc + */ + public static function tearDownAfterClass(): void + { + $instanceProperty = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); + $instanceProperty->setAccessible(true); + $instanceProperty->setValue(null); + } + + /** + * Mock test object and test object handler. + * + * @param int $numberOfCalls + * + * @return void + */ + private function createMockForTest(int $numberOfCalls): void + { + $mockTest1 = $this->createMock(TestObject::class); + $mockTest1 + ->method('getEstimatedDuration') + ->willReturnCallback( + function () use (&$numberOfCalls) { + $actionCount = [300, 275, 300, 275]; + $result = $actionCount[$numberOfCalls]; + $numberOfCalls++; + + return $result; + } + ); + + $mockHandler = $this->createMock(TestObjectHandler::class); + $mockHandler + ->method('getObject') + ->willReturn($mockTest1); + + $instanceProperty = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); + $instanceProperty->setAccessible(true); + $instanceProperty->setValue($mockHandler, $mockHandler); + } } From c929d3c68bb7c6b4e20ea56aeab5c5b9c180ccae Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Thu, 22 Jul 2021 18:00:37 +0300 Subject: [PATCH 032/674] 33308: Code refactoring --- .../Util/ModuleResolverTest.php | 30 ++++++++++++------- .../ModuleResolver/ModuleResolverService.php | 2 +- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php index 286044d8a..cec3b9461 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php @@ -37,6 +37,14 @@ protected function setUp(): void public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); + + $moduleResolverServiceInstance = new ReflectionProperty(ModuleResolverService::class, 'INSTANCE'); + $moduleResolverServiceInstance->setAccessible(true); + $moduleResolverServiceInstance->setValue(null); + + $mftfAppConfigInstance = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); + $mftfAppConfigInstance->setAccessible(true); + $mftfAppConfigInstance->setValue(null); } /** @@ -48,8 +56,8 @@ public static function tearDownAfterClass(): void public function testGetModulePathsAlreadySet(): void { $resolver = ModuleResolver::getInstance(); - $this->setMockResolverProperties($resolver, ["example" . DIRECTORY_SEPARATOR . "paths"]); - $this->assertEquals(["example" . DIRECTORY_SEPARATOR . "paths"], $resolver->getModulesPath()); + $this->setMockResolverProperties($resolver, ['example' . DIRECTORY_SEPARATOR . 'paths']); + $this->assertEquals(['example' . DIRECTORY_SEPARATOR . 'paths'], $resolver->getModulesPath()); } /** @@ -68,7 +76,7 @@ public function testGetModulePathsAggregate(): void ->willReturn( [ 'Magento_example' => 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example', - 'Magento_sample' => 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample', + 'Magento_sample' => 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample' ] ); $moduleResolverService->expects($this->any()) @@ -76,7 +84,7 @@ public function testGetModulePathsAggregate(): void ->willReturn( [ 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example' => ['example'], - 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample' => ['sample'], + 'other' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'sample' => ['sample'] ] ); @@ -116,7 +124,7 @@ public function testAggregateTestModulePathsFromComposerJson(): void [ 'Magento_ModuleB', 'Magento_ModuleC' - ], + ] ] ); @@ -154,7 +162,7 @@ public function testAggregateTestModulePathsFromComposerInstaller(): void [ 'Magento_ModuleB', 'Magento_ModuleC' - ], + ] ] ); @@ -243,7 +251,7 @@ public function testMergeFlipAndFilterModulePathsNoForceGenerate(): void 4 => 'Magento_ModuleB', 5 => 'Magento_ModuleD', 6 => 'Magento_Otherexample', - 7 => 'Magento_ModuleC', + 7 => 'Magento_ModuleC' ] ); $this->assertEquals( @@ -254,7 +262,7 @@ public function testMergeFlipAndFilterModulePathsNoForceGenerate(): void 'some' . DIRECTORY_SEPARATOR . 'path' . DIRECTORY_SEPARATOR . 'example', 'composer' . DIRECTORY_SEPARATOR . 'json' . DIRECTORY_SEPARATOR . 'pathB', 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathD', - 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathC', + 'composer' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'pathC' ], $resolver->getModulesPath() @@ -284,7 +292,7 @@ public function testMergeFlipNoSortModulePathsNoForceGenerate(): void . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleBC' => [ 'Magento_ModuleB', - 'Magento_ModuleC', + 'Magento_ModuleC' ] ] ); @@ -363,7 +371,7 @@ public function testMergeFlipAndSortModulePathsForceGenerate(): void . 'Magento' . DIRECTORY_SEPARATOR . 'ModuleBC' => [ 'Magento_ModuleB', - 'Magento_ModuleC', + 'Magento_ModuleC' ] ] ); @@ -670,7 +678,7 @@ protected function tearDown(): void { // re set env if (!isset($_ENV['MAGENTO_ADMIN_USERNAME'])) { - $_ENV['MAGENTO_ADMIN_USERNAME'] = "admin"; + $_ENV['MAGENTO_ADMIN_USERNAME'] = 'admin'; } } } diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php index 0f6513436..c3dad2118 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php @@ -53,7 +53,7 @@ private function __construct() public static function getInstance() { if (self::$INSTANCE === null) { - return new self(); + self::$INSTANCE = new ModuleResolverService(); } return self::$INSTANCE; From 43f943603db2128cbc90c9d2f61c852faaa6afec Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Thu, 22 Jul 2021 18:32:32 +0300 Subject: [PATCH 033/674] 33309: Code review/refactoring, fixing failed tests --- .../Util/TestGeneratorTest.php | 74 ++++++++++++------- .../Util/Filesystem/CestFileCreatorUtil.php | 6 +- 2 files changed, 50 insertions(+), 30 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 3bc06de59..730493191 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -8,25 +8,27 @@ namespace tests\unit\Magento\FunctionalTestFramework\Util; use Exception; +use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; use Magento\FunctionalTestingFramework\Filter\FilterList; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Test\Objects\TestHookObject; use Magento\FunctionalTestingFramework\Test\Objects\TestObject; use Magento\FunctionalTestingFramework\Util\Filesystem\CestFileCreatorUtil; +use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; +use Magento\FunctionalTestingFramework\Util\TestGenerator; use ReflectionProperty; use tests\unit\Util\MagentoTestCase; -use Magento\FunctionalTestingFramework\Util\TestGenerator; -use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; use tests\unit\Util\TestLoggingUtil; -use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; class TestGeneratorTest extends MagentoTestCase { /** * Before method functionality. + * + * @return void */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -36,7 +38,7 @@ public function setUp(): void * * @return void */ - public function tearDown(): void + protected function tearDown(): void { GenerationErrorHandler::getInstance()->reset(); } @@ -53,12 +55,12 @@ public function testEntityException(): void 'userInput' => '{{someEntity.entity}}' ]); - $testObject = new TestObject("sampleTest", ["merge123" => $actionObject], [], [], "filename"); - $testGeneratorObject = TestGenerator::getInstance("", ["sampleTest" => $testObject]); + $testObject = new TestObject('sampleTest', ['merge123' => $actionObject], [], [], 'filename'); + $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $testObject]); $testGeneratorObject->createAllTestFiles(null, []); // assert that no exception for createAllTestFiles and generation error is stored in GenerationErrorHandler - $errorMessage = '/' . preg_quote("Removed invalid test object sampleTest") . '/'; + $errorMessage = '/' . preg_quote('Removed invalid test object sampleTest') . '/'; TestLoggingUtil::getInstance()->validateMockLogStatmentRegex('error', $errorMessage, []); $testErrors = GenerationErrorHandler::getInstance()->getErrorsByType('test'); $this->assertArrayHasKey('sampleTest', $testErrors); @@ -78,9 +80,9 @@ public function testSkippedNoGeneration(): void ]); $annotations = ['skip' => ['issue']]; - $testObject = new TestObject("sampleTest", ["merge123" => $actionObject], $annotations, [], "filename"); + $testObject = new TestObject('sampleTest', ['merge123' => $actionObject], $annotations, [], 'filename'); - $testGeneratorObject = TestGenerator::getInstance("", ["sampleTest" => $testObject]); + $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $testObject]); $output = $testGeneratorObject->assembleTestPhp($testObject); $this->assertStringContainsString('This test is skipped', $output); @@ -97,7 +99,7 @@ public function testAllowSkipped(): void { // Mock allowSkipped for TestGenerator $mockConfig = $this->createMock(MftfApplicationConfig::class); - $mockConfig->expects($this->any()) + $mockConfig ->method('allowSkipped') ->willReturn(true); @@ -115,16 +117,16 @@ public function testAllowSkipped(): void ]); $annotations = ['skip' => ['issue']]; - $beforeHook = new TestHookObject("before", "sampleTest", ['beforeAction' => $beforeActionObject]); + $beforeHook = new TestHookObject('before', 'sampleTest', ['beforeAction' => $beforeActionObject]); $testObject = new TestObject( - "sampleTest", - ["fakeAction" => $actionObject], + 'sampleTest', + ['fakeAction' => $actionObject], $annotations, - ["before" => $beforeHook], - "filename" + ['before' => $beforeHook], + 'filename' ); - $testGeneratorObject = TestGenerator::getInstance("", ["sampleTest" => $testObject]); + $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $testObject]); $output = $testGeneratorObject->assembleTestPhp($testObject); $this->assertStringNotContainsString('This test is skipped', $output); @@ -141,8 +143,10 @@ public function testAllowSkipped(): void public function testFilter(): void { $mockConfig = $this->createMock(MftfApplicationConfig::class); - $fileList = new FilterList(['severity' => ["CRITICAL"]]); - $mockConfig->expects($this->once())->method('getFilterList')->willReturn($fileList); + $fileList = new FilterList(['severity' => ['CRITICAL']]); + $mockConfig + ->method('getFilterList') + ->willReturn($fileList); $property = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); $property->setAccessible(true); @@ -156,24 +160,24 @@ public function testFilter(): void $annotation1 = ['severity' => ['CRITICAL']]; $annotation2 = ['severity' => ['MINOR']]; $test1 = new TestObject( - "test1", - ["fakeAction" => $actionObject], + 'test1', + ['fakeAction' => $actionObject], $annotation1, [], - "filename" + 'filename' ); $test2 = new TestObject( - "test2", - ["fakeAction" => $actionObject], + 'test2', + ['fakeAction' => $actionObject], $annotation2, [], - "filename" + 'filename' ); // Mock createCestFile to return name of tests that testGenerator tried to create $generatedTests = []; $cestFileCreatorUtil = $this->createMock(CestFileCreatorUtil::class); - $cestFileCreatorUtil->expects($this->once()) + $cestFileCreatorUtil ->method('create') ->will( $this->returnCallback( @@ -187,11 +191,27 @@ function ($filename) use (&$generatedTests) { $property->setAccessible(true); $property->setValue($cestFileCreatorUtil); - $testGeneratorObject = TestGenerator::getInstance("", ["sampleTest" => $test1, "test2" => $test2]); + $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); $testGeneratorObject->createAllTestFiles(); // Ensure Test1 was Generated but not Test 2 $this->assertArrayHasKey('test1Cest', $generatedTests); $this->assertArrayNotHasKey('test2Cest', $generatedTests); } + + /** + * @inheritDoc + */ + public static function tearDownAfterClass(): void + { + parent::tearDownAfterClass(); + + $cestFileCreatorUtilInstance = new ReflectionProperty(CestFileCreatorUtil::class, 'INSTANCE'); + $cestFileCreatorUtilInstance->setAccessible(true); + $cestFileCreatorUtilInstance->setValue(null); + + $mftfAppConfigInstance = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); + $mftfAppConfigInstance->setAccessible(true); + $mftfAppConfigInstance->setValue(null); + } } diff --git a/src/Magento/FunctionalTestingFramework/Util/Filesystem/CestFileCreatorUtil.php b/src/Magento/FunctionalTestingFramework/Util/Filesystem/CestFileCreatorUtil.php index b3c896ccb..9fe205151 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Filesystem/CestFileCreatorUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Filesystem/CestFileCreatorUtil.php @@ -30,10 +30,10 @@ private function __construct() * * @return CestFileCreatorUtil */ - public static function getInstance() + public static function getInstance(): CestFileCreatorUtil { - if (self::$INSTANCE === null) { - return new self(); + if (!self::$INSTANCE) { + self::$INSTANCE = new CestFileCreatorUtil(); } return self::$INSTANCE; From 45e2436ce3480f7cf8f6eb5b9c38841607590a77 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Thu, 22 Jul 2021 23:28:18 +0300 Subject: [PATCH 034/674] 33293: Removed Singleton and used Object Manager --- .../Handlers/PersistedObjectHandlerTest.php | 115 +++++++++++------- dev/tests/unit/Util/MagentoTestCase.php | 2 + .../DataGenerator/Persist/CurlHandler.php | 30 +---- .../Persist/DataPersistenceHandler.php | 22 +++- 4 files changed, 94 insertions(+), 75 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php index 4d70444b6..9072b2da1 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php @@ -9,8 +9,13 @@ use Exception; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; +use Magento\FunctionalTestingFramework\DataGenerator\Parsers\DataProfileSchemaParser; use Magento\FunctionalTestingFramework\DataGenerator\Persist\CurlHandler; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; +use Magento\FunctionalTestingFramework\ObjectManager; +use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use ReflectionProperty; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\ObjectHandlerUtil; @@ -24,7 +29,7 @@ class PersistedObjectHandlerTest extends MagentoTestCase /** * @inheritDoc */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -90,9 +95,7 @@ public function testCreateSimpleEntity(): void } "; - // Mock Classes - ObjectHandlerUtil::mockDataObjectHandlerWithData($parserOutput); - $this->mockCurlHandler($jsonResponse); + $this->mockCurlHandler($jsonResponse, $parserOutput); $handler = PersistedObjectHandler::getInstance(); // Call method @@ -140,8 +143,7 @@ public function testDeleteSimpleEntity(): void "; // Mock Classes - ObjectHandlerUtil::mockDataObjectHandlerWithData($parserOutput); - $this->mockCurlHandler($jsonResponse); + $this->mockCurlHandler($jsonResponse, $parserOutput); $handler = PersistedObjectHandler::getInstance(); // Call method @@ -194,8 +196,7 @@ public function testGetSimpleEntity(): void "; // Mock Classes - ObjectHandlerUtil::mockDataObjectHandlerWithData($parserOutput); - $this->mockCurlHandler($jsonResponse); + $this->mockCurlHandler($jsonResponse, $parserOutput); $handler = PersistedObjectHandler::getInstance(); // Call method @@ -334,7 +335,7 @@ public function testRetrieveEntityAcrossScopes(): void ] ] ]; - $jsonReponseOne = " + $jsonResponseOne = " { \"" . strtolower($dataKeyOne) . "\" : \"{$dataValueOne}\" } @@ -353,22 +354,21 @@ public function testRetrieveEntityAcrossScopes(): void // Mock Classes and Create Entities $handler = PersistedObjectHandler::getInstance(); - ObjectHandlerUtil::mockDataObjectHandlerWithData($parserOutputOne); - $this->mockCurlHandler($jsonReponseOne); + $this->mockCurlHandler($jsonResponseOne, $parserOutputOne); $handler->createEntity( $entityStepKeyOne, PersistedObjectHandler::TEST_SCOPE, $entityNameOne ); - $this->mockCurlHandler($jsonReponseTwo); + $this->mockCurlHandler($jsonReponseTwo, $parserOutputOne); $handler->createEntity( $entityStepKeyTwo, PersistedObjectHandler::HOOK_SCOPE, $entityNameTwo ); - $this->mockCurlHandler($jsonReponseThree); + $this->mockCurlHandler($jsonReponseThree, $parserOutputOne); $handler->createEntity( $entityStepKeyThree, PersistedObjectHandler::SUITE_SCOPE, @@ -432,7 +432,7 @@ public function testRetrieveEntityValidField( ] ] ]; - $jsonReponseOne = " + $jsonResponseOne = " { \"" . strtolower($key) . "\" : \"{$value}\" } @@ -440,9 +440,7 @@ public function testRetrieveEntityValidField( // Mock Classes and Create Entities $handler = PersistedObjectHandler::getInstance(); - - ObjectHandlerUtil::mockDataObjectHandlerWithData($parserOutputOne); - $this->mockCurlHandler($jsonReponseOne); + $this->mockCurlHandler($jsonResponseOne, $parserOutputOne); $handler->createEntity($stepKey, $scope, $name); // Call method @@ -463,7 +461,7 @@ public function testRetrieveEntityValidField( * @dataProvider entityDataProvider * * @return void - * @throws TestReferenceException + * @throws TestReferenceException|TestFrameworkException */ public function testRetrieveEntityInValidField( string $name, @@ -490,7 +488,7 @@ public function testRetrieveEntityInValidField( ] ] ]; - $jsonReponseOne = " + $jsonResponseOne = " { \"" . strtolower($key) . "\" : \"{$value}\" } @@ -498,8 +496,7 @@ public function testRetrieveEntityInValidField( // Mock Classes and Create Entities $handler = PersistedObjectHandler::getInstance(); - ObjectHandlerUtil::mockDataObjectHandlerWithData($parserOutputOne); - $this->mockCurlHandler($jsonReponseOne); + $this->mockCurlHandler($jsonResponseOne, $parserOutputOne); $handler->createEntity($stepKey, $scope, $name); // Call method @@ -514,7 +511,7 @@ public function testRetrieveEntityInValidField( } /** - * Data provider for testRetrieveEntityField + * Data provider for testRetrieveEntityField. * * @return array */ @@ -531,45 +528,79 @@ public static function entityDataProvider(): array * Create mock curl handler. * * @param string $response - * @throws Exception + * @param array $parserOutput + * + * @return void */ - public function mockCurlHandler(string $response): void + public function mockCurlHandler(string $response, array $parserOutput): void { - $mockCurlHandler = $this->createMock(CurlHandler::class); - $mockCurlHandler->expects($this->any()) + $dataObjectHandler = new ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); + $dataObjectHandler->setAccessible(true); + $dataObjectHandler->setValue(null); + + $mockDataProfileSchemaParser = $this->createMock(DataProfileSchemaParser::class); + $mockDataProfileSchemaParser + ->method('readDataProfiles') + ->willReturn($parserOutput); + + $curlHandler = $this->createMock(CurlHandler::class); + $curlHandler ->method('executeRequest') ->willReturn($response); - $mockCurlHandler->expects($this->once()) + $curlHandler ->method('getRequestDataArray') ->willReturn([]); - $mockCurlHandler->expects($this->once()) + $curlHandler ->method('isContentTypeJson') ->willReturn(true); - $property = new ReflectionProperty(CurlHandler::class, "INSTANCE"); - $property->setAccessible(true); - $property->setValue($mockCurlHandler); + $objectManagerInstance = ObjectManagerFactory::getObjectManager(); + $objectManagerMockInstance = $this->createMock(ObjectManager::class); + $objectManagerMockInstance->expects($this->any()) + ->method('create') + ->will( + $this->returnCallback( + function ( + string $class, + array $arguments = [] + ) use ($curlHandler, $objectManagerInstance, $mockDataProfileSchemaParser) + { + if ($class === CurlHandler::class) { + return $curlHandler; + } + + if ($class === DataProfileSchemaParser::class) { + return $mockDataProfileSchemaParser; + } + + return $objectManagerInstance->create($class, $arguments); + } + ) + ); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue($objectManagerMockInstance); } /** - * @inheritDoc + * After class functionality. + * + * @return void */ - public function tearDown(): void + public static function tearDownAfterClass(): void { + parent::tearDownAfterClass(); + // Clear out Singleton between tests - $property = new ReflectionProperty(PersistedObjectHandler::class, 'INSTANCE'); + $property = new ReflectionProperty(PersistedObjectHandler::class, "INSTANCE"); $property->setAccessible(true); $property->setValue(null); - parent::tearDown(); // TODO: Change the autogenerated stub - } + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue(null); - /** - * @inheritDoc - */ - public static function tearDownAfterClass(): void - { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); - parent::tearDownAfterClass(); } } diff --git a/dev/tests/unit/Util/MagentoTestCase.php b/dev/tests/unit/Util/MagentoTestCase.php index 7760acfc6..bb38a0b5c 100644 --- a/dev/tests/unit/Util/MagentoTestCase.php +++ b/dev/tests/unit/Util/MagentoTestCase.php @@ -19,6 +19,8 @@ public static function setUpBeforeClass(): void if (!self::fileExists(DOCS_OUTPUT_DIR)) { mkdir(DOCS_OUTPUT_DIR, 0755, true); } + // Should be used to clean AspectMock mocking before using PHPUnit mocking and Reflection. + AspectMock::clean(); parent::setUpBeforeClass(); } diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php index d5250c890..89055b83f 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php @@ -63,13 +63,6 @@ class CurlHandler */ private $isJson; - /** - * Singleton CurlHandler Instance. - * - * @var CurlHandler - */ - private static $INSTANCE; - /** * Operation to Curl method mapping. * @@ -89,7 +82,7 @@ class CurlHandler * @param EntityDataObject $entityObject * @param string $storeCode */ - private function __construct($operation, $entityObject, $storeCode = null) + public function __construct($operation, $entityObject, $storeCode = null) { $this->operation = $operation; $this->entityObject = $entityObject; @@ -102,27 +95,6 @@ private function __construct($operation, $entityObject, $storeCode = null) $this->isJson = false; } - /** - * Get CurlHandler instance. - * - * @param string $operation - * @param EntityDataObject $entityObject - * @param string|null $storeCode - * - * @return CurlHandler - */ - public static function getInstance( - string $operation, - EntityDataObject $entityObject, - ?string $storeCode = null - ) { - if (self::$INSTANCE === null) { - return new self($operation, $entityObject, $storeCode); - } - - return self::$INSTANCE; - } - /** * Executes an api request based on parameters given by constructor. * diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php index 0be6cc24e..19a577f0f 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php @@ -9,6 +9,7 @@ use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; +use Magento\FunctionalTestingFramework\ObjectManagerFactory; /** * Class DataPersistenceHandler @@ -86,7 +87,10 @@ public function createEntity($storeCode = null) if (!empty($storeCode)) { $this->storeCode = $storeCode; } - $curlHandler = CurlHandler::getInstance('create', $this->entityObject, $this->storeCode); + $curlHandler = ObjectManagerFactory::getObjectManager()->create( + CurlHandler::class, + ['create', $this->entityObject, $this->storeCode] + ); $result = $curlHandler->executeRequest($this->dependentObjects); $this->setCreatedObject( $result, @@ -111,7 +115,10 @@ public function updateEntity($updateDataName, $updateDependentObjects = []) $this->dependentObjects[] = $dependentObject->getCreatedObject(); } $updateEntityObject = DataObjectHandler::getInstance()->getObject($updateDataName); - $curlHandler = CurlHandler::getInstance('update', $updateEntityObject, $this->storeCode); + $curlHandler = ObjectManagerFactory::getObjectManager()->create( + CurlHandler::class, + ['update', $updateEntityObject, $this->storeCode] + ); $result = $curlHandler->executeRequest(array_merge($this->dependentObjects, [$this->createdObject])); $this->setCreatedObject( $result, @@ -134,7 +141,10 @@ public function getEntity($index = null, $storeCode = null) if (!empty($storeCode)) { $this->storeCode = $storeCode; } - $curlHandler = CurlHandler::getInstance('get', $this->entityObject, $this->storeCode); + $curlHandler = ObjectManagerFactory::getObjectManager()->create( + CurlHandler::class, + ['get', $this->entityObject, $this->storeCode] + ); $result = $curlHandler->executeRequest($this->dependentObjects); $this->setCreatedObject( $result, @@ -152,7 +162,11 @@ public function getEntity($index = null, $storeCode = null) */ public function deleteEntity() { - $curlHandler = CurlHandler::getInstance('delete', $this->createdObject, $this->storeCode); + $curlHandler = ObjectManagerFactory::getObjectManager()->create( + CurlHandler::class, + ['delete', $this->createdObject, $this->storeCode] + ); + $curlHandler->executeRequest($this->dependentObjects); } From 842f9f5ccc8469d64cb507a087c7bb4c96e647d6 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Thu, 22 Jul 2021 23:49:13 +0300 Subject: [PATCH 035/674] 33293: Fixed static-test --- .../Handlers/PersistedObjectHandlerTest.php | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php index 9072b2da1..3629271f3 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php @@ -538,8 +538,8 @@ public function mockCurlHandler(string $response, array $parserOutput): void $dataObjectHandler->setAccessible(true); $dataObjectHandler->setValue(null); - $mockDataProfileSchemaParser = $this->createMock(DataProfileSchemaParser::class); - $mockDataProfileSchemaParser + $dataProfileSchemaParser = $this->createMock(DataProfileSchemaParser::class); + $dataProfileSchemaParser ->method('readDataProfiles') ->willReturn($parserOutput); @@ -554,26 +554,22 @@ public function mockCurlHandler(string $response, array $parserOutput): void ->method('isContentTypeJson') ->willReturn(true); - $objectManagerInstance = ObjectManagerFactory::getObjectManager(); + $objectManager = ObjectManagerFactory::getObjectManager(); $objectManagerMockInstance = $this->createMock(ObjectManager::class); $objectManagerMockInstance->expects($this->any()) ->method('create') ->will( $this->returnCallback( - function ( - string $class, - array $arguments = [] - ) use ($curlHandler, $objectManagerInstance, $mockDataProfileSchemaParser) - { + function ($class, $arguments = []) use ($curlHandler, $objectManager, $dataProfileSchemaParser) { if ($class === CurlHandler::class) { return $curlHandler; } if ($class === DataProfileSchemaParser::class) { - return $mockDataProfileSchemaParser; + return $dataProfileSchemaParser; } - return $objectManagerInstance->create($class, $arguments); + return $objectManager->create($class, $arguments); } ) ); From c6025c464df14abbb080aacf6bd2231fcae3912f Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Fri, 23 Jul 2021 11:08:39 +0300 Subject: [PATCH 036/674] 33299: Eliminated AspectMock usage from SuiteGeneratorTest.php --- .../Suite/SuiteGeneratorTest.php | 218 +++++++++++------- .../Suite/Service/SuiteGeneratorService.php | 151 ++++++++++++ .../Suite/SuiteGenerator.php | 82 +------ 3 files changed, 289 insertions(+), 162 deletions(-) create mode 100644 src/Magento/FunctionalTestingFramework/Suite/Service/SuiteGeneratorService.php diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php index 136b32e2a..a7178c624 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php @@ -3,12 +3,15 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace tests\unit\Magento\FunctionalTestFramework\Suite; -use AspectMock\Test as AspectMock; +use Exception; use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; -use Magento\FunctionalTestingFramework\ObjectManager\ObjectManager; +use Magento\FunctionalTestingFramework\ObjectManager; use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use Magento\FunctionalTestingFramework\Suite\Service\SuiteGeneratorService; use Magento\FunctionalTestingFramework\Suite\SuiteGenerator; use Magento\FunctionalTestingFramework\Suite\Generators\GroupClassGenerator; use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler; @@ -18,41 +21,31 @@ use Magento\FunctionalTestingFramework\Test\Parsers\TestDataParser; use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; use Magento\FunctionalTestingFramework\Util\Manifest\DefaultTestManifest; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; use Magento\FunctionalTestingFramework\Util\Manifest\TestManifestFactory; use tests\unit\Util\SuiteDataArrayBuilder; use tests\unit\Util\TestDataArrayBuilder; use tests\unit\Util\TestLoggingUtil; -use tests\unit\Util\MockModuleResolverBuilder; class SuiteGeneratorTest extends MagentoTestCase { - /** - * Setup entry append and clear for Suite Generator - */ - public static function setUpBeforeClass(): void - { - AspectMock::double(SuiteGenerator::class, [ - 'clearPreviousSessionConfigEntries' => null, - 'appendEntriesToConfig' => null - ]); - } - /** * Before test functionality * @return void */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup(); } /** - * Tests generating a single suite given a set of parsed test data + * Tests generating a single suite given a set of parsed test data. + * + * @return void + * @throws Exception */ - public function testGenerateSuite() + public function testGenerateSuite(): void { $suiteDataArrayBuilder = new SuiteDataArrayBuilder(); $mockData = $suiteDataArrayBuilder @@ -74,20 +67,23 @@ public function testGenerateSuite() // parse and generate suite object with mocked data $mockSuiteGenerator = SuiteGenerator::getInstance(); - $mockSuiteGenerator->generateSuite("basicTestSuite"); + $mockSuiteGenerator->generateSuite('basicTestSuite'); // assert that expected suite is generated TestLoggingUtil::getInstance()->validateMockLogStatement( 'info', - "suite generated", - ['suite' => 'basicTestSuite', 'relative_path' => "_generated" . DIRECTORY_SEPARATOR . "basicTestSuite"] + 'suite generated', + ['suite' => 'basicTestSuite', 'relative_path' => '_generated' . DIRECTORY_SEPARATOR . 'basicTestSuite'] ); } /** - * Tests generating all suites given a set of parsed test data + * Tests generating all suites given a set of parsed test data. + * + * @return void + * @throws Exception */ - public function testGenerateAllSuites() + public function testGenerateAllSuites(): void { $suiteDataArrayBuilder = new SuiteDataArrayBuilder(); $mockData = $suiteDataArrayBuilder @@ -108,22 +104,25 @@ public function testGenerateAllSuites() $this->setMockTestAndSuiteParserOutput($mockTestData, $mockData); // parse and retrieve suite object with mocked data - $exampleTestManifest = new DefaultTestManifest([], "sample" . DIRECTORY_SEPARATOR . "path"); + $exampleTestManifest = new DefaultTestManifest([], 'sample' . DIRECTORY_SEPARATOR . 'path'); $mockSuiteGenerator = SuiteGenerator::getInstance(); $mockSuiteGenerator->generateAllSuites($exampleTestManifest); // assert that expected suites are generated TestLoggingUtil::getInstance()->validateMockLogStatement( 'info', - "suite generated", - ['suite' => 'basicTestSuite', 'relative_path' => "_generated" . DIRECTORY_SEPARATOR . "basicTestSuite"] + 'suite generated', + ['suite' => 'basicTestSuite', 'relative_path' => '_generated' . DIRECTORY_SEPARATOR . 'basicTestSuite'] ); } /** - * Tests attempting to generate a suite with no included/excluded tests and no hooks + * Tests attempting to generate a suite with no included/excluded tests and no hooks. + * + * @return void + * @throws Exception */ - public function testGenerateEmptySuite() + public function testGenerateEmptySuite(): void { $testDataArrayBuilder = new TestDataArrayBuilder(); $mockTestData = $testDataArrayBuilder @@ -142,17 +141,20 @@ public function testGenerateEmptySuite() $this->setMockTestAndSuiteParserOutput($mockTestData, $mockData); // set expected error message - $this->expectExceptionMessage("Suite basicTestSuite is not defined in xml or is invalid"); + $this->expectExceptionMessage('Suite basicTestSuite is not defined in xml or is invalid'); // parse and generate suite object with mocked data $mockSuiteGenerator = SuiteGenerator::getInstance(); - $mockSuiteGenerator->generateSuite("basicTestSuite"); + $mockSuiteGenerator->generateSuite('basicTestSuite'); } /** - * Tests generating all suites with a suite containing invalid test reference + * Tests generating all suites with a suite containing invalid test reference. + * + * @return void + * @throws TestReferenceException */ - public function testInvalidSuiteTestPair() + public function testInvalidSuiteTestPair(): void { // Mock Suite1 => Test1 and Suite2 => Test2 $suiteDataArrayBuilder = new SuiteDataArrayBuilder(); @@ -198,9 +200,12 @@ public function testInvalidSuiteTestPair() } /** - * Tests generating all suites with a non-existing suite + * Tests generating all suites with a non-existing suite. + * + * @return void + * @throws TestReferenceException */ - public function testNonExistentSuiteTestPair() + public function testNonExistentSuiteTestPair(): void { $testDataArrayBuilder = new TestDataArrayBuilder(); $mockSimpleTest = $testDataArrayBuilder @@ -227,9 +232,12 @@ public function testNonExistentSuiteTestPair() } /** - * Tests generating split suites for parallel test generation + * Tests generating split suites for parallel test generation. + * + * @return void + * @throws TestReferenceException */ - public function testGenerateSplitSuiteFromTest() + public function testGenerateSplitSuiteFromTest(): void { $suiteDataArrayBuilder = new SuiteDataArrayBuilder(); $mockSuiteData = $suiteDataArrayBuilder @@ -272,8 +280,8 @@ public function testGenerateSplitSuiteFromTest() // assert last split suite group generated TestLoggingUtil::getInstance()->validateMockLogStatement( 'info', - "suite generated", - ['suite' => 'mockSuite_1_G', 'relative_path' => "_generated" . DIRECTORY_SEPARATOR . "mockSuite_1_G"] + 'suite generated', + ['suite' => 'mockSuite_1_G', 'relative_path' => '_generated' . DIRECTORY_SEPARATOR . 'mockSuite_1_G'] ); } @@ -282,75 +290,117 @@ public function testGenerateSplitSuiteFromTest() * * @param array $testData * @param array $suiteData - * @throws \Exception + * @throws Exception + */ + private function setMockTestAndSuiteParserOutput(array $testData, array $suiteData): void + { + $this->clearMockResolverProperties(); + $mockSuiteGeneratorService = $this->createMock(SuiteGeneratorService::class); + $mockSuiteGeneratorService + ->method('clearPreviousSessionConfigEntries') + ->willReturn(null); + + $mockSuiteGeneratorService + ->method('appendEntriesToConfig') + ->willReturn(null); + + $suiteGeneratorServiceProperty = new ReflectionProperty(SuiteGeneratorService::class, 'INSTANCE'); + $suiteGeneratorServiceProperty->setAccessible(true); + $suiteGeneratorServiceProperty->setValue($mockSuiteGeneratorService); + + $mockDataParser = $this->createMock(TestDataParser::class); + $mockDataParser + ->method('readTestData') + ->willReturn($testData); + + $mockSuiteDataParser = $this->createMock(SuiteDataParser::class); + $mockSuiteDataParser + ->method('readSuiteData') + ->willReturn($suiteData); + + $mockGroupClass = $this->createMock(GroupClassGenerator::class); + $mockGroupClass + ->method('generateGroupClass') + ->willReturn('namespace'); + + $objectManager = ObjectManagerFactory::getObjectManager(); + + $objectManagerMockInstance = $this->createMock(ObjectManager::class); + $objectManagerMockInstance + ->method('create') + ->will( + $this->returnCallback( + function (string $class, array $arguments = []) use ( + $mockDataParser, + $mockSuiteDataParser, + $mockGroupClass, + $objectManager + ) { + if ($class == TestDataParser::class) { + return $mockDataParser; + } + if ($class == SuiteDataParser::class) { + return $mockSuiteDataParser; + } + if ($class == GroupClassGenerator::class) { + return $mockGroupClass; + } + + return $objectManager->create($class, $arguments); + } + ) + ); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue($objectManagerMockInstance); + } + + /** + * Function used to clear mock properties. + * + * @return void */ - private function setMockTestAndSuiteParserOutput($testData, $suiteData) + private function clearMockResolverProperties(): void { - $property = new \ReflectionProperty(SuiteGenerator::class, 'instance'); + $property = new ReflectionProperty(SuiteGenerator::class, 'instance'); $property->setAccessible(true); $property->setValue(null); // clear test object handler value to inject parsed content - $property = new \ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); + $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); $property->setAccessible(true); $property->setValue(null); // clear suite object handler value to inject parsed content - $property = new \ReflectionProperty(SuiteObjectHandler::class, 'instance'); + $property = new ReflectionProperty(SuiteObjectHandler::class, 'instance'); $property->setAccessible(true); $property->setValue(null); - - $mockDataParser = AspectMock::double(TestDataParser::class, ['readTestData' => $testData])->make(); - $mockSuiteDataParser = AspectMock::double(SuiteDataParser::class, ['readSuiteData' => $suiteData])->make(); - $mockGroupClass = AspectMock::double( - GroupClassGenerator::class, - ['generateGroupClass' => 'namespace'] - )->make(); - $mockSuiteClass = AspectMock::double(SuiteGenerator::class, ['generateRelevantGroupTests' => null])->make(); - $instance = AspectMock::double( - ObjectManager::class, - ['create' => function ($clazz) use ( - $mockDataParser, - $mockSuiteDataParser, - $mockGroupClass, - $mockSuiteClass - ) { - if ($clazz == TestDataParser::class) { - return $mockDataParser; - } - if ($clazz == SuiteDataParser::class) { - return $mockSuiteDataParser; - } - if ($clazz == GroupClassGenerator::class) { - return $mockGroupClass; - } - if ($clazz == SuiteGenerator::class) { - return $mockSuiteClass; - } - }] - )->make(); - // bypass the private constructor - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); - - $property = new \ReflectionProperty(SuiteGenerator::class, 'groupClassGenerator'); - $property->setAccessible(true); - $property->setValue($instance, $instance); } /** - * clean up function runs after each test + * @inheritDoc */ - public function tearDown(): void + protected function tearDown(): void { GenerationErrorHandler::getInstance()->reset(); } /** - * clean up function runs after all tests + * @inheritDoc */ public static function tearDownAfterClass(): void { - TestLoggingUtil::getInstance()->clearMockLoggingUtil(); parent::tearDownAfterClass(); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue(null); + + $suiteGeneratorServiceProperty = new ReflectionProperty(SuiteGeneratorService::class, 'INSTANCE'); + $suiteGeneratorServiceProperty->setAccessible(true); + $suiteGeneratorServiceProperty->setValue(null); + + TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } } diff --git a/src/Magento/FunctionalTestingFramework/Suite/Service/SuiteGeneratorService.php b/src/Magento/FunctionalTestingFramework/Suite/Service/SuiteGeneratorService.php new file mode 100644 index 000000000..cec4b4997 --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/Suite/Service/SuiteGeneratorService.php @@ -0,0 +1,151 @@ + $entry) { + if (preg_match('/(Group\\\\.*)/', $entry)) { + unset($newYmlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG][$key]); + } + } + + // needed for proper yml file generation based on indices + $newYmlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG] = + array_values($newYmlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG]); + } + + if (array_key_exists(self::YAML_GROUPS_TAG, $newYmlArray)) { + unset($newYmlArray[self::YAML_GROUPS_TAG]); + } + + $ymlText = self::YAML_COPYRIGHT_TEXT . Yaml::dump($newYmlArray, 10); + file_put_contents(self::getYamlConfigFilePath() . self::YAML_CODECEPTION_CONFIG_FILENAME, $ymlText); + } + + + /** + * Function which accepts a suite name and suite path and appends a new group entry to the codeception.yml.dist + * file in order to register the set of tests as a new group. Also appends group object location if required + * by suite. + * + * @param string $suiteName + * @param string $suitePath + * @param string $groupNamespace + * + * @return void + * @throws TestFrameworkException + */ + public function appendEntriesToConfig(string $suiteName, string $suitePath, string $groupNamespace) + { + $relativeSuitePath = substr($suitePath, strlen(TESTS_BP)); + $relativeSuitePath = ltrim($relativeSuitePath, DIRECTORY_SEPARATOR); + $ymlArray = self::getYamlFileContents(); + + if (!array_key_exists(self::YAML_GROUPS_TAG, $ymlArray)) { + $ymlArray[self::YAML_GROUPS_TAG]= []; + } + + if ($groupNamespace) { + $ymlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG][] = $groupNamespace; + } + + $ymlArray[self::YAML_GROUPS_TAG][$suiteName] = [$relativeSuitePath]; + $ymlText = self::YAML_COPYRIGHT_TEXT . Yaml::dump($ymlArray, 10); + file_put_contents(self::getYamlConfigFilePath() . self::YAML_CODECEPTION_CONFIG_FILENAME, $ymlText); + } + + /** + * Function to return contents of codeception.yml file for config changes. + * + * @return array + * @throws TestFrameworkException + */ + private static function getYamlFileContents(): array + { + $configYmlFile = self::getYamlConfigFilePath() . self::YAML_CODECEPTION_CONFIG_FILENAME; + $defaultConfigYmlFile = self::getYamlConfigFilePath() . self::YAML_CODECEPTION_DIST_FILENAME; + $ymlContents = null; + + if (file_exists($configYmlFile)) { + $ymlContents = file_get_contents($configYmlFile); + } else { + $ymlContents = file_get_contents($defaultConfigYmlFile); + } + + return Yaml::parse($ymlContents) ?? []; + } + + /** + * Static getter for the Config yml filepath (as path cannot be stored in a const). + * + * @return string + * @throws TestFrameworkException + */ + private static function getYamlConfigFilePath() + { + return FilePathFormatter::format(TESTS_BP); + } +} \ No newline at end of file diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 1f8fec586..57f70238c 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -8,12 +8,12 @@ use Magento\FunctionalTestingFramework\Exceptions\Collector\ExceptionCollector; use Magento\FunctionalTestingFramework\Exceptions\FastFailException; -use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; use Magento\FunctionalTestingFramework\Exceptions\XmlException; use Magento\FunctionalTestingFramework\Suite\Generators\GroupClassGenerator; use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler; use Magento\FunctionalTestingFramework\Suite\Objects\SuiteObject; +use Magento\FunctionalTestingFramework\Suite\Service\SuiteGeneratorService; use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Util\Filesystem\DirSetupUtil; use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; @@ -21,7 +21,6 @@ use Magento\FunctionalTestingFramework\Util\Manifest\BaseTestManifest; use Magento\FunctionalTestingFramework\Util\Path\FilePathFormatter; use Magento\FunctionalTestingFramework\Util\TestGenerator; -use Symfony\Component\Yaml\Yaml; use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; /** @@ -30,14 +29,6 @@ */ class SuiteGenerator { - const YAML_CODECEPTION_DIST_FILENAME = 'codeception.dist.yml'; - const YAML_CODECEPTION_CONFIG_FILENAME = 'codeception.yml'; - const YAML_GROUPS_TAG = 'groups'; - const YAML_EXTENSIONS_TAG = 'extensions'; - const YAML_ENABLED_TAG = 'enabled'; - const YAML_COPYRIGHT_TEXT = - "# Copyright © Magento, Inc. All rights reserved.\n# See COPYING.txt for license details.\n"; - /** * Singelton Variable Instance. * @@ -268,7 +259,7 @@ private function generateSplitSuiteFromTest($suiteName, $suiteContent) try { $this->generateSuiteFromTest($suiteSplitName, $tests, $suiteName); } catch (FastFailException $e) { - throw $e; + throw $e; } catch (\Exception $e) { // There are suites that include tests that reference tests from other Magento editions // To keep backward compatibility, we will catch such exceptions with no error. @@ -331,21 +322,7 @@ private function generateGroupFile($suiteName, $tests, $originalSuiteName) */ private function appendEntriesToConfig($suiteName, $suitePath, $groupNamespace) { - $relativeSuitePath = substr($suitePath, strlen(TESTS_BP)); - $relativeSuitePath = ltrim($relativeSuitePath, DIRECTORY_SEPARATOR); - - $ymlArray = self::getYamlFileContents(); - if (!array_key_exists(self::YAML_GROUPS_TAG, $ymlArray)) { - $ymlArray[self::YAML_GROUPS_TAG]= []; - } - - if ($groupNamespace) { - $ymlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG][] = $groupNamespace; - } - $ymlArray[self::YAML_GROUPS_TAG][$suiteName] = [$relativeSuitePath]; - - $ymlText = self::YAML_COPYRIGHT_TEXT . Yaml::dump($ymlArray, 10); - file_put_contents(self::getYamlConfigFilePath() . self::YAML_CODECEPTION_CONFIG_FILENAME, $ymlText); + SuiteGeneratorService::getInstance()->appendEntriesToConfig($suiteName, $suitePath, $groupNamespace); } /** @@ -356,27 +333,7 @@ private function appendEntriesToConfig($suiteName, $suitePath, $groupNamespace) */ private static function clearPreviousSessionConfigEntries() { - $ymlArray = self::getYamlFileContents(); - $newYmlArray = $ymlArray; - // if the yaml entries haven't already been cleared - if (array_key_exists(self::YAML_EXTENSIONS_TAG, $ymlArray)) { - foreach ($ymlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG] as $key => $entry) { - if (preg_match('/(Group\\\\.*)/', $entry)) { - unset($newYmlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG][$key]); - } - } - - // needed for proper yml file generation based on indices - $newYmlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG] = - array_values($newYmlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG]); - } - - if (array_key_exists(self::YAML_GROUPS_TAG, $newYmlArray)) { - unset($newYmlArray[self::YAML_GROUPS_TAG]); - } - - $ymlText = self::YAML_COPYRIGHT_TEXT . Yaml::dump($newYmlArray, 10); - file_put_contents(self::getYamlConfigFilePath() . self::YAML_CODECEPTION_CONFIG_FILENAME, $ymlText); + SuiteGeneratorService::getInstance()->clearPreviousSessionConfigEntries(); } /** @@ -406,37 +363,6 @@ private static function clearPreviousGroupPreconditions() array_map('unlink', glob("$groupFilePath*.php")); } - /** - * Function to return contents of codeception.yml file for config changes. - * - * @return array - */ - private static function getYamlFileContents() - { - $configYmlFile = self::getYamlConfigFilePath() . self::YAML_CODECEPTION_CONFIG_FILENAME; - $defaultConfigYmlFile = self::getYamlConfigFilePath() . self::YAML_CODECEPTION_DIST_FILENAME; - - $ymlContents = null; - if (file_exists($configYmlFile)) { - $ymlContents = file_get_contents($configYmlFile); - } else { - $ymlContents = file_get_contents($defaultConfigYmlFile); - } - - return Yaml::parse($ymlContents) ?? []; - } - - /** - * Static getter for the Config yml filepath (as path cannot be stored in a const) - * - * @return string - * @throws TestFrameworkException - */ - private static function getYamlConfigFilePath() - { - return FilePathFormatter::format(TESTS_BP); - } - /** * Log error and throw collected exceptions * From 73416f085115b6b7420cd9d50646bdfc7375464a Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Fri, 23 Jul 2021 14:39:04 +0300 Subject: [PATCH 037/674] 33299: Fixed static-test --- .../Suite/SuiteGeneratorTest.php | 5 +- .../Suite/Service/SuiteGeneratorService.php | 57 ++++++++----------- .../Suite/SuiteGenerator.php | 8 +++ 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php index a7178c624..85afe7cde 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php @@ -330,7 +330,10 @@ private function setMockTestAndSuiteParserOutput(array $testData, array $suiteDa ->method('create') ->will( $this->returnCallback( - function (string $class, array $arguments = []) use ( + function ( + string $class, + array $arguments = [] + ) use ( $mockDataParser, $mockSuiteDataParser, $mockGroupClass, diff --git a/src/Magento/FunctionalTestingFramework/Suite/Service/SuiteGeneratorService.php b/src/Magento/FunctionalTestingFramework/Suite/Service/SuiteGeneratorService.php index cec4b4997..9aed81c5c 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/Service/SuiteGeneratorService.php +++ b/src/Magento/FunctionalTestingFramework/Suite/Service/SuiteGeneratorService.php @@ -8,6 +8,7 @@ namespace Magento\FunctionalTestingFramework\Suite\Service; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; +use Magento\FunctionalTestingFramework\Suite\SuiteGenerator; use Magento\FunctionalTestingFramework\Util\Path\FilePathFormatter; use Symfony\Component\Yaml\Yaml; @@ -16,15 +17,6 @@ */ class SuiteGeneratorService { - const YAML_CODECEPTION_DIST_FILENAME = 'codeception.dist.yml'; - const YAML_CODECEPTION_CONFIG_FILENAME = 'codeception.yml'; - const YAML_GROUPS_TAG = 'groups'; - const YAML_EXTENSIONS_TAG = 'extensions'; - const YAML_ENABLED_TAG = 'enabled'; - const YAML_COPYRIGHT_TEXT = - "# Copyright © Magento, Inc. All rights reserved.\n# See COPYING.txt for license details.\n"; - - /** * Singleton SuiteGeneratorService Instance. * @@ -65,56 +57,57 @@ public function clearPreviousSessionConfigEntries() $ymlArray = self::getYamlFileContents(); $newYmlArray = $ymlArray; // if the yaml entries haven't already been cleared - if (array_key_exists(self::YAML_EXTENSIONS_TAG, $ymlArray)) { - foreach ($ymlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG] as $key => $entry) { + if (array_key_exists(SuiteGenerator::YAML_EXTENSIONS_TAG, $ymlArray)) { + $ymlEntries = $ymlArray[SuiteGenerator::YAML_EXTENSIONS_TAG][SuiteGenerator::YAML_ENABLED_TAG]; + + foreach ($ymlEntries as $key => $entry) { if (preg_match('/(Group\\\\.*)/', $entry)) { - unset($newYmlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG][$key]); + unset($newYmlArray[SuiteGenerator::YAML_EXTENSIONS_TAG][SuiteGenerator::YAML_ENABLED_TAG][$key]); } } // needed for proper yml file generation based on indices - $newYmlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG] = - array_values($newYmlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG]); + $newYmlArray[SuiteGenerator::YAML_EXTENSIONS_TAG][SuiteGenerator::YAML_ENABLED_TAG] = + array_values($newYmlArray[SuiteGenerator::YAML_EXTENSIONS_TAG][SuiteGenerator::YAML_ENABLED_TAG]); } - if (array_key_exists(self::YAML_GROUPS_TAG, $newYmlArray)) { - unset($newYmlArray[self::YAML_GROUPS_TAG]); + if (array_key_exists(SuiteGenerator::YAML_GROUPS_TAG, $newYmlArray)) { + unset($newYmlArray[SuiteGenerator::YAML_GROUPS_TAG]); } - $ymlText = self::YAML_COPYRIGHT_TEXT . Yaml::dump($newYmlArray, 10); - file_put_contents(self::getYamlConfigFilePath() . self::YAML_CODECEPTION_CONFIG_FILENAME, $ymlText); + $ymlText = SuiteGenerator::YAML_COPYRIGHT_TEXT . Yaml::dump($newYmlArray, 10); + file_put_contents(self::getYamlConfigFilePath() . SuiteGenerator::YAML_CODECEPTION_CONFIG_FILENAME, $ymlText); } - /** * Function which accepts a suite name and suite path and appends a new group entry to the codeception.yml.dist * file in order to register the set of tests as a new group. Also appends group object location if required * by suite. * - * @param string $suiteName - * @param string $suitePath - * @param string $groupNamespace + * @param string $suiteName + * @param string $suitePath + * @param string|null $groupNamespace * * @return void * @throws TestFrameworkException */ - public function appendEntriesToConfig(string $suiteName, string $suitePath, string $groupNamespace) + public function appendEntriesToConfig(string $suiteName, string $suitePath, ?string $groupNamespace) { $relativeSuitePath = substr($suitePath, strlen(TESTS_BP)); $relativeSuitePath = ltrim($relativeSuitePath, DIRECTORY_SEPARATOR); $ymlArray = self::getYamlFileContents(); - if (!array_key_exists(self::YAML_GROUPS_TAG, $ymlArray)) { - $ymlArray[self::YAML_GROUPS_TAG]= []; + if (!array_key_exists(SuiteGenerator::YAML_GROUPS_TAG, $ymlArray)) { + $ymlArray[SuiteGenerator::YAML_GROUPS_TAG] = []; } if ($groupNamespace) { - $ymlArray[self::YAML_EXTENSIONS_TAG][self::YAML_ENABLED_TAG][] = $groupNamespace; + $ymlArray[SuiteGenerator::YAML_EXTENSIONS_TAG][SuiteGenerator::YAML_ENABLED_TAG][] = $groupNamespace; } - $ymlArray[self::YAML_GROUPS_TAG][$suiteName] = [$relativeSuitePath]; - $ymlText = self::YAML_COPYRIGHT_TEXT . Yaml::dump($ymlArray, 10); - file_put_contents(self::getYamlConfigFilePath() . self::YAML_CODECEPTION_CONFIG_FILENAME, $ymlText); + $ymlArray[SuiteGenerator::YAML_GROUPS_TAG][$suiteName] = [$relativeSuitePath]; + $ymlText = SuiteGenerator::YAML_COPYRIGHT_TEXT . Yaml::dump($ymlArray, 10); + file_put_contents(self::getYamlConfigFilePath() . SuiteGenerator::YAML_CODECEPTION_CONFIG_FILENAME, $ymlText); } /** @@ -125,8 +118,8 @@ public function appendEntriesToConfig(string $suiteName, string $suitePath, stri */ private static function getYamlFileContents(): array { - $configYmlFile = self::getYamlConfigFilePath() . self::YAML_CODECEPTION_CONFIG_FILENAME; - $defaultConfigYmlFile = self::getYamlConfigFilePath() . self::YAML_CODECEPTION_DIST_FILENAME; + $configYmlFile = self::getYamlConfigFilePath() . SuiteGenerator::YAML_CODECEPTION_CONFIG_FILENAME; + $defaultConfigYmlFile = self::getYamlConfigFilePath() . SuiteGenerator::YAML_CODECEPTION_DIST_FILENAME; $ymlContents = null; if (file_exists($configYmlFile)) { @@ -148,4 +141,4 @@ private static function getYamlConfigFilePath() { return FilePathFormatter::format(TESTS_BP); } -} \ No newline at end of file +} diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 57f70238c..37e370242 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -29,6 +29,14 @@ */ class SuiteGenerator { + const YAML_CODECEPTION_DIST_FILENAME = 'codeception.dist.yml'; + const YAML_CODECEPTION_CONFIG_FILENAME = 'codeception.yml'; + const YAML_GROUPS_TAG = 'groups'; + const YAML_EXTENSIONS_TAG = 'extensions'; + const YAML_ENABLED_TAG = 'enabled'; + const YAML_COPYRIGHT_TEXT = + "# Copyright © Magento, Inc. All rights reserved.\n# See COPYING.txt for license details.\n"; + /** * Singelton Variable Instance. * From 74a08921b87b66cb04f90abbccf4d0074e77bde1 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Fri, 23 Jul 2021 15:16:31 +0300 Subject: [PATCH 038/674] 33299: code refactoring after code review --- .../Suite/SuiteGeneratorTest.php | 16 ++++++++--- .../Suite/Service/SuiteGeneratorService.php | 28 +++++++++++++++---- .../Suite/SuiteGenerator.php | 8 +++--- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php index 85afe7cde..15d6b4a5f 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php @@ -31,7 +31,8 @@ class SuiteGeneratorTest extends MagentoTestCase { /** - * Before test functionality + * Before test functionality. + * * @return void */ protected function setUp(): void @@ -290,19 +291,27 @@ public function testGenerateSplitSuiteFromTest(): void * * @param array $testData * @param array $suiteData + * + * @return void * @throws Exception */ private function setMockTestAndSuiteParserOutput(array $testData, array $suiteData): void { $this->clearMockResolverProperties(); $mockSuiteGeneratorService = $this->createMock(SuiteGeneratorService::class); + $mockVoidReturnCallback = function () {};// phpcs:ignore + $mockSuiteGeneratorService ->method('clearPreviousSessionConfigEntries') - ->willReturn(null); + ->will($this->returnCallback($mockVoidReturnCallback)); $mockSuiteGeneratorService ->method('appendEntriesToConfig') - ->willReturn(null); + ->will($this->returnCallback($mockVoidReturnCallback)); + + $mockSuiteGeneratorService + ->method('generateRelevantGroupTests') + ->will($this->returnCallback($mockVoidReturnCallback)); $suiteGeneratorServiceProperty = new ReflectionProperty(SuiteGeneratorService::class, 'INSTANCE'); $suiteGeneratorServiceProperty->setAccessible(true); @@ -324,7 +333,6 @@ private function setMockTestAndSuiteParserOutput(array $testData, array $suiteDa ->willReturn('namespace'); $objectManager = ObjectManagerFactory::getObjectManager(); - $objectManagerMockInstance = $this->createMock(ObjectManager::class); $objectManagerMockInstance ->method('create') diff --git a/src/Magento/FunctionalTestingFramework/Suite/Service/SuiteGeneratorService.php b/src/Magento/FunctionalTestingFramework/Suite/Service/SuiteGeneratorService.php index 9aed81c5c..58823e195 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/Service/SuiteGeneratorService.php +++ b/src/Magento/FunctionalTestingFramework/Suite/Service/SuiteGeneratorService.php @@ -8,8 +8,10 @@ namespace Magento\FunctionalTestingFramework\Suite\Service; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; +use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; use Magento\FunctionalTestingFramework\Suite\SuiteGenerator; use Magento\FunctionalTestingFramework\Util\Path\FilePathFormatter; +use Magento\FunctionalTestingFramework\Util\TestGenerator; use Symfony\Component\Yaml\Yaml; /** @@ -52,7 +54,7 @@ public static function getInstance(): SuiteGeneratorService * @return void * @throws TestFrameworkException */ - public function clearPreviousSessionConfigEntries() + public function clearPreviousSessionConfigEntries(): void { $ymlArray = self::getYamlFileContents(); $newYmlArray = $ymlArray; @@ -65,7 +67,6 @@ public function clearPreviousSessionConfigEntries() unset($newYmlArray[SuiteGenerator::YAML_EXTENSIONS_TAG][SuiteGenerator::YAML_ENABLED_TAG][$key]); } } - // needed for proper yml file generation based on indices $newYmlArray[SuiteGenerator::YAML_EXTENSIONS_TAG][SuiteGenerator::YAML_ENABLED_TAG] = array_values($newYmlArray[SuiteGenerator::YAML_EXTENSIONS_TAG][SuiteGenerator::YAML_ENABLED_TAG]); @@ -74,7 +75,6 @@ public function clearPreviousSessionConfigEntries() if (array_key_exists(SuiteGenerator::YAML_GROUPS_TAG, $newYmlArray)) { unset($newYmlArray[SuiteGenerator::YAML_GROUPS_TAG]); } - $ymlText = SuiteGenerator::YAML_COPYRIGHT_TEXT . Yaml::dump($newYmlArray, 10); file_put_contents(self::getYamlConfigFilePath() . SuiteGenerator::YAML_CODECEPTION_CONFIG_FILENAME, $ymlText); } @@ -91,7 +91,7 @@ public function clearPreviousSessionConfigEntries() * @return void * @throws TestFrameworkException */ - public function appendEntriesToConfig(string $suiteName, string $suitePath, ?string $groupNamespace) + public function appendEntriesToConfig(string $suiteName, string $suitePath, ?string $groupNamespace): void { $relativeSuitePath = substr($suitePath, strlen(TESTS_BP)); $relativeSuitePath = ltrim($relativeSuitePath, DIRECTORY_SEPARATOR); @@ -110,6 +110,23 @@ public function appendEntriesToConfig(string $suiteName, string $suitePath, ?str file_put_contents(self::getYamlConfigFilePath() . SuiteGenerator::YAML_CODECEPTION_CONFIG_FILENAME, $ymlText); } + /** + * Function which takes a string which is the desired output directory (under _generated) and an array of tests + * relevant to the suite to be generated. The function takes this information and creates a new instance of the + * test generator which is then called to create all the test files for the suite. + * + * @param string $path + * @param array $tests + * + * @return void + * @throws TestReferenceException + */ + public function generateRelevantGroupTests(string $path, array $tests): void + { + $testGenerator = TestGenerator::getInstance($path, $tests); + $testGenerator->createAllTestFiles(null, []); + } + /** * Function to return contents of codeception.yml file for config changes. * @@ -120,7 +137,6 @@ private static function getYamlFileContents(): array { $configYmlFile = self::getYamlConfigFilePath() . SuiteGenerator::YAML_CODECEPTION_CONFIG_FILENAME; $defaultConfigYmlFile = self::getYamlConfigFilePath() . SuiteGenerator::YAML_CODECEPTION_DIST_FILENAME; - $ymlContents = null; if (file_exists($configYmlFile)) { $ymlContents = file_get_contents($configYmlFile); @@ -137,7 +153,7 @@ private static function getYamlFileContents(): array * @return string * @throws TestFrameworkException */ - private static function getYamlConfigFilePath() + private static function getYamlConfigFilePath(): string { return FilePathFormatter::format(TESTS_BP); } diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 37e370242..ced0ac552 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -346,18 +346,18 @@ private static function clearPreviousSessionConfigEntries() /** * Function which takes a string which is the desired output directory (under _generated) and an array of tests - * relevant to the suite to be generated. The function takes this information and creates a new instance of the test - * generator which is then called to create all the test files for the suite. + * relevant to the suite to be generated. The function takes this information and creates a new instance of the + * test generator which is then called to create all the test files for the suite. * * @param string $path * @param array $tests + * * @return void * @throws TestReferenceException */ private function generateRelevantGroupTests($path, $tests) { - $testGenerator = TestGenerator::getInstance($path, $tests); - $testGenerator->createAllTestFiles(null, []); + SuiteGeneratorService::getInstance()->generateRelevantGroupTests($path, $tests); } /** From b0e9c2e7aa915ec5ca6cdbb1eb7584c470cb97f8 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Fri, 23 Jul 2021 17:29:18 +0300 Subject: [PATCH 039/674] 33294: Eliminated singleton usage --- .../Allure/AllureHelperTest.php | 49 +++++++++++++------ .../Allure/AllureHelper.php | 22 +++++++-- .../Allure/Event/AddUniqueAttachmentEvent.php | 29 ----------- 3 files changed, 52 insertions(+), 48 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php index 1e17b780d..832a43978 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php @@ -9,6 +9,7 @@ use Magento\FunctionalTestingFramework\Allure\AllureHelper; use Magento\FunctionalTestingFramework\Allure\Event\AddUniqueAttachmentEvent; +use Magento\FunctionalTestingFramework\ObjectManager; use PHPUnit\Framework\TestCase; use ReflectionProperty; use Yandex\Allure\Adapter\Allure; @@ -21,19 +22,6 @@ class AllureHelperTest extends TestCase { private const MOCK_FILENAME = 'filename'; - /** - * Clear Allure Lifecycle. - * - * @return void - */ - protected function tearDown(): void - { - Allure::setDefaultLifecycle(); - $instanceProperty = new ReflectionProperty(AddUniqueAttachmentEvent::class, 'instance'); - $instanceProperty->setAccessible(true); - $instanceProperty->setValue(null); - } - /** * The AddAttachmentToStep should add an attachment to the current step. * @@ -121,6 +109,20 @@ public function testAddAttachmentUniqueName(): void $this->assertNotEquals($attachmentOne, $attachmentTwo); } + /** + * Clear Allure Lifecycle. + * + * @return void + */ + protected function tearDown(): void + { + Allure::setDefaultLifecycle(); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue(null); + } + /** * Mock entire attachment writing mechanisms. * @@ -141,8 +143,23 @@ private function mockAttachmentWriteEvent(string $filePathOrContents, string $ca ->method('getAttachmentFileName') ->willReturn(self::MOCK_FILENAME); - $instanceProperty = new ReflectionProperty(AddUniqueAttachmentEvent::class, 'instance'); - $instanceProperty->setAccessible(true); - $instanceProperty->setValue($mockInstance, $mockInstance); + $objectManagerMockInstance = $this->createMock(ObjectManager::class); + $objectManagerMockInstance + ->method('create') + ->will( + $this->returnCallback( + function (string $class) use ($mockInstance) { + if ($class === AddUniqueAttachmentEvent::class) { + return $mockInstance; + } + + return null; + } + ) + ); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue($objectManagerMockInstance, $objectManagerMockInstance); } } diff --git a/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php b/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php index 6263908bc..4fbd65eb7 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php +++ b/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php @@ -8,6 +8,7 @@ namespace Magento\FunctionalTestingFramework\Allure; use Magento\FunctionalTestingFramework\Allure\Event\AddUniqueAttachmentEvent; +use Magento\FunctionalTestingFramework\ObjectManagerFactory; use Yandex\Allure\Adapter\Allure; use Yandex\Allure\Adapter\AllureException; @@ -24,7 +25,15 @@ class AllureHelper */ public static function addAttachmentToCurrentStep($data, $caption): void { - Allure::lifecycle()->fire(AddUniqueAttachmentEvent::getInstance($data, $caption)); + /** @var AddUniqueAttachmentEvent $event */ + $event = ObjectManagerFactory::getObjectManager()->create( + AddUniqueAttachmentEvent::class, + [ + 'filePathOrContents' => $data, + 'caption' => $caption + ] + ); + Allure::lifecycle()->fire($event); } /** @@ -45,8 +54,15 @@ public static function addAttachmentToLastStep($data, $caption): void // Nothing to attach to; do not fire off allure event return; } - - $attachmentEvent = AddUniqueAttachmentEvent::getInstance($data, $caption); + + /** @var AddUniqueAttachmentEvent $attachmentEvent */ + $attachmentEvent = ObjectManagerFactory::getObjectManager()->create( + AddUniqueAttachmentEvent::class, + [ + 'filePathOrContents' => $data, + 'caption' => $caption + ] + ); $attachmentEvent->process($trueLastStep); } } diff --git a/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php b/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php index 990cd5f10..d6f36f953 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php +++ b/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php @@ -18,11 +18,6 @@ class AddUniqueAttachmentEvent extends AddAttachmentEvent private const DEFAULT_FILE_EXTENSION = 'txt'; private const DEFAULT_MIME_TYPE = 'text/plain'; - /** - * @var AddUniqueAttachmentEvent|null - */ - private static $instance; - /** * Near copy of parent function, added uniqid call for filename to prevent buggy allure behavior. * @@ -58,30 +53,6 @@ public function getAttachmentFileName($filePathOrContents, $type): string return $this->getOutputFileName($fileSha1, $fileExtension); } - /** - * Unit test helper function. - * - * @param mixed $filePathOrContents - * @param string $caption - * @param string|null $type - * - * @return AddUniqueAttachmentEvent - */ - public static function getInstance( - $filePathOrContents, - string $caption, - ?string $type = null - ): AddUniqueAttachmentEvent { - if (!self::$instance) { - self::$instance = new AddUniqueAttachmentEvent( - $filePathOrContents, - $caption, - $type - ); - } - return self::$instance; - } - /** * Copies file from one path to another. Wrapper for mocking in unit test. * From 04ea4ab25fdfd8e3f88d44fb2163d0c22a17ea50 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Fri, 23 Jul 2021 17:43:11 +0300 Subject: [PATCH 040/674] 33299: Fixed Code --- .../DataGenerator/Persist/DataPersistenceHandler.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php index 19a577f0f..fe4a10186 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php @@ -89,7 +89,7 @@ public function createEntity($storeCode = null) } $curlHandler = ObjectManagerFactory::getObjectManager()->create( CurlHandler::class, - ['create', $this->entityObject, $this->storeCode] + ['operation' => 'create', 'entityObject' => $this->entityObject, 'storeCode' => $this->storeCode] ); $result = $curlHandler->executeRequest($this->dependentObjects); $this->setCreatedObject( @@ -117,7 +117,7 @@ public function updateEntity($updateDataName, $updateDependentObjects = []) $updateEntityObject = DataObjectHandler::getInstance()->getObject($updateDataName); $curlHandler = ObjectManagerFactory::getObjectManager()->create( CurlHandler::class, - ['update', $updateEntityObject, $this->storeCode] + ['operation' => 'update', 'entityObject' => $updateEntityObject, 'storeCode' => $this->storeCode] ); $result = $curlHandler->executeRequest(array_merge($this->dependentObjects, [$this->createdObject])); $this->setCreatedObject( @@ -143,7 +143,7 @@ public function getEntity($index = null, $storeCode = null) } $curlHandler = ObjectManagerFactory::getObjectManager()->create( CurlHandler::class, - ['get', $this->entityObject, $this->storeCode] + ['operation' => 'get', 'entityObject' => $this->entityObject, 'storeCode' => $this->storeCode] ); $result = $curlHandler->executeRequest($this->dependentObjects); $this->setCreatedObject( @@ -164,7 +164,7 @@ public function deleteEntity() { $curlHandler = ObjectManagerFactory::getObjectManager()->create( CurlHandler::class, - ['delete', $this->createdObject, $this->storeCode] + ['operation' => 'delete', 'entityObject' => $this->createdObject, 'storeCode' => $this->storeCode] ); $curlHandler->executeRequest($this->dependentObjects); From 8e67f95eb298e7bb794348753b3677aa59981e44 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Mon, 26 Jul 2021 13:10:11 +0300 Subject: [PATCH 041/674] MFTF-33583: Eliminated MockModuleResolverBuilder usage --- .../Test/Handlers/TestObjectHandlerTest.php | 110 ++++++++++++++---- .../Util/ModulePathExtractorTest.php | 65 ++++++++--- .../Util/TestGeneratorTest.php | 9 ++ .../unit/Util/MockModuleResolverBuilder.php | 61 ---------- .../Test/Handlers/TestObjectHandler.php | 12 +- 5 files changed, 158 insertions(+), 99 deletions(-) delete mode 100644 dev/tests/unit/Util/MockModuleResolverBuilder.php diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php index b5d461db9..a2779bdd1 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php @@ -8,15 +8,20 @@ namespace tests\unit\Magento\FunctionalTestFramework\Test\Handlers; use Exception; +use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; +use Magento\FunctionalTestingFramework\ObjectManager; +use Magento\FunctionalTestingFramework\ObjectManagerFactory; use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Test\Objects\TestHookObject; use Magento\FunctionalTestingFramework\Test\Objects\TestObject; +use Magento\FunctionalTestingFramework\Test\Parsers\TestDataParser; use Magento\FunctionalTestingFramework\Test\Util\TestObjectExtractor; use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; +use Magento\FunctionalTestingFramework\Util\ModuleResolver; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; -use tests\unit\Util\MockModuleResolverBuilder; -use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestDataArrayBuilder; use tests\unit\Util\TestLoggingUtil; @@ -51,9 +56,7 @@ public function testGetTestObject(): void ->withTestActions() ->build(); - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup(); - ObjectHandlerUtil::mockTestObjectHandlerWitData($mockData); + $this->mockTestObjectHandler($mockData); // run object handler method $toh = TestObjectHandler::getInstance(); @@ -146,9 +149,7 @@ public function testGetTestsByGroup(): void ->withTestActions() ->build(); - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup(); - ObjectHandlerUtil::mockTestObjectHandlerWitData(array_merge($includeTest, $excludeTest)); + $this->mockTestObjectHandler(array_merge($includeTest, $excludeTest)); // execute test method $toh = TestObjectHandler::getInstance(); @@ -195,10 +196,8 @@ public function testGetTestWithModuleName(): void ->withFileName($file) ->build(); - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup(['Vendor_' . $moduleExpected => $filepath]); + $this->mockTestObjectHandler($mockData, ['Vendor_' . $moduleExpected => $filepath]); - ObjectHandlerUtil::mockTestObjectHandlerWitData($mockData); // Execute Test Method $toh = TestObjectHandler::getInstance(); $actualTestObject = $toh->getObject($testDataArrayBuilder->testName); @@ -225,13 +224,11 @@ public function testGetTestObjectWithInvalidExtends(): void ->withBeforeHook() ->withTestActions() ->build(); - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup(); - ObjectHandlerUtil::mockTestObjectHandlerWitData($testOne); - $toh = TestObjectHandler::getInstance(); + $this->mockTestObjectHandler($testOne); - $this->expectException(\Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException::class); + $toh = TestObjectHandler::getInstance(); + $this->expectException(TestFrameworkException::class); $this->expectExceptionMessage("Mftf Test can not extend from itself: " . "testOne"); $toh->getObject('testOne'); @@ -264,9 +261,7 @@ public function testGetAllTestObjectsWithInvalidExtends(): void ->withTestActions() ->build(); - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup(); - ObjectHandlerUtil::mockTestObjectHandlerWitData(array_merge($testOne, $testTwo)); + $this->mockTestObjectHandler(array_merge($testOne, $testTwo)); $toh = TestObjectHandler::getInstance(); $toh->getAllObjects(); @@ -297,9 +292,7 @@ public function testGetTestObjectWhenEnablePause(): void ->withTestActions() ->build(); - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup(); - ObjectHandlerUtil::mockTestObjectHandlerWitData($mockData); + $this->mockTestObjectHandler($mockData); // run object handler method $toh = TestObjectHandler::getInstance(); @@ -381,4 +374,77 @@ protected function tearDown(): void TestLoggingUtil::getInstance()->clearMockLoggingUtil(); parent::tearDownAfterClass(); } + + /** + * Mock test object handler. + * + * @param array $data + * @param array|null $paths + * + * @return void + */ + private function mockTestObjectHandler(array $data, ?array $paths = null): void + { + if (!$paths) { + $paths = ['Magento_Module' => '/base/path/some/other/path/Magento/Module']; + } + // clear test object handler value to inject parsed content + $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); + $property->setAccessible(true); + $property->setValue(null); + + $mockDataParser = $this->createMock(TestDataParser::class); + $mockDataParser + ->method('readTestData') + ->willReturn($data); + + $mockConfig = $this->createMock(MftfApplicationConfig::class); + $mockConfig + ->method('forceGenerateEnabled') + ->willReturn(false); + + $mockResolver = $this->createMock(ModuleResolver::class); + $mockResolver + ->method('getEnabledModules') + ->willReturn([]); + + $objectManager = ObjectManagerFactory::getObjectManager(); + $objectManagerMockInstance = $this->createMock(ObjectManager::class); + $objectManagerMockInstance + ->method('create') + ->will( + $this->returnCallback( + function ( + $class, + $arguments = [] + ) use ( + $objectManager, + $mockDataParser, + $mockConfig, + $mockResolver + ) { + if ($class === TestDataParser::class) { + return $mockDataParser; + } + if ($class === MftfApplicationConfig::class) { + return $mockConfig; + } + if ($class === ModuleResolver::class) { + return $mockResolver; + } + + return $objectManager->create($class, $arguments); + } + ) + ); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue($objectManagerMockInstance); + + $resolver = ModuleResolver::getInstance(); + $property = new ReflectionProperty(ModuleResolver::class, 'enabledModuleNameAndPaths'); + $property->setAccessible(true); + $property->setValue($resolver, $paths); + } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModulePathExtractorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModulePathExtractorTest.php index 3f2ba1962..00be96582 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModulePathExtractorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModulePathExtractorTest.php @@ -3,12 +3,15 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\Util; +use Magento\FunctionalTestingFramework\ObjectManager; use Magento\FunctionalTestingFramework\Util\ModulePathExtractor; +use Magento\FunctionalTestingFramework\Util\ModuleResolver; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; -use tests\unit\Util\MockModuleResolverBuilder; class ModulePathExtractorTest extends MagentoTestCase { @@ -36,8 +39,7 @@ public function testGetModuleAppCode() { $mockPath = '/base/path/app/code/Magento/ModuleA/Test/Mftf/Test/SomeTest.xml'; - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup($this->mockTestModulePaths); + $this->mockModuleResolver($this->mockTestModulePaths); $extractor = new ModulePathExtractor(); $this->assertEquals('ModuleA', $extractor->extractModuleName($mockPath)); } @@ -51,8 +53,7 @@ public function testGetVendorAppCode() { $mockPath = '/base/path/app/code/VendorB/ModuleB/Test/Mftf/Test/SomeTest.xml'; - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup($this->mockTestModulePaths); + $this->mockModuleResolver($this->mockTestModulePaths); $extractor = new ModulePathExtractor(); $this->assertEquals('VendorB', $extractor->getExtensionPath($mockPath)); } @@ -66,8 +67,7 @@ public function testGetModuleDevTests() { $mockPath = '/base/path/dev/tests/acceptance/tests/functional/Magento/ModuleCTest/Test/SomeTest.xml'; - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup($this->mockTestModulePaths); + $this->mockModuleResolver($this->mockTestModulePaths); $extractor = new ModulePathExtractor(); $this->assertEquals('ModuleC', $extractor->extractModuleName($mockPath)); } @@ -81,8 +81,7 @@ public function testGetVendorDevTests() { $mockPath = '/base/path/dev/tests/acceptance/tests/functional/VendorD/ModuleDTest/Test/SomeTest.xml'; - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup($this->mockTestModulePaths); + $this->mockModuleResolver($this->mockTestModulePaths); $extractor = new ModulePathExtractor(); $this->assertEquals('VendorD', $extractor->getExtensionPath($mockPath)); } @@ -96,8 +95,7 @@ public function testGetModule() { $mockPath = '/base/path/dev/tests/acceptance/tests/functional/FunctionalTest/SomeModuleE/Test/SomeTest.xml'; - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup($this->mockTestModulePaths); + $this->mockModuleResolver($this->mockTestModulePaths); $extractor = new ModulePathExtractor(); $this->assertEquals('NO MODULE DETECTED', $extractor->extractModuleName($mockPath)); } @@ -111,8 +109,7 @@ public function testGetModuleVendorDir() { $mockPath = '/base/path/vendor/magento/module-modulef/Test/Mftf/Test/SomeTest.xml'; - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup($this->mockTestModulePaths); + $this->mockModuleResolver($this->mockTestModulePaths); $extractor = new ModulePathExtractor(); $this->assertEquals('ModuleF', $extractor->extractModuleName($mockPath)); } @@ -126,9 +123,47 @@ public function testGetVendorVendorDir() { $mockPath = '/base/path/vendor/vendorg/module-moduleg-test/Test/SomeTest.xml'; - $resolverMock = new MockModuleResolverBuilder(); - $resolverMock->setup($this->mockTestModulePaths); + $this->mockModuleResolver($this->mockTestModulePaths); $extractor = new ModulePathExtractor(); $this->assertEquals('VendorG', $extractor->getExtensionPath($mockPath)); } + + /** + * Mock module resolver. + * + * @param array $paths + * + * @return void + */ + private function mockModuleResolver(array $paths): void + { + $mockResolver = $this->createMock(ModuleResolver::class); + $mockResolver + ->method('getEnabledModules') + ->willReturn([]); + + $objectManagerMockInstance = $this->createMock(ObjectManager::class); + $objectManagerMockInstance + ->method('create') + ->will( + $this->returnCallback( + function ($class) use ($mockResolver) { + if ($class === ModuleResolver::class) { + return $mockResolver; + } + + return null; + } + ) + ); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue($objectManagerMockInstance); + + $resolver = ModuleResolver::getInstance(); + $property = new ReflectionProperty(ModuleResolver::class, 'enabledModuleNameAndPaths'); + $property->setAccessible(true); + $property->setValue($resolver, $paths); + } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 730493191..c4dc291c1 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -11,6 +11,7 @@ use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; use Magento\FunctionalTestingFramework\Filter\FilterList; +use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Test\Objects\TestHookObject; use Magento\FunctionalTestingFramework\Test\Objects\TestObject; @@ -31,6 +32,10 @@ class TestGeneratorTest extends MagentoTestCase protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); + // Used to mock initTestData method running. + $shouldSkipInitTestDataProperty = new ReflectionProperty(TestObjectHandler::class, 'shouldSkipInitTestData'); + $shouldSkipInitTestDataProperty->setAccessible(true); + $shouldSkipInitTestDataProperty->setValue(true); } /** @@ -41,6 +46,10 @@ protected function setUp(): void protected function tearDown(): void { GenerationErrorHandler::getInstance()->reset(); + + $shouldSkipInitTestDataProperty = new ReflectionProperty(TestObjectHandler::class, 'shouldSkipInitTestData'); + $shouldSkipInitTestDataProperty->setAccessible(true); + $shouldSkipInitTestDataProperty->setValue(false); } /** diff --git a/dev/tests/unit/Util/MockModuleResolverBuilder.php b/dev/tests/unit/Util/MockModuleResolverBuilder.php deleted file mode 100644 index 0e1b6fc31..000000000 --- a/dev/tests/unit/Util/MockModuleResolverBuilder.php +++ /dev/null @@ -1,61 +0,0 @@ - '/base/path/some/other/path/Magento/Module']; - - /** - * Mock ModuleResolver builder - * - * @param array $paths - * @return void - * @throws \Exception - */ - public function setup($paths = null) - { - if (empty($paths)) { - $paths = $this->defaultPaths; - } - - $mockConfig = AspectMock::double(MftfApplicationConfig::class, ['forceGenerateEnabled' => false]); - $instance = AspectMock::double(ObjectManager::class, ['create' => $mockConfig->make(), 'get' => null])->make(); - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); - - $property = new \ReflectionProperty(ModuleResolver::class, 'instance'); - $property->setAccessible(true); - $property->setValue(null); - - $mockResolver = AspectMock::double( - ModuleResolver::class, - [ - 'getAdminToken' => false, - 'globRelevantPaths' => [], - 'getEnabledModules' => [] - ] - ); - $instance = AspectMock::double(ObjectManager::class, ['create' => $mockResolver->make(), 'get' => null]) - ->make(); - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); - - $resolver = ModuleResolver::getInstance(); - $property = new \ReflectionProperty(ModuleResolver::class, 'enabledModuleNameAndPaths'); - $property->setAccessible(true); - $property->setValue($resolver, $paths); - } -} diff --git a/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php b/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php index 4abc26c36..407fc89d9 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php @@ -44,6 +44,13 @@ class TestObjectHandler implements ObjectHandlerInterface */ private $tests = []; + /** + * Check if initTestData method should be skipped during object initialization. + * + * @var boolean + */ + private static $shouldSkipInitTestData = false; + /** * Instance of ObjectExtensionUtil class * @@ -62,7 +69,10 @@ public static function getInstance($validateAnnotations = true) { if (!self::$testObjectHandler) { self::$testObjectHandler = new TestObjectHandler(); - self::$testObjectHandler->initTestData($validateAnnotations); + + if (!self::$shouldSkipInitTestData) { + self::$testObjectHandler->initTestData($validateAnnotations); + } } return self::$testObjectHandler; From ac6cef43ce6876430a17cfc63c9b6ce49b4a148d Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Mon, 26 Jul 2021 14:35:30 +0300 Subject: [PATCH 042/674] 33581: Eliminated AspectMock where it was imported but never used --- .../Handlers/DataObjectHandlerTest.php | 81 +++--- .../OperationDefinitionObjectHandlerTest.php | 222 +++++++++------- .../Page/Handlers/PageObjectHandlerTest.php | 112 +++++---- .../Handlers/SectionObjectHandlerTest.php | 79 +++--- .../Handlers/ActionGroupObjectHandlerTest.php | 34 +-- .../ActionGroupAnnotationExtractorTest.php | 34 +-- .../Test/Util/AnnotationExtractorTest.php | 236 ++++++++++-------- 7 files changed, 461 insertions(+), 337 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php index 745789501..57cdb6a64 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php @@ -3,15 +3,14 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\DataGenerator\Handlers; -use AspectMock\Test as AspectMock; +use Exception; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject; -use Magento\FunctionalTestingFramework\DataGenerator\Parsers\DataProfileSchemaParser; -use Magento\FunctionalTestingFramework\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestLoggingUtil; @@ -22,9 +21,9 @@ class DataObjectHandlerTest extends MagentoTestCase { /** - * Setup method + * @inheritDoc */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -145,9 +144,12 @@ public function setUp(): void ]; /** - * getAllObjects should contain the expected data object + * Validate getAllObjects should contain the expected data object. + * + * @return void + * @throws Exception */ - public function testGetAllObjects() + public function testGetAllObjects(): void { ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT); @@ -161,9 +163,12 @@ public function testGetAllObjects() } /** - * test deprecated data object + * Validate test deprecated data object. + * + * @return void + * @throws Exception */ - public function testDeprecatedDataObject() + public function testDeprecatedDataObject(): void { ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT_DEPRECATED); @@ -173,15 +178,18 @@ public function testDeprecatedDataObject() //validate deprecation warning TestLoggingUtil::getInstance()->validateMockLogStatement( 'warning', - "DEPRECATION: The data entity 'EntityOne' is deprecated.", - ["fileName" => "filename.xml", "deprecatedMessage" => "deprecation message"] + 'DEPRECATION: The data entity \'EntityOne\' is deprecated.', + ['fileName' => 'filename.xml', 'deprecatedMessage' => 'deprecation message'] ); } /** - * getObject should return the expected data object if it exists + * Validate getObject should return the expected data object if it exists. + * + * @return void + * @throws Exception */ - public function testGetObject() + public function testGetObject(): void { ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT); @@ -194,9 +202,12 @@ public function testGetObject() } /** - * getAllObjects should return the expected data object if it exists + * Validate getAllObjects should return the expected data object if it exists. + * + * @return void + * @throws Exception */ - public function testGetObjectNull() + public function testGetObjectNull(): void { ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT); @@ -205,9 +216,12 @@ public function testGetObjectNull() } /** - * getAllObjects should contain the expected data object with extends + * Validate getAllObjects should contain the expected data object with extends. + * + * @return void + * @throws Exception */ - public function testGetAllObjectsWithDataExtends() + public function testGetAllObjectsWithDataExtends(): void { ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT_WITH_EXTEND); @@ -229,9 +243,12 @@ public function testGetAllObjectsWithDataExtends() } /** - * getObject should return the expected data object with extended data if it exists + * Validate getObject should return the expected data object with extended data if it exists. + * + * @return void + * @throws Exception */ - public function testGetObjectWithDataExtends() + public function testGetObjectWithDataExtends(): void { ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT_WITH_EXTEND); @@ -252,15 +269,18 @@ public function testGetObjectWithDataExtends() } /** - * getAllObjects should throw TestFrameworkException exception if some data extends itself + * Validate getAllObjects should throw TestFrameworkException exception if some data extends itself. + * + * @return void + * @throws Exception */ - public function testGetAllObjectsWithDataExtendsItself() + public function testGetAllObjectsWithDataExtendsItself(): void { ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT_WITH_EXTEND_INVALID); - $this->expectException(\Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException::class); + $this->expectException(TestFrameworkException::class); $this->expectExceptionMessage( - "Mftf Data can not extend from itself: " + 'Mftf Data can not extend from itself: ' . self::PARSER_OUTPUT_WITH_EXTEND_INVALID['entity']['EntityOne']['name'] ); @@ -269,15 +289,18 @@ public function testGetAllObjectsWithDataExtendsItself() } /** - * getObject should throw TestFrameworkException exception if requested data extends itself + * Validate getObject should throw TestFrameworkException exception if requested data extends itself. + * + * @return void + * @throws Exception */ - public function testGetObjectWithDataExtendsItself() + public function testGetObjectWithDataExtendsItself(): void { ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT_WITH_EXTEND_INVALID); - $this->expectException(\Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException::class); + $this->expectException(TestFrameworkException::class); $this->expectExceptionMessage( - "Mftf Data can not extend from itself: " + 'Mftf Data can not extend from itself: ' . self::PARSER_OUTPUT_WITH_EXTEND_INVALID['entity']['EntityOne']['name'] ); @@ -288,7 +311,7 @@ public function testGetObjectWithDataExtendsItself() } /** - * clean up function runs after all tests + * @inheritDoc */ public static function tearDownAfterClass(): void { diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php index 35b06a24a..6c8fc7c45 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php @@ -3,16 +3,14 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\DataGenerator\Handlers; -use AspectMock\Test as AspectMock; +use Exception; +use Magento\FunctionalTestingFramework\DataGenerator\Handlers\OperationDefinitionObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Objects\OperationDefinitionObject; use Magento\FunctionalTestingFramework\DataGenerator\Objects\OperationElement; -use Magento\FunctionalTestingFramework\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; -use Magento\FunctionalTestingFramework\DataGenerator\Handlers\OperationDefinitionObjectHandler; -use Magento\FunctionalTestingFramework\DataGenerator\Parsers\OperationDefinitionParser; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestLoggingUtil; @@ -23,19 +21,25 @@ class OperationDefinitionObjectHandlerTest extends MagentoTestCase { /** - * Setup method + * @inheritDoc */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } - public function testGetMultipleObjects() + /** + * Validate testGetMultipleObjects. + * + * @return void + * @throws Exception + */ + public function testGetMultipleObjects(): void { // Data Variables for Assertions - $dataType1 = "type1"; - $operationType1 = "create"; - $operationType2 = "update"; + $dataType1 = 'type1'; + $operationType1 = 'create'; + $operationType2 = 'update'; /** * Parser Output. Just two simple pieces of metadata with 1 field each @@ -48,31 +52,31 @@ public function testGetMultipleObjects() * key=id, value=integer */ $mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ - "testOperationName" => [ + 'testOperationName' => [ OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => "auth", - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => "V1/Type1", - OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => "POST", + OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1', + OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'POST', OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => "id", - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => "integer" + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => 'id', + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' ], - ] - ],[ + ] + ],[ OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType2, - OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => "auth", - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => "V1/Type1/{id}", - OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => "PUT", + OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1/{id}', + OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'PUT', OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => "id", - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => "integer" + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => 'id', + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' ], ] - ]]]; + ]]]; ObjectHandlerUtil::mockOperationHandlerWithData($mockData); //Perform Assertions @@ -82,11 +86,17 @@ public function testGetMultipleObjects() $this->assertArrayHasKey($operationType2 . $dataType1, $operations); } - public function testDeprecatedOperation() + /** + * Validate testDeprecatedOperation. + * + * @return void + * @throws Exception + */ + public function testDeprecatedOperation(): void { // Data Variables for Assertions - $dataType1 = "type1"; - $operationType1 = "create"; + $dataType1 = 'type1'; + $operationType1 = 'create'; /** * Parser Output. Just one metadata with 1 field @@ -96,16 +106,16 @@ public function testDeprecatedOperation() * key=id, value=integer */ $mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ - "testOperationName" => [ + 'testOperationName' => [ OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => "auth", - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => "V1/Type1", - OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => "POST", + OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1', + OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'POST', OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => "id", - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => "integer" + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => 'id', + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' ], ], OperationDefinitionObjectHandler::OBJ_DEPRECATED => 'deprecation message' @@ -119,7 +129,7 @@ public function testDeprecatedOperation() $this->assertArrayHasKey($operationType1 . $dataType1, $operations); TestLoggingUtil::getInstance()->validateMockLogStatement( 'notice', - "NOTICE: 1 metadata operation name violations detected. See mftf.log for details.", + 'NOTICE: 1 metadata operation name violations detected. See mftf.log for details.', [] ); // test run time deprecation notice @@ -127,33 +137,39 @@ public function testDeprecatedOperation() $operation->logDeprecated(); TestLoggingUtil::getInstance()->validateMockLogStatement( 'warning', - "DEPRECATION: The operation testOperationName is deprecated.", + 'DEPRECATION: The operation testOperationName is deprecated.', ['operationType' => 'create', 'deprecatedMessage' => 'deprecation message'] ); } - public function testObjectCreation() + /** + * Validate testObjectCreation. + * + * @return void + * @throws Exception + */ + public function testObjectCreation(): void { // Data Variables for Assertions - $testDataTypeName1 = "type1"; - $testAuth = "auth"; - $testUrl = "V1/dataType"; - $testOperationType = "create"; - $testMethod = "POST"; - $testSuccessRegex = "/messages-message-success/"; - $testContentType = "application/json"; - $testHeaderParam = "testParameter"; - $testHeaderValue = "testHeader"; + $testDataTypeName1 = 'type1'; + $testAuth = 'auth'; + $testUrl = 'V1/dataType'; + $testOperationType = 'create'; + $testMethod = 'POST'; + $testSuccessRegex = '/messages-message-success/'; + $testContentType = 'application/json'; + $testHeaderParam = 'testParameter'; + $testHeaderValue = 'testHeader'; // Nested Object variables - $nestedObjectKey = "objectKey"; - $nestedObjectType = "objectType"; - $nestedEntryKey1 = "id"; - $nestedEntryValue1 = "integer"; - $nestedEntryKey2 = "name"; - $nestedEntryValue2 = "string"; - $nestedEntryRequired2 = "true"; - $nestedEntryKey3 = "active"; - $nestedEntryValue3 = "boolean"; + $nestedObjectKey = 'objectKey'; + $nestedObjectType = 'objectType'; + $nestedEntryKey1 = 'id'; + $nestedEntryValue1 = 'integer'; + $nestedEntryKey2 = 'name'; + $nestedEntryValue2 = 'string'; + $nestedEntryRequired2 = 'true'; + $nestedEntryKey3 = 'active'; + $nestedEntryValue3 = 'boolean'; /** * Complex Object @@ -172,7 +188,7 @@ public function testObjectCreation() * */ $mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ - "testOperationName" => [ + 'testOperationName' => [ OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $testDataTypeName1, OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $testOperationType, OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => $testAuth, @@ -181,7 +197,7 @@ public function testObjectCreation() OperationDefinitionObjectHandler::ENTITY_OPERATION_SUCCESS_REGEX => $testSuccessRegex, OperationDefinitionObjectHandler::ENTITY_OPERATION_CONTENT_TYPE => [ 0 => [ - "value" => $testContentType + 'value' => $testContentType ] ], OperationDefinitionObjectHandler::ENTITY_OPERATION_HEADER => [ @@ -192,8 +208,8 @@ public function testObjectCreation() ], OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM => [ 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM_KEY => "testUrlParamKey", - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM_VALUE => "testUrlParamValue" + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM_KEY => 'testUrlParamKey', + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM_VALUE => 'testUrlParamValue' ] ], OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT => [ @@ -220,7 +236,14 @@ public function testObjectCreation() ]]]; // Prepare objects to compare against $field = OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY; - $expectedNestedField = new OperationElement($nestedEntryKey1, $nestedEntryValue1, $field, false, [], null); + $expectedNestedField = new OperationElement( + $nestedEntryKey1, + $nestedEntryValue1, + $field, + false, + [], + null + ); $expectedNestedField2 = new OperationElement( $nestedEntryKey2, $nestedEntryValue2, @@ -229,14 +252,25 @@ public function testObjectCreation() [], null ); - $expectedNestedField3 = new OperationElement($nestedEntryKey3, $nestedEntryValue3, $field, false, [], null); + $expectedNestedField3 = new OperationElement( + $nestedEntryKey3, + $nestedEntryValue3, + $field, + false, + [], + null + ); $expectedOperation = new OperationElement( $nestedObjectKey, $nestedObjectType, OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT, false, [], - [0 => $expectedNestedField, 1 => $expectedNestedField2, 2 =>$expectedNestedField3] + [ + 0 => $expectedNestedField, + 1 => $expectedNestedField2, + 2 => $expectedNestedField3 + ] ); // Set up mocked data output @@ -264,16 +298,22 @@ public function testObjectCreation() $this->assertEquals($expectedOperation, $operation->getOperationMetadata()[0]); } - public function testObjectArrayCreation() + /** + * Validate testObjectArrayCreation. + * + * @return void + * @throws Exception + */ + public function testObjectArrayCreation(): void { // Data Variables for Assertions - $dataType1 = "type1"; - $operationType1 = "create"; - $objectArrayKey = "ObjectArray"; - $twiceNestedObjectKey = "nestedObjectKey"; - $twiceNestedObjectType = "nestedObjectType"; - $twiceNestedEntryKey = "nestedFieldKey"; - $twiceNestedEntryValue = "string"; + $dataType1 = 'type1'; + $operationType1 = 'create'; + $objectArrayKey = 'ObjectArray'; + $twiceNestedObjectKey = 'nestedObjectKey'; + $twiceNestedObjectType = 'nestedObjectType'; + $twiceNestedEntryKey = 'nestedFieldKey'; + $twiceNestedEntryValue = 'string'; // Parser Output /** * Metadata with nested array of objects, with a single field @@ -284,12 +324,12 @@ public function testObjectArrayCreation() * has field with key = nestedFieldKey, value = string */ $mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ - "testOperationName" => [ + 'testOperationName' => [ OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => "auth", - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => "V1/Type1", - OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => "POST", + OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1', + OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'POST', OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY => [ 0 => [ OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT_KEY => $objectArrayKey, @@ -325,7 +365,9 @@ public function testObjectArrayCreation() OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT, false, [], - [0 => $twoLevelNestedMetadata] + [ + 0 => $twoLevelNestedMetadata + ] ); $expectedOperation = new OperationElement( @@ -333,7 +375,9 @@ public function testObjectArrayCreation() $twiceNestedObjectType, $twiceNestedObjectKey, false, - [$twiceNestedObjectKey => $oneLevelNestedMetadata], + [ + $twiceNestedObjectKey => $oneLevelNestedMetadata + ], null ); @@ -348,15 +392,21 @@ public function testObjectArrayCreation() $this->assertEquals($expectedOperation, $operation->getOperationMetadata()[0]); } - public function testLooseJsonCreation() + /** + * Validate testLooseJsonCreation. + * + * @return void + * @throws Exception + */ + public function testLooseJsonCreation(): void { // Data Variables for Assertions - $dataType = "dataType"; - $operationType = "create"; - $entryKey = "id"; - $entryValue = "integer"; - $arrayKey = "arrayKey"; - $arrayValue = "string"; + $dataType = 'dataType'; + $operationType = 'create'; + $entryKey = 'id'; + $entryValue = 'integer'; + $arrayKey = 'arrayKey'; + $arrayValue = 'string'; /** * Operation with no objects, just an entry and an array of strings * testOperationName @@ -366,7 +416,7 @@ public function testLooseJsonCreation() * fields of value = string */ $mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ - "testOperationName" => [ + 'testOperationName' => [ OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType, OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType, OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ @@ -418,10 +468,12 @@ public function testLooseJsonCreation() } /** - * clean up function runs after all tests + * @inheritDoc */ public static function tearDownAfterClass(): void { + parent::tearDownAfterClass(); + TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php index eb305bc4d..bfa1fa8e0 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php @@ -3,109 +3,125 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\Page\Handlers; -use AspectMock\Test as AspectMock; -use Magento\FunctionalTestingFramework\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use Magento\FunctionalTestingFramework\Exceptions\XmlException; use Magento\FunctionalTestingFramework\Page\Handlers\PageObjectHandler; -use Magento\FunctionalTestingFramework\XmlParser\PageParser; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestLoggingUtil; +/** + * Class PageObjectHandlerTest + */ class PageObjectHandlerTest extends MagentoTestCase { /** - * Setup method + * @inheritDoc */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } - public function testGetPageObject() + /** + * Validate testGetPageObject. + * + * @return void + * @throws XmlException + */ + public function testGetPageObject(): void { $mockData = [ - "testPage1" => [ - "url" => "testURL1", - "module" => "testModule1", - "section" => [ - "someSection1" => [], - "someSection2" => [] + 'testPage1' => [ + 'url' => 'testURL1', + 'module' => 'testModule1', + 'section' => [ + 'someSection1' => [], + 'someSection2' => [] ], - "area" => "test" + 'area' => 'test' ], - "testPage2" => [ - "url" => "testURL2", - "module" => "testModule2", - "parameterized" => true, - "section" => [ - "someSection1" => [] + 'testPage2' => [ + 'url' => 'testURL2', + 'module' => 'testModule2', + 'parameterized' => true, + 'section' => [ + 'someSection1' => [] ], - "area" => "test" + 'area' => 'test' ]]; - ObjectHandlerUtil::mockPageObjectHandlerWithData($mockData); - // get pages + ObjectHandlerUtil::mockPageObjectHandlerWithData($mockData); $pageHandler = PageObjectHandler::getInstance(); $pages = $pageHandler->getAllObjects(); - $page = $pageHandler->getObject('testPage1'); + $pageHandler->getObject('testPage1'); $invalidPage = $pageHandler->getObject('someInvalidPage'); // perform asserts $this->assertCount(2, $pages); - $this->assertArrayHasKey("testPage1", $pages); - $this->assertArrayHasKey("testPage2", $pages); + $this->assertArrayHasKey('testPage1', $pages); + $this->assertArrayHasKey('testPage2', $pages); $this->assertNull($invalidPage); } - public function testGetEmptyPage() + /** + * Validate testGetEmptyPage. + * + * @return void + * @throws XmlException + */ + public function testGetEmptyPage(): void { $mockData = [ - "testPage1" => [ - "url" => "testURL1", - "module" => "testModule1", - "section" => [ + 'testPage1' => [ + 'url' => 'testURL1', + 'module' => 'testModule1', + 'section' => [ ], - "area" => "test" + 'area' => 'test' ]]; - ObjectHandlerUtil::mockPageObjectHandlerWithData($mockData); - // get pages - $page = PageObjectHandler::getInstance()->getObject('testPage1'); + ObjectHandlerUtil::mockPageObjectHandlerWithData($mockData); + PageObjectHandler::getInstance()->getObject('testPage1'); // Empty page has been read in and gotten without an exception being thrown. $this->addToAssertionCount(1); } - public function testDeprecatedPage() + /** + * Validate testDeprecatedPage. + * + * @return void + * @throws XmlException + */ + public function testDeprecatedPage(): void { $mockData = [ - "testPage1" => [ - "url" => "testURL1", - "module" => "testModule1", - "section" => [ + 'testPage1' => [ + 'url' => 'testURL1', + 'module' => 'testModule1', + 'section' => [ ], - "area" => "test", - "deprecated" => "deprecation message", - "filename" => "filename.xml" + 'area' => 'test', + 'deprecated' => 'deprecation message', + 'filename' => 'filename.xml' ]]; - ObjectHandlerUtil::mockPageObjectHandlerWithData($mockData); - // get pages - $page = PageObjectHandler::getInstance()->getObject('testPage1'); + ObjectHandlerUtil::mockPageObjectHandlerWithData($mockData); + PageObjectHandler::getInstance()->getObject('testPage1'); TestLoggingUtil::getInstance()->validateMockLogStatement( 'notice', - "NOTICE: 1 Page name violations detected. See mftf.log for details.", + 'NOTICE: 1 Page name violations detected. See mftf.log for details.', [] ); } /** - * clean up function runs after all tests + * @inheritDoc */ public static function tearDownAfterClass(): void { diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php index 69088944a..79ad32b4c 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php @@ -3,45 +3,52 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\Page\Handlers; -use AspectMock\Test as AspectMock; -use Magento\FunctionalTestingFramework\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use Magento\FunctionalTestingFramework\Exceptions\XmlException; use Magento\FunctionalTestingFramework\Page\Handlers\SectionObjectHandler; -use Magento\FunctionalTestingFramework\XmlParser\SectionParser; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestLoggingUtil; +/** + * Class SectionObjectHandlerTest + */ class SectionObjectHandlerTest extends MagentoTestCase { /** - * Setup method + * @inheritDoc */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } - public function testGetSectionObject() + /** + * Validate testGetSectionObject. + * + * @return void + * @throws XmlException + */ + public function testGetSectionObject(): void { $mockData = [ - "testSection1" => [ - "element" => [ - "testElement" => [ - "type" => "input", - "selector" => "#element" + 'testSection1' => [ + 'element' => [ + 'testElement' => [ + 'type' => 'input', + 'selector' => '#element' ] ] ], - "testSection2" => [ - "element" => [ - "testElement" => [ - "type" => "input", - "selector" => "#element" + 'testSection2' => [ + 'element' => [ + 'testElement' => [ + 'type' => 'input', + 'selector' => '#element' ] ] ] @@ -52,29 +59,35 @@ public function testGetSectionObject() // get sections $sectionHandler = SectionObjectHandler::getInstance(); $sections = $sectionHandler->getAllObjects(); - $section = $sectionHandler->getObject("testSection1"); - $invalidSection = $sectionHandler->getObject("InvalidSection"); + $sectionHandler->getObject('testSection1'); + $invalidSection = $sectionHandler->getObject('InvalidSection'); // perform asserts $this->assertCount(2, $sections); - $this->assertArrayHasKey("testSection1", $sections); - $this->assertArrayHasKey("testSection2", $sections); + $this->assertArrayHasKey('testSection1', $sections); + $this->assertArrayHasKey('testSection2', $sections); $this->assertNull($invalidSection); } - public function testDeprecatedSection() + /** + * Validate testDeprecatedSection. + * + * @return void + * @throws XmlException + */ + public function testDeprecatedSection(): void { $mockData = [ - "testSection1" => [ - "element" => [ - "testElement" => [ - "type" => "input", - "selector" => "#element", - "deprecated" => "element deprecation message" + 'testSection1' => [ + 'element' => [ + 'testElement' => [ + 'type' => 'input', + 'selector' => '#element', + 'deprecated' => 'element deprecation message' ] ], - "filename" => "filename.xml", - "deprecated" => "section deprecation message" + 'filename' => 'filename.xml', + 'deprecated' => 'section deprecation message' ] ]; @@ -82,18 +95,18 @@ public function testDeprecatedSection() // get sections $sectionHandler = SectionObjectHandler::getInstance(); - $section = $sectionHandler->getObject("testSection1"); + $sectionHandler->getObject('testSection1'); //validate deprecation warning TestLoggingUtil::getInstance()->validateMockLogStatement( 'notice', - "NOTICE: 1 Section name violations detected. See mftf.log for details.", + 'NOTICE: 1 Section name violations detected. See mftf.log for details.', [] ); } /** - * clean up function runs after all tests + * @inheritDoc */ public static function tearDownAfterClass(): void { diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php index 71c1833ba..71da6d492 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php @@ -3,28 +3,29 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\Test\Handlers; -use AspectMock\Test as AspectMock; - -use Go\Aop\Aspect; -use Magento\FunctionalTestingFramework\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use Exception; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Test\Handlers\ActionGroupObjectHandler; -use tests\unit\Util\MagentoTestCase; use tests\unit\Util\ActionGroupArrayBuilder; -use Magento\FunctionalTestingFramework\Test\Parsers\ActionGroupDataParser; +use tests\unit\Util\MagentoTestCase; use tests\unit\Util\ObjectHandlerUtil; +/** + * Class ActionGroupObjectHandlerTest + */ class ActionGroupObjectHandlerTest extends MagentoTestCase { /** - * getObject should throw exception if test extends from itself + * Validate getObject should throw exception if test extends from itself. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testGetTestObjectWithInvalidExtends() + public function testGetTestObjectWithInvalidExtends(): void { // Set up action group data $nameOne = 'actionGroupOne'; @@ -39,15 +40,16 @@ public function testGetTestObjectWithInvalidExtends() $handler = ActionGroupObjectHandler::getInstance(); - $this->expectException(\Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException::class); - $this->expectExceptionMessage("Mftf Action Group can not extend from itself: " . $nameOne); + $this->expectException(TestFrameworkException::class); + $this->expectExceptionMessage('Mftf Action Group can not extend from itself: ' . $nameOne); $handler->getObject('actionGroupOne'); } /** - * getAllObjects should throw exception if test extends from itself + * Validate getAllObjects should throw exception if test extends from itself * - * @throws \Exception + * @return void + * @throws Exception */ public function testGetAllTestObjectsWithInvalidExtends() { @@ -80,8 +82,8 @@ public function testGetAllTestObjectsWithInvalidExtends() $handler = ActionGroupObjectHandler::getInstance(); - $this->expectException(\Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException::class); - $this->expectExceptionMessage("Mftf Action Group can not extend from itself: " . $nameOne); + $this->expectException(TestFrameworkException::class); + $this->expectExceptionMessage('Mftf Action Group can not extend from itself: ' . $nameOne); $handler->getAllObjects(); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupAnnotationExtractorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupAnnotationExtractorTest.php index a3d2cca86..23c97fd4a 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupAnnotationExtractorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupAnnotationExtractorTest.php @@ -3,50 +3,54 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace tests\unit\Magento\FunctionalTestFramework\Test\Util; -use AspectMock\Test as AspectMock; +use Exception; use Magento\FunctionalTestingFramework\Test\Util\ActionGroupAnnotationExtractor; use PHPUnit\Framework\TestCase; use tests\unit\Util\TestLoggingUtil; +/** + * Class ActionGroupAnnotationExtractorTest + */ class ActionGroupAnnotationExtractorTest extends TestCase { /** - * Before test functionality - * @return void + * @inheritDoc */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } /** - * Annotation extractor takes in raw array and condenses it to expected format + * Annotation extractor takes in raw array and condenses it to expected format. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testActionGroupExtractAnnotations() + public function testActionGroupExtractAnnotations(): void { // Test Data $actionGroupAnnotations = [ - "nodeName" => "annotations", - "description" => [ - "nodeName" => "description", - "value" => "someDescription" + 'nodeName' => 'annotations', + 'description' => [ + 'nodeName' => 'description', + 'value' => 'someDescription' ] ]; // Perform Test $extractor = new ActionGroupAnnotationExtractor(); - $returnedAnnotations = $extractor->extractAnnotations($actionGroupAnnotations, "fileName"); + $returnedAnnotations = $extractor->extractAnnotations($actionGroupAnnotations, 'fileName'); // Asserts - $this->assertEquals("someDescription", $returnedAnnotations['description']); + $this->assertEquals('someDescription', $returnedAnnotations['description']); } /** - * After class functionality - * @return void + * @inheritDoc */ public static function tearDownAfterClass(): void { diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/AnnotationExtractorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/AnnotationExtractorTest.php index 735c33492..44ec3a7aa 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/AnnotationExtractorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/AnnotationExtractorTest.php @@ -3,114 +3,119 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace tests\unit\Magento\FunctionalTestFramework\Test\Util; -use AspectMock\Proxy\Verifier; -use AspectMock\Test as AspectMock; +use Exception; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; +use Magento\FunctionalTestingFramework\Exceptions\XmlException; use Magento\FunctionalTestingFramework\Test\Util\AnnotationExtractor; -use Monolog\Handler\TestHandler; -use Monolog\Logger; +use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; use PHPUnit\Framework\TestCase; use tests\unit\Util\TestLoggingUtil; -use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; +/** + * Class AnnotationExtractorTest + */ class AnnotationExtractorTest extends TestCase { /** - * Before test functionality - * @return void + * @inheritDoc */ - public function setUp(): void + protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } /** - * Annotation extractor takes in raw array and condenses it to expected format + * Annotation extractor takes in raw array and condenses it to expected format. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testExtractAnnotations() + public function testExtractAnnotations(): void { // Test Data $testAnnotations = [ - "nodeName" => "annotations", - "features" => [ + 'nodeName' => 'annotations', + 'features' => [ [ - "nodeName" => "features", - "value" => "TestFeatures" + 'nodeName' => 'features', + 'value' => 'TestFeatures' ] ], - "stories" => [ + 'stories' => [ [ - "nodeName" => "stories", - "value" => "TestStories" + 'nodeName' => 'stories', + 'value' => 'TestStories' ] ], - "description" => [ + 'description' => [ [ - "nodeName" => "description", - "value" => "TestDescription" + 'nodeName' => 'description', + 'value' => 'TestDescription' ] ], - "severity" => [ + 'severity' => [ [ - "nodeName" => "severity", - "value" => "CRITICAL" + 'nodeName' => 'severity', + 'value' => 'CRITICAL' ] ], - "group" => [ + 'group' => [ [ - "nodeName" => "group", - "value" => "TestGroup" + 'nodeName' => 'group', + 'value' => 'TestGroup' ] ], ]; // Perform Test $extractor = new AnnotationExtractor(); - $returnedAnnotations = $extractor->extractAnnotations($testAnnotations, "testFileName"); + $returnedAnnotations = $extractor->extractAnnotations($testAnnotations, 'testFileName'); // Asserts - $this->assertEquals("TestFeatures", $returnedAnnotations['features'][0]); - $this->assertEquals("TestStories", $returnedAnnotations['stories'][0]); - $this->assertEquals("TestDescription", $returnedAnnotations['description'][0]); - $this->assertEquals("CRITICAL", $returnedAnnotations['severity'][0]); - $this->assertEquals("TestGroup", $returnedAnnotations['group'][0]); + $this->assertEquals('TestFeatures', $returnedAnnotations['features'][0]); + $this->assertEquals('TestStories', $returnedAnnotations['stories'][0]); + $this->assertEquals('TestDescription', $returnedAnnotations['description'][0]); + $this->assertEquals('CRITICAL', $returnedAnnotations['severity'][0]); + $this->assertEquals('TestGroup', $returnedAnnotations['group'][0]); } /** - * Annotation extractor should throw warning when required annotations are missing + * Annotation extractor should throw warning when required annotations are missing. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testMissingAnnotations() + public function testMissingAnnotations(): void { // Test Data, missing title, description, and severity $testAnnotations = [ - "nodeName" => "annotations", - "features" => [ + 'nodeName' => 'annotations', + 'features' => [ [ - "nodeName" => "features", - "value" => "TestFeatures" + 'nodeName' => 'features', + 'value' => 'TestFeatures' ] ], - "stories" => [ + 'stories' => [ [ - "nodeName" => "stories", - "value" => "TestStories" + 'nodeName' => 'stories', + 'value' => 'TestStories' ] ], - "group" => [ + 'group' => [ [ - "nodeName" => "group", - "value" => "TestGroup" + 'nodeName' => 'group', + 'value' => 'TestGroup' ] ], ]; // Perform Test $extractor = new AnnotationExtractor(); - $returnedAnnotations = $extractor->extractAnnotations($testAnnotations, "testFileName"); + $extractor->extractAnnotations($testAnnotations, 'testFileName'); // Asserts TestLoggingUtil::getInstance()->validateMockLogStatement( @@ -118,61 +123,62 @@ public function testMissingAnnotations() 'DEPRECATION: Test testFileName is missing required annotations.', [ 'testName' => 'testFileName', - 'missingAnnotations' => "title, description, severity" + 'missingAnnotations' => 'title, description, severity' ] ); } /** - * Annotation extractor should throw warning when required annotations are empty + * Annotation extractor should throw warning when required annotations are empty. * - * @throws \Exception + * @return void + * @throws Exception */ - public function testEmptyRequiredAnnotations() + public function testEmptyRequiredAnnotations(): void { // Test Data, missing title, description, and severity $testAnnotations = [ - "nodeName" => "annotations", - "features" => [ + 'nodeName' => 'annotations', + 'features' => [ [ - "nodeName" => "features", - "value" => "" + 'nodeName' => 'features', + 'value' => '' ] ], - "stories" => [ + 'stories' => [ [ - "nodeName" => "stories", - "value" => "TestStories" + 'nodeName' => 'stories', + 'value' => 'TestStories' ] ], - "title" => [ + 'title' => [ [ - "nodeName" => "title", - "value" => " " + 'nodeName' => 'title', + 'value' => ' ' ] ], - "description" => [ + 'description' => [ [ - "nodeName" => "description", - "value" => "\t" + 'nodeName' => 'description', + 'value' => "\t" ] ], - "severity" => [ + 'severity' => [ [ - "nodeName" => "severity", - "value" => "" + 'nodeName' => 'severity', + 'value' => '' ] ], - "group" => [ + 'group' => [ [ - "nodeName" => "group", - "value" => "TestGroup" + 'nodeName' => 'group', + 'value' => 'TestGroup' ] ], ]; // Perform Test $extractor = new AnnotationExtractor(); - $returnedAnnotations = $extractor->extractAnnotations($testAnnotations, "testFileName"); + $returnedAnnotations = $extractor->extractAnnotations($testAnnotations, 'testFileName'); // Asserts TestLoggingUtil::getInstance()->validateMockLogStatement( @@ -180,90 +186,96 @@ public function testEmptyRequiredAnnotations() 'DEPRECATION: Test testFileName is missing required annotations.', [ 'testName' => 'testFileName', - 'missingAnnotations' => "title, description, severity" + 'missingAnnotations' => 'title, description, severity' ] ); } - public function testTestCaseIdUniqueness() + /** + * Validate testTestCaseIdUniqueness. + * + * @return void + * @throws TestFrameworkException|XmlException + */ + public function testTestCaseIdUniqueness(): void { // Test Data $firstTestAnnotation = [ - "nodeName" => "annotations", - "features" => [ + 'nodeName' => 'annotations', + 'features' => [ [ - "nodeName" => "features", - "value" => "TestFeatures" + 'nodeName' => 'features', + 'value' => 'TestFeatures' ] ], - "stories" => [ + 'stories' => [ [ - "nodeName" => "stories", - "value" => "TestStories" + 'nodeName' => 'stories', + 'value' => 'TestStories' ] ], - "title" => [ + 'title' => [ [ - "nodeName" => "title", - "value" => "TEST TITLE" + 'nodeName' => 'title', + 'value' => 'TEST TITLE' ] ], - "severity" => [ + 'severity' => [ [ - "nodeName" => "severity", - "value" => "CRITICAL" + 'nodeName' => 'severity', + 'value' => 'CRITICAL' ] ], - "testCaseId" => [ + 'testCaseId' => [ [ - "nodeName" => "testCaseId", - "value" => "MQE-0001" + 'nodeName' => 'testCaseId', + 'value' => 'MQE-0001' ] ], ]; $secondTestannotation = [ - "nodeName" => "annotations", - "features" => [ + 'nodeName' => 'annotations', + 'features' => [ [ - "nodeName" => "features", - "value" => "TestFeatures" + 'nodeName' => 'features', + 'value' => 'TestFeatures' ] ], - "stories" => [ + 'stories' => [ [ - "nodeName" => "stories", - "value" => "TestStories" + 'nodeName' => 'stories', + 'value' => 'TestStories' ] ], - "title" => [ + 'title' => [ [ - "nodeName" => "title", - "value" => "TEST TITLE" + 'nodeName' => 'title', + 'value' => 'TEST TITLE' ] ], - "severity" => [ + 'severity' => [ [ - "nodeName" => "severity", - "value" => "CRITICAL" + 'nodeName' => 'severity', + 'value' => 'CRITICAL' ] ], - "testCaseId" => [ + 'testCaseId' => [ [ - "nodeName" => "testCaseId", - "value" => "MQE-0001" + 'nodeName' => 'testCaseId', + 'value' => 'MQE-0001' ] ], ]; // Perform Test $extractor = new AnnotationExtractor(); - $extractor->extractAnnotations($firstTestAnnotation, "firstTest"); - $extractor->extractAnnotations($secondTestannotation, "secondTest"); + $extractor->extractAnnotations($firstTestAnnotation, 'firstTest'); + $extractor->extractAnnotations($secondTestannotation, 'secondTest'); $extractor->validateTestCaseIdTitleUniqueness(); // assert that no exception for validateTestCaseIdTitleUniqueness // and validation error is stored in GenerationErrorHandler $errorMessage = '/' - . preg_quote("TestCaseId and Title pairs is not unique in Tests 'firstTest', 'secondTest'") + . preg_quote('TestCaseId and Title pairs is not unique in Tests \'firstTest\', \'secondTest\'') . '/'; TestLoggingUtil::getInstance()->validateMockLogStatmentRegex('error', $errorMessage, []); $testErrors = GenerationErrorHandler::getInstance()->getErrorsByType('test'); @@ -271,14 +283,16 @@ public function testTestCaseIdUniqueness() $this->assertArrayHasKey('secondTest', $testErrors); } - public function tearDown(): void + /** + * @inheritDoc + */ + protected function tearDown(): void { GenerationErrorHandler::getInstance()->reset(); } /** - * After class functionality - * @return void + * @inheritDoc */ public static function tearDownAfterClass(): void { From c43042dfa8104367889abed88ab345c33857b931 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Mon, 26 Jul 2021 15:21:33 +0300 Subject: [PATCH 043/674] 33582: Eliminated AspectMock from MagentoTestCase.php --- dev/tests/unit/Util/MagentoTestCase.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/dev/tests/unit/Util/MagentoTestCase.php b/dev/tests/unit/Util/MagentoTestCase.php index 7760acfc6..35127d660 100644 --- a/dev/tests/unit/Util/MagentoTestCase.php +++ b/dev/tests/unit/Util/MagentoTestCase.php @@ -3,10 +3,10 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Util; -use AspectMock\Test as AspectMock; use PHPUnit\Framework\TestCase; /** @@ -14,22 +14,25 @@ */ class MagentoTestCase extends TestCase { + /** + * @inheritDoc + */ public static function setUpBeforeClass(): void { - if (!self::fileExists(DOCS_OUTPUT_DIR)) { + if (!file_exists(DOCS_OUTPUT_DIR)) { mkdir(DOCS_OUTPUT_DIR, 0755, true); } + parent::setUpBeforeClass(); } /** - * Teardown for removing AspectMock Double References - * @return void + * @inheritDoc */ public static function tearDownAfterClass(): void { - AspectMock::clean(); array_map('unlink', glob(DOCS_OUTPUT_DIR . DIRECTORY_SEPARATOR . "*")); + if (file_exists(DOCS_OUTPUT_DIR)) { rmdir(DOCS_OUTPUT_DIR); } From 35c190d22cab744d7934b00a8cc56cb3bbea2529 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Mon, 26 Jul 2021 15:48:46 +0300 Subject: [PATCH 044/674] MFTF-33585: Eliminated AspectMock usage from TestLoggingUtil --- dev/tests/unit/Util/TestLoggingUtil.php | 57 ++++++++++++++++--------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/dev/tests/unit/Util/TestLoggingUtil.php b/dev/tests/unit/Util/TestLoggingUtil.php index 1b0bce1f9..f275a5c97 100644 --- a/dev/tests/unit/Util/TestLoggingUtil.php +++ b/dev/tests/unit/Util/TestLoggingUtil.php @@ -3,16 +3,17 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Util; -use AspectMock\Test as AspectMock; use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; use Magento\FunctionalTestingFramework\Util\Logger\MftfLogger; use Monolog\Handler\TestHandler; -use PHPUnit\Framework\Assert; +use PHPUnit\Framework\TestCase; +use ReflectionProperty; -class TestLoggingUtil extends Assert +class TestLoggingUtil extends TestCase { /** * @var TestLoggingUtil @@ -25,24 +26,23 @@ class TestLoggingUtil extends Assert private $testLogHandler; /** - * TestLoggingUtil constructor. + * Private constructor. */ private function __construct() { - // private constructor + parent::__construct(null, [], ''); } /** - * Static singleton get function + * Static singleton get function. * * @return TestLoggingUtil */ - public static function getInstance() + public static function getInstance(): TestLoggingUtil { if (self::$instance == null) { self::$instance = new TestLoggingUtil(); } - return self::$instance; } @@ -51,21 +51,28 @@ public static function getInstance() * * @return void */ - public function setMockLoggingUtil() + public function setMockLoggingUtil(): void { $this->testLogHandler = new TestHandler(); $testLogger = new MftfLogger('testLogger'); $testLogger->pushHandler($this->testLogHandler); - $mockLoggingUtil = AspectMock::double( - LoggingUtil::class, - ['getLogger' => $testLogger] - )->make(); - $property = new \ReflectionProperty(LoggingUtil::class, 'instance'); + + $mockLoggingUtil = $this->createMock(LoggingUtil::class); + $mockLoggingUtil + ->method('getLogger') + ->willReturn($testLogger); + + $property = new ReflectionProperty(LoggingUtil::class, 'instance'); $property->setAccessible(true); $property->setValue($mockLoggingUtil); } - public function validateMockLogEmpty() + /** + * Check if mock log is empty. + * + * @return void + */ + public function validateMockLogEmpty(): void { $records = $this->testLogHandler->getRecords(); $this->assertTrue(empty($records)); @@ -77,9 +84,10 @@ public function validateMockLogEmpty() * @param string $type * @param string $message * @param array $context + * * @return void */ - public function validateMockLogStatement($type, $message, $context) + public function validateMockLogStatement(string $type, string $message, array $context): void { $records = $this->testLogHandler->getRecords(); $record = $records[count($records)-1]; // we assume the latest record is what requires validation @@ -88,7 +96,16 @@ public function validateMockLogStatement($type, $message, $context) $this->assertEquals($context, $record['context']); } - public function validateMockLogStatmentRegex($type, $regex, $context) + /** + * Check mock log statement regular expression. + * + * @param string $type + * @param string $regex + * @param array $context + * + * @return void + */ + public function validateMockLogStatmentRegex(string $type, string $regex, array $context): void { $records = $this->testLogHandler->getRecords(); $record = $records[count($records)-1]; // we assume the latest record is what requires validation @@ -103,8 +120,10 @@ public function validateMockLogStatmentRegex($type, $regex, $context) * * @return void */ - public function clearMockLoggingUtil() + public function clearMockLoggingUtil(): void { - AspectMock::clean(LoggingUtil::class); + $property = new ReflectionProperty(LoggingUtil::class, 'instance'); + $property->setAccessible(true); + $property->setValue(null); } } From 5da9853d690ad9eba8d9b22f9af8aab95ea9d428 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Tue, 27 Jul 2021 15:10:31 +0300 Subject: [PATCH 045/674] 33584: Eliminated AspectMock from ObjectHandlerUtil --- .../Handlers/DataObjectHandlerTest.php | 76 ++++++- .../OperationDefinitionObjectHandlerTest.php | 78 +++++++- .../Handlers/PersistedObjectHandlerTest.php | 20 +- .../Page/Handlers/PageObjectHandlerTest.php | 65 +++++- .../Handlers/SectionObjectHandlerTest.php | 62 +++++- .../DeprecatedEntityUsageCheckTest.php | 187 +++++++++++++++--- .../Handlers/ActionGroupObjectHandlerTest.php | 71 ++++++- dev/tests/unit/Util/ObjectHandlerUtil.php | 145 -------------- 8 files changed, 485 insertions(+), 219 deletions(-) delete mode 100644 dev/tests/unit/Util/ObjectHandlerUtil.php diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php index 57cdb6a64..552b951a0 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php @@ -10,9 +10,12 @@ use Exception; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject; +use Magento\FunctionalTestingFramework\DataGenerator\Parsers\DataProfileSchemaParser; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; +use Magento\FunctionalTestingFramework\ObjectManager; +use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; -use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestLoggingUtil; /** @@ -151,7 +154,7 @@ protected function setUp(): void */ public function testGetAllObjects(): void { - ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT); + $this->mockDataObjectHandlerWithData(self::PARSER_OUTPUT); // Call the method under test $actual = DataObjectHandler::getInstance()->getAllObjects(); @@ -170,10 +173,10 @@ public function testGetAllObjects(): void */ public function testDeprecatedDataObject(): void { - ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT_DEPRECATED); + $this->mockDataObjectHandlerWithData(self::PARSER_OUTPUT_DEPRECATED); // Call the method under test - $actual = DataObjectHandler::getInstance()->getAllObjects(); + DataObjectHandler::getInstance()->getAllObjects(); //validate deprecation warning TestLoggingUtil::getInstance()->validateMockLogStatement( @@ -191,7 +194,7 @@ public function testDeprecatedDataObject(): void */ public function testGetObject(): void { - ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT); + $this->mockDataObjectHandlerWithData(self::PARSER_OUTPUT); // Call the method under test $actual = DataObjectHandler::getInstance()->getObject('EntityOne'); @@ -209,7 +212,7 @@ public function testGetObject(): void */ public function testGetObjectNull(): void { - ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT); + $this->mockDataObjectHandlerWithData(self::PARSER_OUTPUT); $actual = DataObjectHandler::getInstance()->getObject('h953u789h0g73t521'); // doesnt exist $this->assertNull($actual); @@ -223,7 +226,7 @@ public function testGetObjectNull(): void */ public function testGetAllObjectsWithDataExtends(): void { - ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT_WITH_EXTEND); + $this->mockDataObjectHandlerWithData(self::PARSER_OUTPUT_WITH_EXTEND); // Call the method under test $actual = DataObjectHandler::getInstance()->getAllObjects(); @@ -250,7 +253,7 @@ public function testGetAllObjectsWithDataExtends(): void */ public function testGetObjectWithDataExtends(): void { - ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT_WITH_EXTEND); + $this->mockDataObjectHandlerWithData(self::PARSER_OUTPUT_WITH_EXTEND); // Call the method under test $actual = DataObjectHandler::getInstance()->getObject('EntityTwo'); @@ -276,7 +279,7 @@ public function testGetObjectWithDataExtends(): void */ public function testGetAllObjectsWithDataExtendsItself(): void { - ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT_WITH_EXTEND_INVALID); + $this->mockDataObjectHandlerWithData(self::PARSER_OUTPUT_WITH_EXTEND_INVALID); $this->expectException(TestFrameworkException::class); $this->expectExceptionMessage( @@ -296,7 +299,7 @@ public function testGetAllObjectsWithDataExtendsItself(): void */ public function testGetObjectWithDataExtendsItself(): void { - ObjectHandlerUtil::mockDataObjectHandlerWithData(self::PARSER_OUTPUT_WITH_EXTEND_INVALID); + $this->mockDataObjectHandlerWithData(self::PARSER_OUTPUT_WITH_EXTEND_INVALID); $this->expectException(TestFrameworkException::class); $this->expectExceptionMessage( @@ -310,11 +313,64 @@ public function testGetObjectWithDataExtendsItself(): void ); } + /** + * Create mock data object handler with data. + * + * @param array $mockData + * + * @return void + */ + private function mockDataObjectHandlerWithData(array $mockData): void + { + $dataObjectHandlerProperty = new ReflectionProperty(DataObjectHandler::class, "INSTANCE"); + $dataObjectHandlerProperty->setAccessible(true); + $dataObjectHandlerProperty->setValue(null); + + $mockDataProfileSchemaParser = $this->createMock(DataProfileSchemaParser::class); + $mockDataProfileSchemaParser + ->method('readDataProfiles') + ->willReturn($mockData); + + $objectManager = ObjectManagerFactory::getObjectManager(); + $mockObjectManagerInstance = $this->createMock(ObjectManager::class); + $mockObjectManagerInstance + ->method('create') + ->will( + $this->returnCallback( + function ( + string $class, + array $arguments = [] + ) use ($objectManager, $mockDataProfileSchemaParser) { + + if ($class === DataProfileSchemaParser::class) { + return $mockDataProfileSchemaParser; + } + + return $objectManager->create($class, $arguments); + } + ) + ); + + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue($mockObjectManagerInstance); + } + /** * @inheritDoc */ public static function tearDownAfterClass(): void { + parent::tearDownAfterClass(); + + $dataObjectHandlerProperty = new ReflectionProperty(DataObjectHandler::class, "INSTANCE"); + $dataObjectHandlerProperty->setAccessible(true); + $dataObjectHandlerProperty->setValue(null); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue(null); + TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php index 6c8fc7c45..9923170c4 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php @@ -11,8 +11,11 @@ use Magento\FunctionalTestingFramework\DataGenerator\Handlers\OperationDefinitionObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Objects\OperationDefinitionObject; use Magento\FunctionalTestingFramework\DataGenerator\Objects\OperationElement; +use Magento\FunctionalTestingFramework\DataGenerator\Parsers\OperationDefinitionParser; +use Magento\FunctionalTestingFramework\ObjectManager; +use Magento\FunctionalTestingFramework\ObjectManagerFactory; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; -use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestLoggingUtil; /** @@ -63,8 +66,8 @@ public function testGetMultipleObjects(): void OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => 'id', OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' ], - ] - ],[ + ] + ],[ OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType2, OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', @@ -76,8 +79,8 @@ public function testGetMultipleObjects(): void OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' ], ] - ]]]; - ObjectHandlerUtil::mockOperationHandlerWithData($mockData); + ]]]; + $this->mockOperationHandlerWithData($mockData); //Perform Assertions $operationDefinitionManager = OperationDefinitionObjectHandler::getInstance(); @@ -120,7 +123,7 @@ public function testDeprecatedOperation(): void ], OperationDefinitionObjectHandler::OBJ_DEPRECATED => 'deprecation message' ]]]; - ObjectHandlerUtil::mockOperationHandlerWithData($mockData); + $this->mockOperationHandlerWithData($mockData); //Perform Assertions $operationDefinitionManager = OperationDefinitionObjectHandler::getInstance(); @@ -274,7 +277,7 @@ public function testObjectCreation(): void ); // Set up mocked data output - ObjectHandlerUtil::mockOperationHandlerWithData($mockData); + $this->mockOperationHandlerWithData($mockData); // Get Operation $operationDefinitionManager = OperationDefinitionObjectHandler::getInstance(); @@ -382,7 +385,7 @@ public function testObjectArrayCreation(): void ); // Set up mocked data output - ObjectHandlerUtil::mockOperationHandlerWithData($mockData); + $this->mockOperationHandlerWithData($mockData); // Get Operation $operationDefinitionManager = OperationDefinitionObjectHandler::getInstance(); @@ -456,7 +459,7 @@ public function testLooseJsonCreation(): void ); // Set up mocked data output - ObjectHandlerUtil::mockOperationHandlerWithData($mockData); + $this->mockOperationHandlerWithData($mockData); // get Operations $operationDefinitionManager = OperationDefinitionObjectHandler::getInstance(); @@ -467,6 +470,52 @@ public function testLooseJsonCreation(): void $this->assertEquals($array, $operation->getOperationMetadata()[1]); } + /** + * Create mock operation handler with data. + * + * @param array $mockData + * + * @return void + */ + private function mockOperationHandlerWithData(array $mockData): void + { + $operationDefinitionObjectHandlerProperty = new ReflectionProperty( + OperationDefinitionObjectHandler::class, + 'INSTANCE' + ); + $operationDefinitionObjectHandlerProperty->setAccessible(true); + $operationDefinitionObjectHandlerProperty->setValue(null); + + $mockOperationParser = $this->createMock(OperationDefinitionParser::class); + $mockOperationParser + ->method('readOperationMetadata') + ->willReturn($mockData); + + $objectManager = ObjectManagerFactory::getObjectManager(); + $mockObjectManagerInstance = $this->createMock(ObjectManager::class); + $mockObjectManagerInstance + ->method('create') + ->will( + $this->returnCallback( + function ( + string $class, + array $arguments = [] + ) use ($objectManager, $mockOperationParser) { + + if ($class === OperationDefinitionParser::class) { + return $mockOperationParser; + } + + return $objectManager->create($class, $arguments); + } + ) + ); + + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue($mockObjectManagerInstance); + } + /** * @inheritDoc */ @@ -474,6 +523,17 @@ public static function tearDownAfterClass(): void { parent::tearDownAfterClass(); + $operationDefinitionObjectHandlerProperty = new ReflectionProperty( + OperationDefinitionObjectHandler::class, + 'INSTANCE' + ); + $operationDefinitionObjectHandlerProperty->setAccessible(true); + $operationDefinitionObjectHandlerProperty->setValue(null); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue(null); + TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php index 3629271f3..f4b798ec5 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php @@ -8,6 +8,7 @@ namespace tests\unit\Magento\FunctionalTestFramework\DataGenerator\Handlers; use Exception; +use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Parsers\DataProfileSchemaParser; use Magento\FunctionalTestingFramework\DataGenerator\Persist\CurlHandler; @@ -15,10 +16,8 @@ use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; use Magento\FunctionalTestingFramework\ObjectManager; use Magento\FunctionalTestingFramework\ObjectManagerFactory; -use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use ReflectionProperty; use tests\unit\Util\MagentoTestCase; -use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestLoggingUtil; /** @@ -261,15 +260,14 @@ public function testUpdateSimpleEntity(): void "; // Mock Classes - ObjectHandlerUtil::mockDataObjectHandlerWithData($parserOutput); - $this->mockCurlHandler($jsonResponse); + $this->mockCurlHandler($jsonResponse, $parserOutput); $handler = PersistedObjectHandler::getInstance(); $handler->createEntity( $entityStepKey, $scope, $entityName ); - $this->mockCurlHandler($updatedResponse); + $this->mockCurlHandler($updatedResponse, $parserOutput); // Call method $handler->updateEntity( @@ -589,13 +587,13 @@ public static function tearDownAfterClass(): void parent::tearDownAfterClass(); // Clear out Singleton between tests - $property = new ReflectionProperty(PersistedObjectHandler::class, "INSTANCE"); - $property->setAccessible(true); - $property->setValue(null); + $persistedObjectHandlerProperty = new ReflectionProperty(PersistedObjectHandler::class, "INSTANCE"); + $persistedObjectHandlerProperty->setAccessible(true); + $persistedObjectHandlerProperty->setValue(null); - $property = new ReflectionProperty(ObjectManager::class, 'instance'); - $property->setAccessible(true); - $property->setValue(null); + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue(null); TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php index bfa1fa8e0..8de63d849 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php @@ -8,9 +8,12 @@ namespace tests\unit\Magento\FunctionalTestFramework\Page\Handlers; use Magento\FunctionalTestingFramework\Exceptions\XmlException; +use Magento\FunctionalTestingFramework\ObjectManager; +use Magento\FunctionalTestingFramework\ObjectManagerFactory; use Magento\FunctionalTestingFramework\Page\Handlers\PageObjectHandler; +use Magento\FunctionalTestingFramework\XmlParser\PageParser; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; -use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestLoggingUtil; /** @@ -54,7 +57,7 @@ public function testGetPageObject(): void 'area' => 'test' ]]; - ObjectHandlerUtil::mockPageObjectHandlerWithData($mockData); + $this->mockPageObjectHandlerWithData($mockData); $pageHandler = PageObjectHandler::getInstance(); $pages = $pageHandler->getAllObjects(); $pageHandler->getObject('testPage1'); @@ -84,7 +87,7 @@ public function testGetEmptyPage(): void 'area' => 'test' ]]; - ObjectHandlerUtil::mockPageObjectHandlerWithData($mockData); + $this->mockPageObjectHandlerWithData($mockData); PageObjectHandler::getInstance()->getObject('testPage1'); // Empty page has been read in and gotten without an exception being thrown. @@ -110,7 +113,7 @@ public function testDeprecatedPage(): void 'filename' => 'filename.xml' ]]; - ObjectHandlerUtil::mockPageObjectHandlerWithData($mockData); + $this->mockPageObjectHandlerWithData($mockData); PageObjectHandler::getInstance()->getObject('testPage1'); TestLoggingUtil::getInstance()->validateMockLogStatement( @@ -120,11 +123,65 @@ public function testDeprecatedPage(): void ); } + /** + * Create mock page object handler with data. + * + * @param array $mockData + * + * @return void + */ + private function mockPageObjectHandlerWithData(array $mockData): void + { + $pageObjectHandlerProperty = new ReflectionProperty(PageObjectHandler::class, 'INSTANCE'); + $pageObjectHandlerProperty->setAccessible(true); + $pageObjectHandlerProperty->setValue(null); + + $mockSectionParser = $this->createMock(PageParser::class); + $mockSectionParser + ->method('getData') + ->willReturn($mockData); + + $objectManager = ObjectManagerFactory::getObjectManager(); + $mockObjectManagerInstance = $this->createMock(ObjectManager::class); + $mockObjectManagerInstance + ->method('get') + ->will( + $this->returnCallback( + function ( + string $class, + array $arguments = [] + ) use ($objectManager, $mockSectionParser) { + + if ($class === PageParser::class) { + return $mockSectionParser; + } + + return $objectManager->create($class, $arguments); + } + ) + ); + + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue($mockObjectManagerInstance); + } + + /** * @inheritDoc */ public static function tearDownAfterClass(): void { + parent::tearDownAfterClass(); + + $pageObjectHandlerProperty = new ReflectionProperty(PageObjectHandler::class, 'INSTANCE'); + $pageObjectHandlerProperty->setAccessible(true); + $pageObjectHandlerProperty->setValue(null); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue(null); + TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php index 79ad32b4c..cb6792218 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php @@ -8,9 +8,12 @@ namespace tests\unit\Magento\FunctionalTestFramework\Page\Handlers; use Magento\FunctionalTestingFramework\Exceptions\XmlException; +use Magento\FunctionalTestingFramework\ObjectManager; +use Magento\FunctionalTestingFramework\ObjectManagerFactory; use Magento\FunctionalTestingFramework\Page\Handlers\SectionObjectHandler; +use Magento\FunctionalTestingFramework\XmlParser\SectionParser; +use ReflectionProperty; use tests\unit\Util\MagentoTestCase; -use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestLoggingUtil; /** @@ -54,7 +57,7 @@ public function testGetSectionObject(): void ] ]; - ObjectHandlerUtil::mockSectionObjectHandlerWithData($mockData); + $this->mockSectionObjectHandlerWithData($mockData); // get sections $sectionHandler = SectionObjectHandler::getInstance(); @@ -91,7 +94,7 @@ public function testDeprecatedSection(): void ] ]; - ObjectHandlerUtil::mockSectionObjectHandlerWithData($mockData); + $this->mockSectionObjectHandlerWithData($mockData); // get sections $sectionHandler = SectionObjectHandler::getInstance(); @@ -105,11 +108,64 @@ public function testDeprecatedSection(): void ); } + /** + * Create mock section object handler with data. + * + * @param array $mockData + * + * @return void + */ + private function mockSectionObjectHandlerWithData(array $mockData): void + { + $sectionObjectHandlerProperty = new ReflectionProperty(SectionObjectHandler::class, "INSTANCE"); + $sectionObjectHandlerProperty->setAccessible(true); + $sectionObjectHandlerProperty->setValue(null); + + $mockSectionParser = $this->createMock(SectionParser::class); + $mockSectionParser + ->method('getData') + ->willReturn($mockData); + + $objectManager = ObjectManagerFactory::getObjectManager(); + $mockObjectManagerInstance = $this->createMock(ObjectManager::class); + $mockObjectManagerInstance + ->method('get') + ->will( + $this->returnCallback( + function ( + string $class, + array $arguments = [] + ) use ($objectManager, $mockSectionParser) { + + if ($class === SectionParser::class) { + return $mockSectionParser; + } + + return $objectManager->create($class, $arguments); + } + ) + ); + + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue($mockObjectManagerInstance); + } + /** * @inheritDoc */ public static function tearDownAfterClass(): void { + parent::tearDownAfterClass(); + + $sectionObjectHandlerProperty = new ReflectionProperty(SectionObjectHandler::class, "INSTANCE"); + $sectionObjectHandlerProperty->setAccessible(true); + $sectionObjectHandlerProperty->setValue(null); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue(null); + TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/StaticCheck/DeprecatedEntityUsageCheckTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/StaticCheck/DeprecatedEntityUsageCheckTest.php index bb4c96e89..01cc8588f 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/StaticCheck/DeprecatedEntityUsageCheckTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/StaticCheck/DeprecatedEntityUsageCheckTest.php @@ -3,37 +3,54 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace tests\unit\Magento\FunctionalTestFramework\StaticCheck; +use InvalidArgumentException; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\OperationDefinitionObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject; +use Magento\FunctionalTestingFramework\DataGenerator\Parsers\OperationDefinitionParser; +use Magento\FunctionalTestingFramework\ObjectManager; +use Magento\FunctionalTestingFramework\ObjectManagerFactory; use Magento\FunctionalTestingFramework\Page\Objects\ElementObject; use Magento\FunctionalTestingFramework\Page\Objects\PageObject; use Magento\FunctionalTestingFramework\Page\Objects\SectionObject; use Magento\FunctionalTestingFramework\StaticCheck\DeprecatedEntityUsageCheck; use Magento\FunctionalTestingFramework\Test\Objects\TestObject; +use ReflectionClass; +use ReflectionException; +use ReflectionProperty; use Symfony\Component\Console\Input\InputInterface; use tests\unit\Util\MagentoTestCase; -use ReflectionClass; -use InvalidArgumentException; -use tests\unit\Util\ObjectHandlerUtil; +/** + * Class DeprecatedEntityUsageCheckTest + */ class DeprecatedEntityUsageCheckTest extends MagentoTestCase { - /** @var DeprecatedEntityUsageCheck */ + /** @var DeprecatedEntityUsageCheck */ private $staticCheck; /** @var ReflectionClass*/ private $staticCheckClass; + /** + * @inheritDoc + */ public function setUp(): void { $this->staticCheck = new DeprecatedEntityUsageCheck(); - $this->staticCheckClass = new \ReflectionClass($this->staticCheck); + $this->staticCheckClass = new ReflectionClass($this->staticCheck); } - public function testInvalidPathOption() + /** + * Validate testInvalidPathOption. + * + * @return void + * @throws ReflectionException + */ + public function testInvalidPathOption(): void { $input = $this->getMockBuilder(InputInterface::class) ->disableOriginalConstructor() @@ -50,7 +67,13 @@ public function testInvalidPathOption() $loadAllXmlFiles->invoke($this->staticCheck, $input); } - public function testViolatingElementReferences() + /** + * Validate testViolatingElementReferences. + * + * @return void + * @throws ReflectionException + */ + public function testViolatingElementReferences(): void { //variables for assertions $elementName = 'elementOne'; @@ -73,13 +96,19 @@ public function testViolatingElementReferences() $this->assertEquals($actual, $expected); } - public function testViolatingPageReferences() + /** + * Validate testViolatingPageReferences. + * + * @return void + * @throws ReflectionException + */ + public function testViolatingPageReferences(): void { //Page variables for assertions $pageName = 'Page'; $fileName = 'page.xml'; - $page = new PageObject($pageName, '/url.html', 'Test', [], false, "test", $fileName, 'deprecated'); + $page = new PageObject($pageName, '/url.html', 'Test', [], false, 'test', $fileName, 'deprecated'); $references = ['Page' => $page]; $actual = $this->callViolatingReferences($references); $expected = [ @@ -93,7 +122,13 @@ public function testViolatingPageReferences() $this->assertEquals($actual, $expected); } - public function testViolatingDataReferences() + /** + * Validate testViolatingDataReferences. + * + * @return void + * @throws ReflectionException + */ + public function testViolatingDataReferences(): void { //Data entity variables for assertions $entityName = 'EntityOne'; @@ -123,7 +158,13 @@ public function testViolatingDataReferences() $this->assertEquals($actual, $expected); } - public function testViolatingTestReferences() + /** + * Validate testViolatingTestReferences. + * + * @return void + * @throws ReflectionException + */ + public function testViolatingTestReferences(): void { // test variables for assertions $testName = 'Test1'; @@ -143,12 +184,18 @@ public function testViolatingTestReferences() $this->assertEquals($actual, $expected); } - public function testViolatingMetaDataReferences() + /** + * Validate testViolatingMetaDataReferences. + * + * @return void + * @throws ReflectionException + */ + public function testViolatingMetaDataReferences(): void { // Data Variables for Assertions - $dataType1 = "type1"; - $operationType1 = "create"; - $operationType2 = "update"; + $dataType1 = 'type1'; + $operationType1 = 'create'; + $operationType2 = 'update'; /** * Parser Output. @@ -161,34 +208,34 @@ public function testViolatingMetaDataReferences() * key=id, value=integer */ $mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ - "testOperationName" => [ + 'testOperationName' => [ OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => "auth", - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => "V1/Type1", - OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => "POST", + OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1', + OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'POST', OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => "id", - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => "integer" + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => 'id', + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' ], ], OperationDefinitionObjectHandler::OBJ_DEPRECATED => 'deprecated' ],[ OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType2, - OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => "auth", - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => "V1/Type1/{id}", - OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => "PUT", + OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1/{id}', + OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'PUT', OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => "id", - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => "integer" + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => 'id', + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' ], ] ]]]; - ObjectHandlerUtil::mockOperationHandlerWithData($mockData); + $this->mockOperationHandlerWithData($mockData); $dataName = 'dataName1'; $references = [ $dataName => [ @@ -213,7 +260,13 @@ public function testViolatingMetaDataReferences() $this->assertEquals($actual, $expected); } - public function testIsDeprecated() + /** + * Validate testIsDeprecated. + * + * @return void + * @throws ReflectionException + */ + public function testIsDeprecated(): void { // Test Data $contents = ' @@ -230,16 +283,86 @@ public function testIsDeprecated() $this->assertTrue($output); } + /** - * Invoke findViolatingReferences - * @param $references + * Create mock operation handler with data. + * + * @param array $mockData + * + * @return void + */ + private function mockOperationHandlerWithData(array $mockData): void + { + $operationDefinitionObjectHandlerProperty = new ReflectionProperty( + OperationDefinitionObjectHandler::class, + 'INSTANCE' + ); + $operationDefinitionObjectHandlerProperty->setAccessible(true); + $operationDefinitionObjectHandlerProperty->setValue(null); + + $mockOperationParser = $this->createMock(OperationDefinitionParser::class); + $mockOperationParser + ->method('readOperationMetadata') + ->willReturn($mockData); + + $objectManager = ObjectManagerFactory::getObjectManager(); + $mockObjectManagerInstance = $this->createMock(ObjectManager::class); + $mockObjectManagerInstance + ->method('create') + ->will( + $this->returnCallback( + function ( + string $class, + array $arguments = [] + ) use ($objectManager, $mockOperationParser) { + + if ($class === OperationDefinitionParser::class) { + return $mockOperationParser; + } + + return $objectManager->create($class, $arguments); + } + ) + ); + + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue($mockObjectManagerInstance); + } + + /** + * @inheritDoc + */ + public static function tearDownAfterClass(): void + { + parent::tearDownAfterClass(); + + $operationDefinitionObjectHandlerProperty = new ReflectionProperty( + OperationDefinitionObjectHandler::class, + 'INSTANCE' + ); + $operationDefinitionObjectHandlerProperty->setAccessible(true); + $operationDefinitionObjectHandlerProperty->setValue(null); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue(null); + } + + + /** + * Invoke findViolatingReferences. + * + * @param array $references + * * @return mixed - * @throws \ReflectionException + * @throws ReflectionException */ - public function callViolatingReferences($references) + public function callViolatingReferences(array $references) { $property = $this->staticCheckClass->getMethod('findViolatingReferences'); $property->setAccessible(true); + return $property->invoke($this->staticCheck, $references); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php index 71da6d492..cfa546de5 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php @@ -9,10 +9,13 @@ use Exception; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; +use Magento\FunctionalTestingFramework\ObjectManager; +use Magento\FunctionalTestingFramework\ObjectManagerFactory; use Magento\FunctionalTestingFramework\Test\Handlers\ActionGroupObjectHandler; +use Magento\FunctionalTestingFramework\Test\Parsers\ActionGroupDataParser; +use ReflectionProperty; use tests\unit\Util\ActionGroupArrayBuilder; use tests\unit\Util\MagentoTestCase; -use tests\unit\Util\ObjectHandlerUtil; /** * Class ActionGroupObjectHandlerTest @@ -36,7 +39,7 @@ public function testGetTestObjectWithInvalidExtends(): void ->withFilename() ->withActionObjects() ->build(); - ObjectHandlerUtil::mockActionGroupObjectHandlerWithData(['actionGroups' => $actionGroupOne]); + $this->mockActionGroupObjectHandlerWithData(['actionGroups' => $actionGroupOne]); $handler = ActionGroupObjectHandler::getInstance(); @@ -46,12 +49,12 @@ public function testGetTestObjectWithInvalidExtends(): void } /** - * Validate getAllObjects should throw exception if test extends from itself + * Validate getAllObjects should throw exception if test extends from itself. * * @return void * @throws Exception */ - public function testGetAllTestObjectsWithInvalidExtends() + public function testGetAllTestObjectsWithInvalidExtends(): void { // Set up action group data $nameOne = 'actionGroupOne'; @@ -71,7 +74,7 @@ public function testGetAllTestObjectsWithInvalidExtends() ->withActionObjects() ->build(); - ObjectHandlerUtil::mockActionGroupObjectHandlerWithData( + $this->mockActionGroupObjectHandlerWithData( [ 'actionGroups' => array_merge( $actionGroupOne, @@ -86,4 +89,62 @@ public function testGetAllTestObjectsWithInvalidExtends() $this->expectExceptionMessage('Mftf Action Group can not extend from itself: ' . $nameOne); $handler->getAllObjects(); } + + /** + * Create mock action group object handler with data. + * + * @param array $mockData + * + * @return void + */ + private function mockActionGroupObjectHandlerWithData(array $mockData): void + { + $actionGroupObjectHandlerProperty = new ReflectionProperty(ActionGroupObjectHandler::class, 'instance'); + $actionGroupObjectHandlerProperty->setAccessible(true); + $actionGroupObjectHandlerProperty->setValue(null); + + $mockOperationParser = $this->createMock(ActionGroupDataParser::class); + $mockOperationParser + ->method('readActionGroupData') + ->willReturn($mockData); + $objectManager = ObjectManagerFactory::getObjectManager(); + $mockObjectManagerInstance = $this->createMock(ObjectManager::class); + $mockObjectManagerInstance + ->method('create') + ->will( + $this->returnCallback( + function ( + string $class, + array $arguments = [] + ) use ($objectManager, $mockOperationParser) { + + if ($class === ActionGroupDataParser::class) { + return $mockOperationParser; + } + + return $objectManager->create($class, $arguments); + } + ) + ); + + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue($mockObjectManagerInstance); + } + + /** + * @inheritDoc + */ + public static function tearDownAfterClass(): void + { + parent::tearDownAfterClass(); + + $actionGroupObjectHandlerProperty = new ReflectionProperty(ActionGroupObjectHandler::class, 'instance'); + $actionGroupObjectHandlerProperty->setAccessible(true); + $actionGroupObjectHandlerProperty->setValue(null); + + $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); + $objectManagerProperty->setAccessible(true); + $objectManagerProperty->setValue(null); + } } diff --git a/dev/tests/unit/Util/ObjectHandlerUtil.php b/dev/tests/unit/Util/ObjectHandlerUtil.php deleted file mode 100644 index 0e4543f2b..000000000 --- a/dev/tests/unit/Util/ObjectHandlerUtil.php +++ /dev/null @@ -1,145 +0,0 @@ -setAccessible(true); - $property->setValue(null); - - $mockOperationParser = AspectMock::double( - OperationDefinitionParser::class, - ["readOperationMetadata" => $data] - )->make(); - $instance = AspectMock::double(ObjectManager::class, ['create' => $mockOperationParser])->make(); - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); - } - - /** - * Set up everything required to mock DataObjectHandler::getInstance() with $data value - * - * @param array $data - */ - public static function mockDataObjectHandlerWithData($data) - { - // Clear DataObjectHandler singleton if already set - $property = new \ReflectionProperty(DataObjectHandler::class, "INSTANCE"); - $property->setAccessible(true); - $property->setValue(null); - - $mockDataProfileSchemaParser = AspectMock::double(DataProfileSchemaParser::class, [ - 'readDataProfiles' => $data - ])->make(); - - $mockObjectManager = AspectMock::double(ObjectManager::class, [ - 'create' => $mockDataProfileSchemaParser - ])->make(); - - AspectMock::double(ObjectManagerFactory::class, [ - 'getObjectManager' => $mockObjectManager - ]); - } - - /** - * Set up everything required to mock PageObjectHandler::getInstance() with $data value - * - * @param array $data - */ - public static function mockPageObjectHandlerWithData($data) - { - // clear section object handler value to inject parsed content - $property = new \ReflectionProperty(PageObjectHandler::class, 'INSTANCE'); - $property->setAccessible(true); - $property->setValue(null); - - $mockSectionParser = AspectMock::double(PageParser::class, ["getData" => $data])->make(); - $instance = AspectMock::double(ObjectManager::class, ['get' => $mockSectionParser])->make(); - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); - } - - /** - * Set up everything required to mock SectionObjectHandler::getInstance() with $data value - * - * @param array $data - */ - public static function mockSectionObjectHandlerWithData($data) - { - // clear section object handler value to inject parsed content - $property = new \ReflectionProperty(SectionObjectHandler::class, "INSTANCE"); - $property->setAccessible(true); - $property->setValue(null); - - $mockSectionParser = AspectMock::double(SectionParser::class, ["getData" => $data])->make(); - $instance = AspectMock::double(ObjectManager::class, ["get" => $mockSectionParser])->make(); - AspectMock::double(ObjectManagerFactory::class, ["getObjectManager" => $instance]); - } - - /** - * Set up everything required to mock TestObjectHandler::getInstance() with $data value - * - * @param array $data - * @throws \Exception - */ - public static function mockTestObjectHandlerWitData($data) - { - // clear test object handler value to inject parsed content - $property = new \ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); - $property->setAccessible(true); - $property->setValue(null); - - $mockDataParser = AspectMock::double(TestDataParser::class, ['readTestData' => $data])->make(); - $instance = AspectMock::double(ObjectManager::class, ['create' => $mockDataParser]) - ->make(); // bypass the private constructor - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); - } - - /** - * Set up everything required to mock ActionGroupObjectHandler::getInstance() with $data value - * - * @param array $data - * @throws \Exception - */ - public static function mockActionGroupObjectHandlerWithData($data) - { - // Clear action group object handler value to inject parsed content - $property = new \ReflectionProperty(ActionGroupObjectHandler::class, 'instance'); - $property->setAccessible(true); - $property->setValue(null); - - $mockDataParser = AspectMock::double(ActionGroupDataParser::class, ['readActionGroupData' => $data])->make(); - $instance = AspectMock::double(ObjectManager::class, ['create' => $mockDataParser]) - ->make(); // bypass the private constructor - AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); - } -} From 591aaa7ba78ccd5aa43454ec6306ea6e844e4c8d Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Tue, 27 Jul 2021 15:34:32 +0300 Subject: [PATCH 046/674] 33584: Fixed static-tests --- .../DataGenerator/Handlers/DataObjectHandlerTest.php | 6 ++++-- .../Handlers/OperationDefinitionObjectHandlerTest.php | 6 ++++-- .../Page/Handlers/PageObjectHandlerTest.php | 7 ++++--- .../Page/Handlers/SectionObjectHandlerTest.php | 6 ++++-- .../StaticCheck/DeprecatedEntityUsageCheckTest.php | 8 ++++---- .../Test/Handlers/ActionGroupObjectHandlerTest.php | 6 ++++-- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php index 552b951a0..7ef84a53d 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php @@ -340,8 +340,10 @@ private function mockDataObjectHandlerWithData(array $mockData): void function ( string $class, array $arguments = [] - ) use ($objectManager, $mockDataProfileSchemaParser) { - + ) use ( + $objectManager, + $mockDataProfileSchemaParser + ) { if ($class === DataProfileSchemaParser::class) { return $mockDataProfileSchemaParser; } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php index 9923170c4..c5747e8cb 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php @@ -500,8 +500,10 @@ private function mockOperationHandlerWithData(array $mockData): void function ( string $class, array $arguments = [] - ) use ($objectManager, $mockOperationParser) { - + ) use ( + $objectManager, + $mockOperationParser + ) { if ($class === OperationDefinitionParser::class) { return $mockOperationParser; } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php index 8de63d849..c611cc6a7 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php @@ -150,8 +150,10 @@ private function mockPageObjectHandlerWithData(array $mockData): void function ( string $class, array $arguments = [] - ) use ($objectManager, $mockSectionParser) { - + ) use ( + $objectManager, + $mockSectionParser + ) { if ($class === PageParser::class) { return $mockSectionParser; } @@ -166,7 +168,6 @@ function ( $property->setValue($mockObjectManagerInstance); } - /** * @inheritDoc */ diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php index cb6792218..b0ce0a4b8 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php @@ -135,8 +135,10 @@ private function mockSectionObjectHandlerWithData(array $mockData): void function ( string $class, array $arguments = [] - ) use ($objectManager, $mockSectionParser) { - + ) use ( + $objectManager, + $mockSectionParser + ) { if ($class === SectionParser::class) { return $mockSectionParser; } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/StaticCheck/DeprecatedEntityUsageCheckTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/StaticCheck/DeprecatedEntityUsageCheckTest.php index 01cc8588f..d4286060f 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/StaticCheck/DeprecatedEntityUsageCheckTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/StaticCheck/DeprecatedEntityUsageCheckTest.php @@ -283,7 +283,6 @@ public function testIsDeprecated(): void $this->assertTrue($output); } - /** * Create mock operation handler with data. * @@ -314,8 +313,10 @@ private function mockOperationHandlerWithData(array $mockData): void function ( string $class, array $arguments = [] - ) use ($objectManager, $mockOperationParser) { - + ) use ( + $objectManager, + $mockOperationParser + ) { if ($class === OperationDefinitionParser::class) { return $mockOperationParser; } @@ -349,7 +350,6 @@ public static function tearDownAfterClass(): void $objectManagerProperty->setValue(null); } - /** * Invoke findViolatingReferences. * diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php index cfa546de5..c91d12a29 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php @@ -116,8 +116,10 @@ private function mockActionGroupObjectHandlerWithData(array $mockData): void function ( string $class, array $arguments = [] - ) use ($objectManager, $mockOperationParser) { - + ) use ( + $objectManager, + $mockOperationParser + ) { if ($class === ActionGroupDataParser::class) { return $mockOperationParser; } From ac8d40e871f04eaf6005f0abc43d40a23c8d8642 Mon Sep 17 00:00:00 2001 From: Dan Mooney <30629803+danmooney2@users.noreply.github.com> Date: Tue, 27 Jul 2021 09:58:05 -0500 Subject: [PATCH 047/674] Add access/secret key config parameters --- docs/configuration.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/configuration.md b/docs/configuration.md index 4eb273824..bd48d1554 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -408,6 +408,26 @@ Example: REMOTE_STORAGE_AWSS3_PREFIX=local ``` +### REMOTE_STORAGE_AWSS3_ACCESS_KEY + +The optional access key for the S3 bucket. + +Example: + +```conf +REMOTE_STORAGE_AWSS3_ACCESS_KEY=access-key +``` + +### REMOTE_STORAGE_AWSS3_SECRET_KEY + +The optional secret key for the S3 bucket. + +Example: + +```conf +REMOTE_STORAGE_AWSS3_SECRET_KEY=secret-key +``` + ### MAGENTO_ADMIN_WEBAPI_TOKEN_LIFETIME The lifetime (in seconds) of Magento Admin WebAPI token; if token is older than this value a refresh attempt will be made just before the next WebAPI call. From 6563d302b9d6b35018a90356a4ef4904250e98d4 Mon Sep 17 00:00:00 2001 From: Karyna Date: Wed, 28 Jul 2021 12:15:40 +0300 Subject: [PATCH 048/674] Refactor CredentialStorage after FileStorage constructor elimination --- .../DataGenerator/Handlers/CredentialStore.php | 6 ++++-- .../DataGenerator/Handlers/SecretStorage/FileStorage.php | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/CredentialStore.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/CredentialStore.php index d6e6b9a69..36b2daf41 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/CredentialStore.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/CredentialStore.php @@ -221,11 +221,13 @@ private function initializeCredentialStorage() * * @return void */ - private function initializeFileStorage() + private function initializeFileStorage(): void { // Initialize file storage try { - $this->credStorage[self::ARRAY_KEY_FOR_FILE] = new FileStorage(); + $fileStorage = new FileStorage(); + $fileStorage->initialize(); + $this->credStorage[self::ARRAY_KEY_FOR_FILE] = $fileStorage; } catch (TestFrameworkException $e) { // Print error message in console print_r($e->getMessage()); diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php index 62ecfbedc..479c608e4 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php @@ -26,7 +26,7 @@ class FileStorage extends BaseStorage * @return void * @throws TestFrameworkException */ - private function initialize(): void + public function initialize(): void { if (!$this->secretData) { $creds = $this->readInCredentialsFile(); From 63a1ed4f6ee65c1a083d16bb99faf397219c4302 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Wed, 28 Jul 2021 17:02:58 +0300 Subject: [PATCH 049/674] 33293: Fixed code --- .../DataGenerator/Handlers/PersistedObjectHandlerTest.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php index 3629271f3..33215430a 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php @@ -8,6 +8,7 @@ namespace tests\unit\Magento\FunctionalTestFramework\DataGenerator\Handlers; use Exception; +use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Parsers\DataProfileSchemaParser; use Magento\FunctionalTestingFramework\DataGenerator\Persist\CurlHandler; @@ -15,10 +16,8 @@ use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; use Magento\FunctionalTestingFramework\ObjectManager; use Magento\FunctionalTestingFramework\ObjectManagerFactory; -use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; use ReflectionProperty; use tests\unit\Util\MagentoTestCase; -use tests\unit\Util\ObjectHandlerUtil; use tests\unit\Util\TestLoggingUtil; /** @@ -261,15 +260,14 @@ public function testUpdateSimpleEntity(): void "; // Mock Classes - ObjectHandlerUtil::mockDataObjectHandlerWithData($parserOutput); - $this->mockCurlHandler($jsonResponse); + $this->mockCurlHandler($jsonResponse, $parserOutput); $handler = PersistedObjectHandler::getInstance(); $handler->createEntity( $entityStepKey, $scope, $entityName ); - $this->mockCurlHandler($updatedResponse); + $this->mockCurlHandler($updatedResponse, $parserOutput); // Call method $handler->updateEntity( From aa82e94357f321d8aca5bba48b7b4f410a9aee1c Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Thu, 29 Jul 2021 11:44:35 +0300 Subject: [PATCH 050/674] 33308: Fixed and add removed tests --- .../Util/ModuleResolverTest.php | 310 ++++++++++++++++-- .../Util/ModuleResolver.php | 89 +---- .../ModuleResolver/ModuleResolverService.php | 105 ++++++ 3 files changed, 393 insertions(+), 111 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php index cec3b9461..368fd2149 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php @@ -17,12 +17,13 @@ use tests\unit\Util\MagentoTestCase; use tests\unit\Util\TestLoggingUtil; +/** + * Class ModuleResolverTest + */ class ModuleResolverTest extends MagentoTestCase { /** - * Before test functionality. - * - * @return void + * @inheritDoc */ protected function setUp(): void { @@ -30,9 +31,7 @@ protected function setUp(): void } /** - * After class functionality. - * - * @return void + * @inheritDoc */ public static function tearDownAfterClass(): void { @@ -70,7 +69,9 @@ public function testGetModulePathsAggregate(): void { $this->mockForceGenerate(false); - $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService = $this->createPartialMock( + ModuleResolverService::class, ['getRegisteredModuleList', 'aggregateTestModulePaths'] + ); $moduleResolverService->expects($this->any()) ->method('getRegisteredModuleList') ->willReturn( @@ -100,6 +101,99 @@ public function testGetModulePathsAggregate(): void ); } + /** + * Validate aggregateTestModulePaths() when module path part of DEV_TESTS. + * + * @return void + * @throws Exception + */ + public function testAggregateTestModulePathsDevTests(): void + { + $origin = TESTS_MODULE_PATH; + $modulePath = ModuleResolver::DEV_TESTS . DIRECTORY_SEPARATOR . "Magento"; + putenv("TESTS_MODULE_PATH=$modulePath"); + + $this->mockForceGenerate(false); + $moduleResolverService = $this->createPartialMock(ModuleResolverService::class, ['globRelevantPaths']); + $moduleResolverService + ->method('globRelevantPaths') + ->withConsecutive() + ->will( + $this->returnCallback( + function ($codePath, $pattern) use ($modulePath) { + if ($codePath === $modulePath && $pattern === '') { + $this->fail(sprintf( + 'Not expected parameter: \'%s\' when invoked method globRelevantPaths().', + $modulePath + )); + } + + return []; + } + ) + ); + $this->setMockResolverCreatorProperties($moduleResolverService); + $resolver = ModuleResolver::getInstance(); + $this->setMockResolverProperties($resolver, null, []); + $this->assertEquals([], $resolver->getModulesPath()); + + + putenv("TESTS_MODULE_PATH=$origin"); + } + + /** + * Validate correct path locations are fed into globRelevantPaths. + * + * @return void + * @throws Exception + */ + public function testGetModulePathsLocations(): void + { + // clear test object handler value to inject parsed content + $property = new ReflectionProperty(ModuleResolver::class, 'instance'); + $property->setAccessible(true); + $property->setValue(null); + + $this->mockForceGenerate(false); + // Define the Module paths from default TESTS_MODULE_PATH + $modulePath = defined('TESTS_MODULE_PATH') ? TESTS_MODULE_PATH : TESTS_BP; + + // Define the Module paths from app/code + $magentoBaseCodePath = MAGENTO_BP; + + $moduleResolverService = $this->createPartialMock(ModuleResolverService::class, ['globRelevantPaths']); + $moduleResolverService + ->method('globRelevantPaths') + ->withConsecutive() + ->will( + $this->returnCallback( + function ($codePath, $pattern) use ($modulePath, $magentoBaseCodePath) { + if ($codePath === $modulePath && $pattern === '') { + return []; + } + + if ($codePath === $magentoBaseCodePath . '/vendor' && $pattern === 'Test/Mftf') { + return []; + } + + if ($codePath === $magentoBaseCodePath . "/app/code" && $pattern === 'Test/Mftf') { + return []; + } + + $this->fail(sprintf( + 'Not expected parameter: \'%s\' when invoked method globRelevantPaths().', + $modulePath + )); + } + ) + ); + + $this->setMockResolverCreatorProperties($moduleResolverService); + $resolver = ModuleResolver::getInstance(); + $this->setMockResolverProperties($resolver, null, []); + $this->assertEquals([], $resolver->getModulesPath()); + } + /** * Validate aggregateTestModulePathsFromComposerJson. * @@ -110,8 +204,11 @@ public function testAggregateTestModulePathsFromComposerJson(): void { $this->mockForceGenerate(false); - $moduleResolverService = $this->createMock(ModuleResolverService::class); - $moduleResolverService->expects($this->any()) + $moduleResolverService = $this->createPartialMock( + ModuleResolverService::class, ['getComposerJsonTestModulePaths'] + ); + $moduleResolverService + ->expects($this->any()) ->method('getComposerJsonTestModulePaths') ->willReturn( [ @@ -139,6 +236,63 @@ public function testAggregateTestModulePathsFromComposerJson(): void ); } + /** + * Validate getComposerJsonTestModulePaths with paths invocation. + * + * @return void + * @throws Exception + */ + public function testGetComposerJsonTestModulePathsForPathInvocation(): void + { + $this->mockForceGenerate(false); + + // Expected dev tests path + $expectedSearchPaths[] = MAGENTO_BP + . DIRECTORY_SEPARATOR + . 'dev' + . DIRECTORY_SEPARATOR + . 'tests' + . DIRECTORY_SEPARATOR + . 'acceptance' + . DIRECTORY_SEPARATOR + . 'tests' + . DIRECTORY_SEPARATOR + . 'functional'; + + // Expected test module path + $testModulePath = defined('TESTS_MODULE_PATH') ? TESTS_MODULE_PATH : TESTS_BP; + + if (array_search($testModulePath, $expectedSearchPaths) === false) { + $expectedSearchPaths[] = $testModulePath; + } + + $moduleResolverService = $this->createPartialMock( + ModuleResolverService::class, + ['getComposerJsonTestModulePaths'] + ); + $moduleResolverService + ->method('getComposerJsonTestModulePaths') + ->will( + $this->returnCallback( + function ($codePaths) use ($expectedSearchPaths) { + if ($codePaths === $expectedSearchPaths) { + return []; + } + + $this->fail(sprintf( + 'Not expected parameter: \'%s\' when invoked method getComposerJsonTestModulePaths().', + $codePaths + )); + } + ) + ); + + $this->setMockResolverCreatorProperties($moduleResolverService); + $resolver = ModuleResolver::getInstance(); + $this->setMockResolverProperties($resolver, null, []); + $this->assertEquals([], $resolver->getModulesPath()); + } + /** * Validate aggregateTestModulePathsFromComposerInstaller. * @@ -148,7 +302,9 @@ public function testAggregateTestModulePathsFromComposerJson(): void public function testAggregateTestModulePathsFromComposerInstaller(): void { $this->mockForceGenerate(false); - $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService = $this->createPartialMock( + ModuleResolverService::class, ['getComposerInstalledTestModulePaths'] + ); $moduleResolverService->expects($this->any()) ->method('getComposerInstalledTestModulePaths') ->willReturn( @@ -182,6 +338,45 @@ public function testAggregateTestModulePathsFromComposerInstaller(): void ); } + /** + * Validate getComposerInstalledTestModulePaths with paths invocation. + * + * @return void + * @throws Exception + */ + public function testGetComposerInstalledTestModulePathsForPathInvocation(): void + { + $this->mockForceGenerate(false); + + // Expected file path + $expectedSearchPath = MAGENTO_BP . DIRECTORY_SEPARATOR . 'composer.json'; + $moduleResolverService = $this->createPartialMock( + ModuleResolverService::class, + ['getComposerInstalledTestModulePaths'] + ); + $moduleResolverService + ->method('getComposerInstalledTestModulePaths') + ->will( + $this->returnCallback( + function ($composerFile) use ($expectedSearchPath) { + if ($composerFile === $expectedSearchPath) { + return []; + } + + $this->fail(sprintf( + 'Not expected parameter: \'%s\' when invoked method getComposerInstalledTestModulePaths().', + $composerFile + )); + } + ) + ); + + $this->setMockResolverCreatorProperties($moduleResolverService); + $resolver = ModuleResolver::getInstance(); + $this->setMockResolverProperties($resolver, null, []); + $this->assertEquals([], $resolver->getModulesPath()); + } + /** * Validate mergeModulePaths() and flipAndFilterModulePathsArray(). * @@ -191,7 +386,10 @@ public function testAggregateTestModulePathsFromComposerInstaller(): void public function testMergeFlipAndFilterModulePathsNoForceGenerate(): void { $this->mockForceGenerate(false); - $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService = $this->createPartialMock( + ModuleResolverService::class, + ['getComposerJsonTestModulePaths', 'getComposerInstalledTestModulePaths', 'aggregateTestModulePaths'] + ); $moduleResolverService->expects($this->any()) ->method('getComposerJsonTestModulePaths') ->willReturn( @@ -278,7 +476,10 @@ public function testMergeFlipAndFilterModulePathsNoForceGenerate(): void public function testMergeFlipNoSortModulePathsNoForceGenerate(): void { $this->mockForceGenerate(false); - $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService = $this->createPartialMock( + ModuleResolverService::class, + ['getComposerJsonTestModulePaths', 'getComposerInstalledTestModulePaths', 'aggregateTestModulePaths'] + ); $moduleResolverService->expects($this->any()) ->method('getComposerJsonTestModulePaths') ->willReturn( @@ -357,7 +558,10 @@ public function testMergeFlipNoSortModulePathsNoForceGenerate(): void public function testMergeFlipAndSortModulePathsForceGenerate(): void { $this->mockForceGenerate(true); - $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService = $this->createPartialMock( + ModuleResolverService::class, + ['getComposerJsonTestModulePaths', 'getComposerInstalledTestModulePaths', 'aggregateTestModulePaths'] + ); $moduleResolverService->expects($this->any()) ->method('getComposerJsonTestModulePaths') ->willReturn( @@ -441,7 +645,10 @@ public function testMergeFlipAndSortModulePathsForceGenerate(): void public function testMergeFlipAndFilterModulePathsWithLogging(): void { $this->mockForceGenerate(false); - $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService = $this->createPartialMock( + ModuleResolverService::class, + ['getComposerJsonTestModulePaths', 'getComposerInstalledTestModulePaths'] + ); $moduleResolverService->expects($this->any()) ->method('getComposerJsonTestModulePaths') ->willReturn( @@ -506,11 +713,18 @@ public function testMergeFlipAndFilterModulePathsWithLogging(): void public function testApplyCustomModuleMethods(): void { $this->mockForceGenerate(true); - $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService = $this->createPartialMock( + ModuleResolverService::class, + ['getCustomModulePaths', 'aggregateTestModulePaths'] + ); $moduleResolverService->expects($this->any()) ->method('getCustomModulePaths') ->willReturn(['Magento_Module' => 'otherPath']); + $moduleResolverService + ->method('aggregateTestModulePaths') + ->willReturn([]); + $this->setMockResolverCreatorProperties($moduleResolverService); $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties($resolver); @@ -531,7 +745,7 @@ public function testApplyCustomModuleMethods(): void public function testGetModulePathsBlocklist(): void { $this->mockForceGenerate(true); - $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService = $this->createPartialMock(ModuleResolverService::class, ['aggregateTestModulePaths']); $moduleResolverService->expects($this->any()) ->method('aggregateTestModulePaths') ->willReturn( @@ -567,6 +781,12 @@ public function testGetModulePathsNoAdminToken(): void { // Set --force to false $this->mockForceGenerate(false); + $moduleResolverService = $this->createPartialMock(ModuleResolverService::class, ['applyCustomModuleMethods']); + $moduleResolverService + ->method('applyCustomModuleMethods') + ->willReturn(["example" . DIRECTORY_SEPARATOR . "paths"]); + + $this->setMockResolverCreatorProperties($moduleResolverService); $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties($resolver); @@ -575,17 +795,52 @@ public function testGetModulePathsNoAdminToken(): void $resolver->getModulesPath(); } + /** + * Validates that getAdminToken is not called when --force is enabled. + * + * @return void + * @throws Exception + */ + public function testGetAdminTokenNotCalledWhenForce(): void + { + // Set --force to true + $this->mockForceGenerate(true); + + // Mock ModuleResolver and applyCustomModuleMethods() + $moduleResolverService = $this->createMock(ModuleResolverService::class); + $moduleResolverService + ->method('getAdminToken') + ->with( + $this->returnCallback( + function () { + $this->fail('Not expected to call method \'getAdminToken()\'.'); + } + ) + ); + + $this->setMockResolverCreatorProperties($moduleResolverService); + $resolver = ModuleResolver::getInstance(); + $this->setMockResolverProperties($resolver, null, []); + $resolver->getModulesPath(); + $this->addToAssertionCount(1); + } + /** * Verify the getAdminToken method returns throws an exception if ENV is not fully loaded. + * + * @return void + * @throws Exception */ public function testGetAdminTokenWithMissingEnv(): void { // Set --force to false $this->mockForceGenerate(false); + $this->setMockResolverCreatorProperties(null); // Unset env unset($_ENV['MAGENTO_ADMIN_USERNAME']); $resolver = ModuleResolver::getInstance(); + $this->setMockResolverProperties($resolver); // Expect exception $this->expectException(FastFailException::class); @@ -594,12 +849,18 @@ public function testGetAdminTokenWithMissingEnv(): void /** * Verify the getAdminToken method returns throws an exception if Token was bad. + * + * @return void + * @throws Exception */ public function testGetAdminTokenWithBadResponse(): void { // Set --force to false $this->mockForceGenerate(false); + $this->setMockResolverCreatorProperties(null); + $resolver = ModuleResolver::getInstance(); + $this->setMockResolverProperties($resolver); // Expect exception $this->expectException(FastFailException::class); @@ -610,18 +871,17 @@ public function testGetAdminTokenWithBadResponse(): void * Function used to set mock for Resolver properties. * * @param ModuleResolver $instance - * @param array $mockPaths - * @param array $mockModules - * @param array $mockBlocklist + * @param null $mockPaths + * @param null $mockModules + * @param array $mockBlockList * * @return void - * @throws Exception */ private function setMockResolverProperties( ModuleResolver $instance, $mockPaths = null, $mockModules = null, - $mockBlocklist = [] + $mockBlockList = [] ): void { $property = new ReflectionProperty(ModuleResolver::class, 'enabledModulePaths'); $property->setAccessible(true); @@ -631,19 +891,19 @@ private function setMockResolverProperties( $property->setAccessible(true); $property->setValue($instance, $mockModules); - $property = new ReflectionProperty(ModuleResolver::class, 'moduleBlocklist'); + $property = new ReflectionProperty(ModuleResolverService::class, 'moduleBlockList'); $property->setAccessible(true); - $property->setValue($instance, $mockBlocklist); + $property->setValue($mockBlockList); } /** * Function used to set mock for ResolverCreator properties. * - * @param MockObject $moduleResolverService + * @param MockObject|null $moduleResolverService * * @return void */ - private function setMockResolverCreatorProperties(MockObject $moduleResolverService): void + private function setMockResolverCreatorProperties(?MockObject $moduleResolverService): void { $property = new ReflectionProperty(ModuleResolverService::class, 'INSTANCE'); $property->setAccessible(true); diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php index 09ff90dfc..4a8ff1403 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php @@ -12,7 +12,6 @@ use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; use Magento\FunctionalTestingFramework\Util\Path\FilePathFormatter; use Magento\FunctionalTestingFramework\Util\Path\UrlFormatter; -use Magento\FunctionalTestingFramework\DataTransport\Auth\WebApiAuth; use \Magento\FunctionalTestingFramework\Util\ModuleResolver\AlphabeticSequenceSorter; use \Magento\FunctionalTestingFramework\Util\ModuleResolver\SequenceSorterInterface; @@ -128,15 +127,6 @@ class ModuleResolver */ protected $sequenceSorter; - /** - * List of module names that will be ignored. - * - * @var array - */ - protected $moduleBlocklist = [ - 'SampleTests', 'SampleTemplates' - ]; - /** * Get ModuleResolver instance. * @@ -180,7 +170,7 @@ public function getEnabledModules() $this->printMagentoVersionInfo(); } - $token = WebApiAuth::getAdminToken(); + $token = ModuleResolverService::getInstance()->getAdminToken(); $url = UrlFormatter::format(getenv('MAGENTO_BASE_URL')) . $this->moduleUrl; @@ -515,24 +505,6 @@ private function normalizeModuleNames($codePaths) return $normalizedCodePaths; } - /** - * Takes a multidimensional array of module paths and flattens to return a one dimensional array of test paths - * - * @param array $modulePaths - * @return array - */ - private function flattenAllModulePaths($modulePaths) - { - $it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($modulePaths)); - $resultArray = []; - - foreach ($it as $value) { - $resultArray[] = $value; - } - - return $resultArray; - } - /** * Executes a REST call to the supplied Magento Base Url for version information to display during generation * @@ -569,66 +541,11 @@ private function printMagentoVersionInfo() * * @param array $modulesPath * @return string[] + * @throws TestFrameworkException */ protected function applyCustomModuleMethods($modulesPath) { - $modulePathsResult = $this->removeBlocklistModules($modulesPath); - $customModulePaths = $this->getCustomModulePaths(); - - array_map(function ($key, $value) { - LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->info( - "including custom module", - [$key => $value] - ); - }, array_keys($customModulePaths), $customModulePaths); - - if (!isset($this->enabledModuleNameAndPaths)) { - $this->enabledModuleNameAndPaths = array_merge($modulePathsResult, $customModulePaths); - } - return $this->flattenAllModulePaths(array_merge($modulePathsResult, $customModulePaths)); - } - - /** - * Remove blocklist modules from input module paths. - * - * @param array $modulePaths - * @return string[] - */ - private function removeBlocklistModules($modulePaths) - { - $modulePathsResult = $modulePaths; - foreach ($modulePathsResult as $moduleName => $modulePath) { - // Remove module if it is in blocklist - if (in_array($moduleName, $this->getModuleBlocklist())) { - unset($modulePathsResult[$moduleName]); - LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->info( - "excluding module", - ['module' => $moduleName] - ); - } - } - - return $modulePathsResult; - } - - /** - * Returns an array of custom module paths defined by the user - * - * @return string[] - */ - private function getCustomModulePaths() - { - return ModuleResolverService::getInstance()->getCustomModulePaths(); - } - - /** - * Getter for moduleBlocklist. - * - * @return string[] - */ - private function getModuleBlocklist() - { - return $this->moduleBlocklist; + return ModuleResolverService::getInstance()->applyCustomModuleMethods($modulesPath); } /** diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php index c3dad2118..0efcb4c54 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php @@ -9,11 +9,15 @@ use Magento\Framework\Component\ComponentRegistrar; use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; +use Magento\FunctionalTestingFramework\DataTransport\Auth\WebApiAuth; +use Magento\FunctionalTestingFramework\Exceptions\FastFailException; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Util\ComposerModuleResolver; use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; use Magento\FunctionalTestingFramework\Util\ModuleResolver; use Magento\FunctionalTestingFramework\Util\Path\FilePathFormatter; +use RecursiveArrayIterator; +use RecursiveIteratorIterator; class ModuleResolverService { @@ -38,6 +42,15 @@ class ModuleResolverService */ private $composerInstalledModulePaths = null; + /** + * List of module names that will be ignored. + * + * @var array + */ + private static $moduleBlockList = [ + 'SampleTests', 'SampleTemplates' + ]; + /** * ModuleResolverService constructor. */ @@ -319,4 +332,96 @@ private function findVendorNameFromPath(string $path): string return $possibleVendorName; } + + /** + * Getter for moduleBlockList. + * + * @return string[] + */ + private function getModuleBlockList(): array + { + return self::$moduleBlockList; + } + + /** + * Get admin token. + * + * @return string + * @throws FastFailException + */ + public function getAdminToken(): string + { + return WebApiAuth::getAdminToken(); + } + + /** + * A wrapping method for any custom logic which needs to be applied to the module list. + * + * @param array $modulesPath + * + * @return string[] + * @throws TestFrameworkException + */ + public function applyCustomModuleMethods(array $modulesPath): array + { + $modulePathsResult = $this->removeBlockListModules($modulesPath); + $customModulePaths = $this->getCustomModulePaths(); + + array_map(function ($key, $value) { + LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->info( + "including custom module", + [$key => $value] + ); + }, array_keys($customModulePaths), $customModulePaths); + + if (!isset($this->enabledModuleNameAndPaths)) { + $this->enabledModuleNameAndPaths = array_merge($modulePathsResult, $customModulePaths); + } + return $this->flattenAllModulePaths(array_merge($modulePathsResult, $customModulePaths)); + } + + /** + * Remove blockList modules from input module paths. + * + * @param array $modulePaths + * + * @return string[] + * @throws TestFrameworkException + */ + private function removeBlockListModules(array $modulePaths): array + { + $modulePathsResult = $modulePaths; + + foreach ($modulePathsResult as $moduleName => $modulePath) { + // Remove module if it is in blocklist + if (in_array($moduleName, $this->getModuleBlockList())) { + unset($modulePathsResult[$moduleName]); + LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->info( + "excluding module", + ['module' => $moduleName] + ); + } + } + + return $modulePathsResult; + } + + /** + * Takes a multidimensional array of module paths and flattens to return a one dimensional array of test paths. + * + * @param array $modulePaths + * + * @return array + */ + private function flattenAllModulePaths(array $modulePaths): array + { + $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($modulePaths)); + $resultArray = []; + + foreach ($it as $value) { + $resultArray[] = $value; + } + + return $resultArray; + } } From d4af1784c7132d516636e11dc81fce9dea9dc8f3 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Thu, 29 Jul 2021 11:54:24 +0300 Subject: [PATCH 051/674] 33308: Fixed static-tests --- .../Util/ModuleResolverTest.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php index 368fd2149..9339798dc 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php @@ -70,7 +70,8 @@ public function testGetModulePathsAggregate(): void $this->mockForceGenerate(false); $moduleResolverService = $this->createPartialMock( - ModuleResolverService::class, ['getRegisteredModuleList', 'aggregateTestModulePaths'] + ModuleResolverService::class, + ['getRegisteredModuleList', 'aggregateTestModulePaths'] ); $moduleResolverService->expects($this->any()) ->method('getRegisteredModuleList') @@ -137,7 +138,6 @@ function ($codePath, $pattern) use ($modulePath) { $this->setMockResolverProperties($resolver, null, []); $this->assertEquals([], $resolver->getModulesPath()); - putenv("TESTS_MODULE_PATH=$origin"); } @@ -205,7 +205,8 @@ public function testAggregateTestModulePathsFromComposerJson(): void $this->mockForceGenerate(false); $moduleResolverService = $this->createPartialMock( - ModuleResolverService::class, ['getComposerJsonTestModulePaths'] + ModuleResolverService::class, + ['getComposerJsonTestModulePaths'] ); $moduleResolverService ->expects($this->any()) @@ -303,7 +304,8 @@ public function testAggregateTestModulePathsFromComposerInstaller(): void { $this->mockForceGenerate(false); $moduleResolverService = $this->createPartialMock( - ModuleResolverService::class, ['getComposerInstalledTestModulePaths'] + ModuleResolverService::class, + ['getComposerInstalledTestModulePaths'] ); $moduleResolverService->expects($this->any()) ->method('getComposerInstalledTestModulePaths') From 3330a671ee21f09f7ffd3da90bf51bb5c123cb33 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Thu, 29 Jul 2021 14:00:20 +0300 Subject: [PATCH 052/674] 33308: Fixed verification-tests --- .../Util/ModuleResolverTest.php | 9 +- .../Util/ModuleResolver.php | 87 +++++++++++++++++- .../ModuleResolver/ModuleResolverService.php | 92 ------------------- 3 files changed, 86 insertions(+), 102 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php index 9339798dc..dab34e37e 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php @@ -783,12 +783,7 @@ public function testGetModulePathsNoAdminToken(): void { // Set --force to false $this->mockForceGenerate(false); - $moduleResolverService = $this->createPartialMock(ModuleResolverService::class, ['applyCustomModuleMethods']); - $moduleResolverService - ->method('applyCustomModuleMethods') - ->willReturn(["example" . DIRECTORY_SEPARATOR . "paths"]); - $this->setMockResolverCreatorProperties($moduleResolverService); $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties($resolver); @@ -893,9 +888,9 @@ private function setMockResolverProperties( $property->setAccessible(true); $property->setValue($instance, $mockModules); - $property = new ReflectionProperty(ModuleResolverService::class, 'moduleBlockList'); + $property = new ReflectionProperty(ModuleResolver::class, 'moduleBlocklist'); $property->setAccessible(true); - $property->setValue($mockBlockList); + $property->setValue($instance, $mockBlockList); } /** diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php index 4a8ff1403..d3511bbea 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php @@ -127,6 +127,15 @@ class ModuleResolver */ protected $sequenceSorter; + /** + * List of module names that will be ignored. + * + * @var array + */ + protected $moduleBlocklist = [ + 'SampleTests', 'SampleTemplates' + ]; + /** * Get ModuleResolver instance. * @@ -315,7 +324,6 @@ private function aggregateTestModulePathsFromComposerJson() * Retrieve all module code paths that have test module composer json files * * @param array $codePaths - * * @return array */ private function getComposerJsonTestModulePaths($codePaths) @@ -505,6 +513,24 @@ private function normalizeModuleNames($codePaths) return $normalizedCodePaths; } + /** + * Takes a multidimensional array of module paths and flattens to return a one dimensional array of test paths + * + * @param array $modulePaths + * @return array + */ + private function flattenAllModulePaths($modulePaths) + { + $it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($modulePaths)); + $resultArray = []; + + foreach ($it as $value) { + $resultArray[] = $value; + } + + return $resultArray; + } + /** * Executes a REST call to the supplied Magento Base Url for version information to display during generation * @@ -541,11 +567,66 @@ private function printMagentoVersionInfo() * * @param array $modulesPath * @return string[] - * @throws TestFrameworkException */ protected function applyCustomModuleMethods($modulesPath) { - return ModuleResolverService::getInstance()->applyCustomModuleMethods($modulesPath); + $modulePathsResult = $this->removeBlocklistModules($modulesPath); + $customModulePaths = $this->getCustomModulePaths(); + + array_map(function ($key, $value) { + LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->info( + "including custom module", + [$key => $value] + ); + }, array_keys($customModulePaths), $customModulePaths); + + if (!isset($this->enabledModuleNameAndPaths)) { + $this->enabledModuleNameAndPaths = array_merge($modulePathsResult, $customModulePaths); + } + return $this->flattenAllModulePaths(array_merge($modulePathsResult, $customModulePaths)); + } + + /** + * Remove blocklist modules from input module paths. + * + * @param array $modulePaths + * @return string[] + */ + private function removeBlocklistModules($modulePaths) + { + $modulePathsResult = $modulePaths; + foreach ($modulePathsResult as $moduleName => $modulePath) { + // Remove module if it is in blocklist + if (in_array($moduleName, $this->getModuleBlocklist())) { + unset($modulePathsResult[$moduleName]); + LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->info( + "excluding module", + ['module' => $moduleName] + ); + } + } + + return $modulePathsResult; + } + + /** + * Returns an array of custom module paths defined by the user + * + * @return string[] + */ + private function getCustomModulePaths() + { + return ModuleResolverService::getInstance()->getCustomModulePaths(); + } + + /** + * Getter for moduleBlocklist. + * + * @return string[] + */ + private function getModuleBlocklist() + { + return $this->moduleBlocklist; } /** diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php index 0efcb4c54..015fa4e9f 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php @@ -16,8 +16,6 @@ use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; use Magento\FunctionalTestingFramework\Util\ModuleResolver; use Magento\FunctionalTestingFramework\Util\Path\FilePathFormatter; -use RecursiveArrayIterator; -use RecursiveIteratorIterator; class ModuleResolverService { @@ -42,15 +40,6 @@ class ModuleResolverService */ private $composerInstalledModulePaths = null; - /** - * List of module names that will be ignored. - * - * @var array - */ - private static $moduleBlockList = [ - 'SampleTests', 'SampleTemplates' - ]; - /** * ModuleResolverService constructor. */ @@ -333,16 +322,6 @@ private function findVendorNameFromPath(string $path): string return $possibleVendorName; } - /** - * Getter for moduleBlockList. - * - * @return string[] - */ - private function getModuleBlockList(): array - { - return self::$moduleBlockList; - } - /** * Get admin token. * @@ -353,75 +332,4 @@ public function getAdminToken(): string { return WebApiAuth::getAdminToken(); } - - /** - * A wrapping method for any custom logic which needs to be applied to the module list. - * - * @param array $modulesPath - * - * @return string[] - * @throws TestFrameworkException - */ - public function applyCustomModuleMethods(array $modulesPath): array - { - $modulePathsResult = $this->removeBlockListModules($modulesPath); - $customModulePaths = $this->getCustomModulePaths(); - - array_map(function ($key, $value) { - LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->info( - "including custom module", - [$key => $value] - ); - }, array_keys($customModulePaths), $customModulePaths); - - if (!isset($this->enabledModuleNameAndPaths)) { - $this->enabledModuleNameAndPaths = array_merge($modulePathsResult, $customModulePaths); - } - return $this->flattenAllModulePaths(array_merge($modulePathsResult, $customModulePaths)); - } - - /** - * Remove blockList modules from input module paths. - * - * @param array $modulePaths - * - * @return string[] - * @throws TestFrameworkException - */ - private function removeBlockListModules(array $modulePaths): array - { - $modulePathsResult = $modulePaths; - - foreach ($modulePathsResult as $moduleName => $modulePath) { - // Remove module if it is in blocklist - if (in_array($moduleName, $this->getModuleBlockList())) { - unset($modulePathsResult[$moduleName]); - LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->info( - "excluding module", - ['module' => $moduleName] - ); - } - } - - return $modulePathsResult; - } - - /** - * Takes a multidimensional array of module paths and flattens to return a one dimensional array of test paths. - * - * @param array $modulePaths - * - * @return array - */ - private function flattenAllModulePaths(array $modulePaths): array - { - $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($modulePaths)); - $resultArray = []; - - foreach ($it as $value) { - $resultArray[] = $value; - } - - return $resultArray; - } } From caa283c02056f9c312980f119c501d370404a090 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Fri, 30 Jul 2021 22:54:10 +0300 Subject: [PATCH 053/674] 33308: Fixed code after review --- .../Util/ModuleResolver.php | 63 ++----------------- 1 file changed, 5 insertions(+), 58 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php index d3511bbea..b04168673 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php @@ -214,6 +214,7 @@ public function getEnabledModules() * * @param boolean $verbosePath * @return array + * @throws TestFrameworkException */ public function getModulesPath($verbosePath = false) { @@ -226,7 +227,7 @@ public function getModulesPath($verbosePath = false) } // Find test modules paths by searching patterns (Test/Mftf, etc) - $allModulePaths = $this->aggregateTestModulePaths(); + $allModulePaths = ModuleResolverService::getInstance()->aggregateTestModulePaths(); // Find test modules paths by searching test composer.json files $composerBasedModulePaths = $this->aggregateTestModulePathsFromComposerJson(); @@ -282,17 +283,6 @@ protected function getModuleAllowlist() return array_map('trim', explode(',', $moduleAllowlist)); } - /** - * Retrieves all module directories which might contain pertinent test code. - * - * @return array - * @throws TestFrameworkException - */ - private function aggregateTestModulePaths() - { - return ModuleResolverService::getInstance()->aggregateTestModulePaths(); - } - /** * Aggregate all code paths with test module composer json files * @@ -317,18 +307,7 @@ private function aggregateTestModulePathsFromComposerJson() $searchCodePaths[] = $modulePath; } - return $this->getComposerJsonTestModulePaths($searchCodePaths); - } - - /** - * Retrieve all module code paths that have test module composer json files - * - * @param array $codePaths - * @return array - */ - private function getComposerJsonTestModulePaths($codePaths) - { - return ModuleResolverService::getInstance()->getComposerJsonTestModulePaths($codePaths); + return ModuleResolverService::getInstance()->getComposerJsonTestModulePaths($searchCodePaths); } /** @@ -342,18 +321,6 @@ private function aggregateTestModulePathsFromComposerInstaller() $magentoBaseCodePath = MAGENTO_BP; $composerFile = $magentoBaseCodePath . DIRECTORY_SEPARATOR . 'composer.json'; - return $this->getComposerInstalledTestModulePaths($composerFile); - } - - /** - * Retrieve composer installed test module code paths - * - * @param string $composerFile - * - * @return array - */ - private function getComposerInstalledTestModulePaths($composerFile) - { return ModuleResolverService::getInstance()->getComposerInstalledTestModulePaths($composerFile); } @@ -495,7 +462,7 @@ private function mergeModulePaths($oneToOneArray, $oneToManyArray) */ private function normalizeModuleNames($codePaths) { - $allComponents = $this->getRegisteredModuleList(); + $allComponents = ModuleResolverService::getInstance()->getRegisteredModuleList(); if (empty($allComponents)) { return $codePaths; } @@ -571,7 +538,7 @@ private function printMagentoVersionInfo() protected function applyCustomModuleMethods($modulesPath) { $modulePathsResult = $this->removeBlocklistModules($modulesPath); - $customModulePaths = $this->getCustomModulePaths(); + $customModulePaths = ModuleResolverService::getInstance()->getCustomModulePaths(); array_map(function ($key, $value) { LoggingUtil::getInstance()->getLogger(ModuleResolver::class)->info( @@ -609,16 +576,6 @@ private function removeBlocklistModules($modulePaths) return $modulePathsResult; } - /** - * Returns an array of custom module paths defined by the user - * - * @return string[] - */ - private function getCustomModulePaths() - { - return ModuleResolverService::getInstance()->getCustomModulePaths(); - } - /** * Getter for moduleBlocklist. * @@ -629,16 +586,6 @@ private function getModuleBlocklist() return $this->moduleBlocklist; } - /** - * Calls Magento method for determining registered modules. - * - * @return string[] - */ - private function getRegisteredModuleList() - { - return ModuleResolverService::getInstance()->getRegisteredModuleList(); - } - /** * Find vendor and module name from path * From 3a1ae0dd7575b077b3ae8fadfb684de82469244b Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Wed, 4 Aug 2021 11:35:21 +0300 Subject: [PATCH 054/674] 33308: Fixed method testGetModulePathsLocations --- .../Util/ModuleResolverTest.php | 51 +++++++++++++------ 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php index dab34e37e..25fd20d73 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php @@ -118,7 +118,6 @@ public function testAggregateTestModulePathsDevTests(): void $moduleResolverService = $this->createPartialMock(ModuleResolverService::class, ['globRelevantPaths']); $moduleResolverService ->method('globRelevantPaths') - ->withConsecutive() ->will( $this->returnCallback( function ($codePath, $pattern) use ($modulePath) { @@ -157,32 +156,42 @@ public function testGetModulePathsLocations(): void $this->mockForceGenerate(false); // Define the Module paths from default TESTS_MODULE_PATH $modulePath = defined('TESTS_MODULE_PATH') ? TESTS_MODULE_PATH : TESTS_BP; - - // Define the Module paths from app/code - $magentoBaseCodePath = MAGENTO_BP; + $invokedWithParams = $expectedParams = [ + [ + $modulePath, + '' + ], + [ + MAGENTO_BP . '/vendor', + 'Test/Mftf' + ], + [ + MAGENTO_BP . '/app/code', + 'Test/Mftf' + ] + ]; $moduleResolverService = $this->createPartialMock(ModuleResolverService::class, ['globRelevantPaths']); $moduleResolverService ->method('globRelevantPaths') - ->withConsecutive() ->will( $this->returnCallback( - function ($codePath, $pattern) use ($modulePath, $magentoBaseCodePath) { - if ($codePath === $modulePath && $pattern === '') { - return []; - } + function ($codePath, $pattern) use (&$invokedWithParams, $expectedParams) { + foreach ($expectedParams as $key => $parameter) { + list($expectedCodePath, $expectedPattern) = $parameter; - if ($codePath === $magentoBaseCodePath . '/vendor' && $pattern === 'Test/Mftf') { - return []; - } + if ($codePath === $expectedCodePath && $pattern === $expectedPattern) { + if (isset($invokedWithParams[$key])) { + unset($invokedWithParams[$key]); + } - if ($codePath === $magentoBaseCodePath . "/app/code" && $pattern === 'Test/Mftf') { - return []; + return []; + } } $this->fail(sprintf( - 'Not expected parameter: \'%s\' when invoked method globRelevantPaths().', - $modulePath + 'Not expected parameter: [%s] when invoked method globRelevantPaths().', + $codePath . ';' . $pattern )); } ) @@ -192,6 +201,16 @@ function ($codePath, $pattern) use ($modulePath, $magentoBaseCodePath) { $resolver = ModuleResolver::getInstance(); $this->setMockResolverProperties($resolver, null, []); $this->assertEquals([], $resolver->getModulesPath()); + + if ($invokedWithParams) { + $parameters = ''; + + foreach ($invokedWithParams as $parameter) { + $parameters .= sprintf('[%s]', implode(';', $parameter)); + } + + $this->fail('The method globRelevantPaths() was not called with expected parameters:' . $parameters); + } } /** From d98d930606cecd8b0ace8fc75080ef840c3a7509 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Mon, 9 Aug 2021 15:03:08 +0300 Subject: [PATCH 055/674] MFTF-33306: Fixed error after branch actualization --- .../Util/TestGeneratorTest.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 730493191..66a2919d4 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -11,11 +11,13 @@ use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; use Magento\FunctionalTestingFramework\Filter\FilterList; +use Magento\FunctionalTestingFramework\ObjectManager; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Test\Objects\TestHookObject; use Magento\FunctionalTestingFramework\Test\Objects\TestObject; use Magento\FunctionalTestingFramework\Util\Filesystem\CestFileCreatorUtil; use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; +use Magento\FunctionalTestingFramework\Util\ModuleResolver; use Magento\FunctionalTestingFramework\Util\TestGenerator; use ReflectionProperty; use tests\unit\Util\MagentoTestCase; @@ -23,6 +25,22 @@ class TestGeneratorTest extends MagentoTestCase { + /** + * @inheritdoc + */ + public static function setUpBeforeClass(): void + { + parent::setUpBeforeClass(); + + $property = new ReflectionProperty(ObjectManager::class, 'instance'); + $property->setAccessible(true); + $property->setValue(null); + + $property = new ReflectionProperty(ModuleResolver::class, 'instance'); + $property->setAccessible(true); + $property->setValue(null); + } + /** * Before method functionality. * From d920627c788f95c3e6a43829623e8b2bfdb2ba3f Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Mon, 9 Aug 2021 17:45:45 +0300 Subject: [PATCH 056/674] MFTF-33294: Fixed strict type issue --- .../Allure/Event/AddUniqueAttachmentEvent.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php b/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php index d6f36f953..af0ed2c52 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php +++ b/src/Magento/FunctionalTestingFramework/Allure/Event/AddUniqueAttachmentEvent.php @@ -31,7 +31,7 @@ public function getAttachmentFileName($filePathOrContents, $type): string { $filePath = $filePathOrContents; - if (!file_exists($filePath) || !is_file($filePath)) { + if (!is_string($filePath) || !file_exists($filePath) || !is_file($filePath)) { //Save contents to temporary file $filePath = tempnam(sys_get_temp_dir(), 'allure-attachment'); if (!file_put_contents($filePath, $filePathOrContents)) { From 3ace8dcc8a4bea05fbdf317e42aa0b8c801b400c Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Mon, 9 Aug 2021 21:10:54 +0300 Subject: [PATCH 057/674] MFTF-33306: Fixed wrong action count value for test --- .../Util/Sorter/ParallelGroupSorterTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php index e289532b5..edc244e1b 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php @@ -64,7 +64,7 @@ public function testBasicTestsSplitByTime(): void public function testTestsAndSuitesSplitByTime(): void { // mock tests for test object handler. - $this->createMockForTest(0); + $this->createMockForTest(0, [300, 275]); // create test to size array $sampleTestArray = [ @@ -421,17 +421,17 @@ public static function tearDownAfterClass(): void * Mock test object and test object handler. * * @param int $numberOfCalls + * @param array $actionCount * * @return void */ - private function createMockForTest(int $numberOfCalls): void + private function createMockForTest(int $numberOfCalls, array $actionCount = [300, 275, 300, 275]): void { $mockTest1 = $this->createMock(TestObject::class); $mockTest1 ->method('getEstimatedDuration') ->willReturnCallback( - function () use (&$numberOfCalls) { - $actionCount = [300, 275, 300, 275]; + function () use (&$numberOfCalls, $actionCount) { $result = $actionCount[$numberOfCalls]; $numberOfCalls++; From 89812a2233590fea15518edc5928b45a0d806451 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Wed, 11 Aug 2021 16:52:08 +0300 Subject: [PATCH 058/674] MFTF-33308: Fixed failed test --- .../Util/TestGeneratorTest.php | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 66a2919d4..800c506f1 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -12,6 +12,7 @@ use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; use Magento\FunctionalTestingFramework\Filter\FilterList; use Magento\FunctionalTestingFramework\ObjectManager; +use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Test\Objects\TestHookObject; use Magento\FunctionalTestingFramework\Test\Objects\TestObject; @@ -19,6 +20,7 @@ use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; use Magento\FunctionalTestingFramework\Util\ModuleResolver; use Magento\FunctionalTestingFramework\Util\TestGenerator; +use ReflectionClass; use ReflectionProperty; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\TestLoggingUtil; @@ -75,6 +77,8 @@ public function testEntityException(): void $testObject = new TestObject('sampleTest', ['merge123' => $actionObject], [], [], 'filename'); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $testObject]); + $this->mockTestObjectHandler(); + $testGeneratorObject->createAllTestFiles(null, []); // assert that no exception for createAllTestFiles and generation error is stored in GenerationErrorHandler @@ -231,5 +235,25 @@ public static function tearDownAfterClass(): void $mftfAppConfigInstance = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); $mftfAppConfigInstance->setAccessible(true); $mftfAppConfigInstance->setValue(null); + + $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); + $property->setAccessible(true); + $property->setValue(null); + } + + /** + * Mock test object handler for test. + */ + private function mockTestObjectHandler(): void + { + $testObjectHandlerClass = new ReflectionClass(TestObjectHandler::class); + $testObjectHandlerConstructor = $testObjectHandlerClass->getConstructor(); + $testObjectHandlerConstructor->setAccessible(true); + $testObjectHandler = $testObjectHandlerClass->newInstanceWithoutConstructor(); + $testObjectHandlerConstructor->invoke($testObjectHandler); + + $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); + $property->setAccessible(true); + $property->setValue($testObjectHandler); } } From de0e75bf95566887cd1be84077e4e0f42a20c222 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Wed, 11 Aug 2021 17:39:48 +0300 Subject: [PATCH 059/674] MFTF-33583: Reverted mocking with new created property --- .../Util/TestGeneratorTest.php | 8 -------- .../Test/Handlers/TestObjectHandler.php | 12 +----------- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index c01a5aa09..800c506f1 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -51,10 +51,6 @@ public static function setUpBeforeClass(): void protected function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); - // Used to mock initTestData method running. - $shouldSkipInitTestDataProperty = new ReflectionProperty(TestObjectHandler::class, 'shouldSkipInitTestData'); - $shouldSkipInitTestDataProperty->setAccessible(true); - $shouldSkipInitTestDataProperty->setValue(true); } /** @@ -65,10 +61,6 @@ protected function setUp(): void protected function tearDown(): void { GenerationErrorHandler::getInstance()->reset(); - - $shouldSkipInitTestDataProperty = new ReflectionProperty(TestObjectHandler::class, 'shouldSkipInitTestData'); - $shouldSkipInitTestDataProperty->setAccessible(true); - $shouldSkipInitTestDataProperty->setValue(false); } /** diff --git a/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php b/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php index 407fc89d9..4abc26c36 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php @@ -44,13 +44,6 @@ class TestObjectHandler implements ObjectHandlerInterface */ private $tests = []; - /** - * Check if initTestData method should be skipped during object initialization. - * - * @var boolean - */ - private static $shouldSkipInitTestData = false; - /** * Instance of ObjectExtensionUtil class * @@ -69,10 +62,7 @@ public static function getInstance($validateAnnotations = true) { if (!self::$testObjectHandler) { self::$testObjectHandler = new TestObjectHandler(); - - if (!self::$shouldSkipInitTestData) { - self::$testObjectHandler->initTestData($validateAnnotations); - } + self::$testObjectHandler->initTestData($validateAnnotations); } return self::$testObjectHandler; From 42dedf0226cd4cd588d952de63c5c53e82c60baf Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Wed, 11 Aug 2021 17:52:49 +0300 Subject: [PATCH 060/674] MFTF-33584: Code refactoring --- .../OperationDefinitionObjectHandlerTest.php | 264 ++++++++++-------- 1 file changed, 143 insertions(+), 121 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php index c5747e8cb..33079b6cd 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php @@ -54,32 +54,36 @@ public function testGetMultipleObjects(): void * has field * key=id, value=integer */ - $mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ - 'testOperationName' => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1', - OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'POST', - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => 'id', - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' - ], + $mockData = [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ + 'testOperationName' => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, + OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1, + OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1', + OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'POST', + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => 'id', + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' + ], + ] + ], + [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, + OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType2, + OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1/{id}', + OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'PUT', + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => 'id', + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' + ], ] - ],[ - OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType2, - OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1/{id}', - OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'PUT', - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => 'id', - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' - ], ] - ]]]; + ] + ]; $this->mockOperationHandlerWithData($mockData); //Perform Assertions @@ -108,21 +112,24 @@ public function testDeprecatedOperation(): void * has field * key=id, value=integer */ - $mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ - 'testOperationName' => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1', - OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'POST', - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => 'id', - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' + $mockData = [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ + 'testOperationName' => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, + OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1, + OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1', + OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'POST', + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => 'id', + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => 'integer' + ], ], - ], - OperationDefinitionObjectHandler::OBJ_DEPRECATED => 'deprecation message' - ]]]; + OperationDefinitionObjectHandler::OBJ_DEPRECATED => 'deprecation message' + ] + ] + ]; $this->mockOperationHandlerWithData($mockData); //Perform Assertions @@ -190,53 +197,60 @@ public function testObjectCreation(): void * key active, value boolean * */ - $mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ - 'testOperationName' => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $testDataTypeName1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $testOperationType, - OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => $testAuth, - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => $testUrl, - OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => $testMethod, - OperationDefinitionObjectHandler::ENTITY_OPERATION_SUCCESS_REGEX => $testSuccessRegex, - OperationDefinitionObjectHandler::ENTITY_OPERATION_CONTENT_TYPE => [ - 0 => [ - 'value' => $testContentType - ] - ], - OperationDefinitionObjectHandler::ENTITY_OPERATION_HEADER => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_HEADER_PARAM => $testHeaderParam, - OperationDefinitionObjectHandler::ENTITY_OPERATION_HEADER_VALUE => $testHeaderValue, - ] - ], - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM_KEY => 'testUrlParamKey', - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM_VALUE => 'testUrlParamValue' - ] - ], - OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT_KEY => $nestedObjectKey, - OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $nestedObjectType, - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => $nestedEntryKey1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => $nestedEntryValue1 - ], - 1 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => $nestedEntryKey2, - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => $nestedEntryValue2, - OperationDefinitionObjectHandler::ENTITY_OPERATION_REQUIRED => $nestedEntryRequired2 - ], - 2 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => $nestedEntryKey3, - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => $nestedEntryValue3 + $mockData = [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ + 'testOperationName' => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $testDataTypeName1, + OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $testOperationType, + OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => $testAuth, + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => $testUrl, + OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => $testMethod, + OperationDefinitionObjectHandler::ENTITY_OPERATION_SUCCESS_REGEX => $testSuccessRegex, + OperationDefinitionObjectHandler::ENTITY_OPERATION_CONTENT_TYPE => [ + 0 => [ + 'value' => $testContentType + ] + ], + OperationDefinitionObjectHandler::ENTITY_OPERATION_HEADER => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_HEADER_PARAM => $testHeaderParam, + OperationDefinitionObjectHandler::ENTITY_OPERATION_HEADER_VALUE => $testHeaderValue, + ] + ], + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM_KEY => 'testUrlParamKey', + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM_VALUE => 'testUrlParamValue' + ] + ], + OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT_KEY => $nestedObjectKey, + OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $nestedObjectType, + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => $nestedEntryKey1, + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => + $nestedEntryValue1 + ], + 1 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => $nestedEntryKey2, + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => + $nestedEntryValue2, + OperationDefinitionObjectHandler::ENTITY_OPERATION_REQUIRED => + $nestedEntryRequired2 + ], + 2 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => $nestedEntryKey3, + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => + $nestedEntryValue3 + ] ] ] - ] - ], - ]]]; + ], + ] + ] + ]; // Prepare objects to compare against $field = OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY; $expectedNestedField = new OperationElement( @@ -326,32 +340,38 @@ public function testObjectArrayCreation(): void * objects with key = nestedObjectKey, type = nestedObjectType * has field with key = nestedFieldKey, value = string */ - $mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ - 'testOperationName' => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1, - OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', - OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1', - OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'POST', - OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT_KEY => $objectArrayKey, - OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT_KEY => $twiceNestedObjectKey, - OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $twiceNestedObjectType, - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => - $twiceNestedEntryKey, - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => - $twiceNestedEntryValue + $mockData = [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ + 'testOperationName' => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, + OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1, + OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => 'auth', + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => 'V1/Type1', + OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => 'POST', + OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT_KEY => $objectArrayKey, + OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT_KEY => + $twiceNestedObjectKey, + OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => + $twiceNestedObjectType, + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => + $twiceNestedEntryKey, + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => + $twiceNestedEntryValue + ] ] ] ] ] ] - ]]]]; + ] + ] + ]; // Prepare Objects to compare against $twoLevelNestedMetadata = new OperationElement( $twiceNestedEntryKey, @@ -418,28 +438,30 @@ public function testLooseJsonCreation(): void * has array key = arrayKey * fields of value = string */ - $mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ - 'testOperationName' => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType, - OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType, - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => $entryKey, - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => $entryValue - ] - ], - OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY_KEY => $arrayKey, - OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY_VALUE => [ - 0 => [ - OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => $arrayValue + $mockData = [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ + 'testOperationName' => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType, + OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType, + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => $entryKey, + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => $entryValue + ] + ], + OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY_KEY => $arrayKey, + OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY_VALUE => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => $arrayValue + ] ] ] ] ] ] - ]]; + ]; // Prepare Objects to assert against $entry = new OperationElement( $entryKey, From 85513e832f77c32e61191814b152c1a5b22aab62 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Wed, 11 Aug 2021 23:59:53 +0300 Subject: [PATCH 061/674] MFTF-33582: Eliminated AspectMock remnants --- dev/tests/_bootstrap.php | 17 --------------- .../verification/TestModule/Test/testFile.xml | 1 + .../Tests/SchemaValidationTest.php | 14 ++++++++----- .../DeprecationStaticCheckTest.php | 16 ++++++++++++-- .../PauseActionStaticCheckTest.php | 21 +++++++++++++++---- 5 files changed, 41 insertions(+), 28 deletions(-) create mode 100644 dev/tests/verification/TestModule/Test/testFile.xml diff --git a/dev/tests/_bootstrap.php b/dev/tests/_bootstrap.php index 9d3750ec6..3b31c6e4a 100644 --- a/dev/tests/_bootstrap.php +++ b/dev/tests/_bootstrap.php @@ -15,23 +15,6 @@ require_once $mftfTestCasePath; require_once $mftfStaticTestCasePath; -// Set up AspectMock -$kernel = \AspectMock\Kernel::getInstance(); -$kernel->init([ - 'debug' => true, - 'includePaths' => [ - PROJECT_ROOT . DIRECTORY_SEPARATOR . 'src', - PROJECT_ROOT . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'allure-framework' - ], - 'cacheDir' => PROJECT_ROOT . - DIRECTORY_SEPARATOR . - 'dev' . - DIRECTORY_SEPARATOR . - 'tests' . - DIRECTORY_SEPARATOR . - '.cache' -]); - // set mftf appplication context \Magento\FunctionalTestingFramework\Config\MftfApplicationConfig::create( true, diff --git a/dev/tests/verification/TestModule/Test/testFile.xml b/dev/tests/verification/TestModule/Test/testFile.xml new file mode 100644 index 000000000..3be22cff3 --- /dev/null +++ b/dev/tests/verification/TestModule/Test/testFile.xml @@ -0,0 +1 @@ +a \ No newline at end of file diff --git a/dev/tests/verification/Tests/SchemaValidationTest.php b/dev/tests/verification/Tests/SchemaValidationTest.php index c6187974c..7da43a15d 100644 --- a/dev/tests/verification/Tests/SchemaValidationTest.php +++ b/dev/tests/verification/Tests/SchemaValidationTest.php @@ -6,8 +6,8 @@ namespace tests\verification\Tests; use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; +use ReflectionProperty; use tests\util\MftfTestCase; -use AspectMock\Test as AspectMock; class SchemaValidationTest extends MftfTestCase { @@ -19,7 +19,10 @@ class SchemaValidationTest extends MftfTestCase */ public function testInvalidTestSchema() { - AspectMock::double(MftfApplicationConfig::class, ['getDebugLevel' => MftfApplicationConfig::LEVEL_DEVELOPER]); + $property = new ReflectionProperty(MftfApplicationConfig::class, 'debugLevel'); + $property->setAccessible(true); + $property->setValue(MftfApplicationConfig::LEVEL_DEVELOPER); + $testFile = ['testFile.xml' => "a"]; $expectedError = TESTS_MODULE_PATH . DIRECTORY_SEPARATOR . @@ -32,11 +35,12 @@ public function testInvalidTestSchema() } /** - * After method functionality - * @return void + * @inheritdoc */ protected function tearDown(): void { - AspectMock::clean(); + $property = new ReflectionProperty(MftfApplicationConfig::class, 'debugLevel'); + $property->setAccessible(true); + $property->setValue(null); } } diff --git a/dev/tests/verification/Tests/StaticCheck/DeprecationStaticCheckTest.php b/dev/tests/verification/Tests/StaticCheck/DeprecationStaticCheckTest.php index f6aef65f6..58875d660 100644 --- a/dev/tests/verification/Tests/StaticCheck/DeprecationStaticCheckTest.php +++ b/dev/tests/verification/Tests/StaticCheck/DeprecationStaticCheckTest.php @@ -5,9 +5,9 @@ */ namespace tests\verification\Tests; -use AspectMock\Test as AspectMock; use Magento\FunctionalTestingFramework\StaticCheck\DeprecatedEntityUsageCheck; use Magento\FunctionalTestingFramework\StaticCheck\StaticChecksList; +use ReflectionProperty; use Symfony\Component\Console\Input\InputInterface; use tests\util\MftfStaticTestCase; @@ -33,7 +33,9 @@ public function testDeprecatedEntityUsageCheck() $staticCheck = new DeprecatedEntityUsageCheck(); $input = $this->mockInputInterface(self::TEST_MODULE_PATH); - AspectMock::double(StaticChecksList::class, ['getErrorFilesPath' => self::STATIC_RESULTS_DIR]); + $property = new ReflectionProperty(StaticChecksList::class, 'errorFilesPath'); + $property->setAccessible(true); + $property->setValue(self::STATIC_RESULTS_DIR); /** @var InputInterface $input */ $staticCheck->execute($input); @@ -47,4 +49,14 @@ public function testDeprecatedEntityUsageCheck() self::LOG_FILE ); } + + /** + * @inheritdoc + */ + public function tearDown(): void + { + $property = new ReflectionProperty(StaticChecksList::class, 'errorFilesPath'); + $property->setAccessible(true); + $property->setValue(null); + } } diff --git a/dev/tests/verification/Tests/StaticCheck/PauseActionStaticCheckTest.php b/dev/tests/verification/Tests/StaticCheck/PauseActionStaticCheckTest.php index 7c8f77c2f..4c579b6c0 100644 --- a/dev/tests/verification/Tests/StaticCheck/PauseActionStaticCheckTest.php +++ b/dev/tests/verification/Tests/StaticCheck/PauseActionStaticCheckTest.php @@ -5,11 +5,11 @@ */ namespace tests\verification\Tests; -use AspectMock\Test as AspectMock; +use Exception; use Magento\FunctionalTestingFramework\StaticCheck\PauseActionUsageCheck; use Magento\FunctionalTestingFramework\StaticCheck\StaticChecksList; +use ReflectionProperty; use Symfony\Component\Console\Input\InputInterface; - use tests\util\MftfStaticTestCase; class PauseActionStaticCheckTest extends MftfStaticTestCase @@ -27,14 +27,17 @@ class PauseActionStaticCheckTest extends MftfStaticTestCase /** * test static-check PauseActionUsageCheck. * - * @throws \Exception + * @throws Exception */ public function testPauseActionUsageCheck() { $staticCheck = new PauseActionUsageCheck(); $input = $this->mockInputInterface(self::TEST_MODULE_PATH); - AspectMock::double(StaticChecksList::class, ['getErrorFilesPath' => self::STATIC_RESULTS_DIR]); + + $property = new ReflectionProperty(StaticChecksList::class, 'errorFilesPath'); + $property->setAccessible(true); + $property->setValue(self::STATIC_RESULTS_DIR); /** @var InputInterface $input */ $staticCheck->execute($input); @@ -48,4 +51,14 @@ public function testPauseActionUsageCheck() self::LOG_FILE ); } + + /** + * @inheritdoc + */ + public static function tearDownAfterClass(): void + { + $property = new ReflectionProperty(StaticChecksList::class, 'errorFilesPath'); + $property->setAccessible(true); + $property->setValue(null); + } } From 71596baf1a47b13c338f9958589d6917e4c52956 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Thu, 12 Aug 2021 00:07:26 +0300 Subject: [PATCH 062/674] MFTF-33582: Removed AspectMock package --- composer.json | 1 - composer.lock | 341 +----------------- .../verification/TestModule/Test/testFile.xml | 1 - 3 files changed, 1 insertion(+), 342 deletions(-) delete mode 100644 dev/tests/verification/TestModule/Test/testFile.xml diff --git a/composer.json b/composer.json index bdf92ca3d..f3d6f8fb0 100755 --- a/composer.json +++ b/composer.json @@ -41,7 +41,6 @@ "require-dev": { "brainmaestro/composer-git-hooks": "^2.3.1", "codacy/coverage": "^1.4", - "codeception/aspect-mock": "^3.0", "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", "phpunit/phpunit": "^9.0", diff --git a/composer.lock b/composer.lock index 226426ef8..232e98fb7 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": "9bec96d8a169a4286803657bbf61004c", + "content-hash": "e68ce0fa4b36ffbd17d27cc6f1f39846", "packages": [ { "name": "allure-framework/allure-codeception", @@ -7424,153 +7424,6 @@ "abandoned": true, "time": "2020-01-10T10:52:12+00:00" }, - { - "name": "codeception/aspect-mock", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/Codeception/AspectMock.git", - "reference": "eef5e5e9ebd66c89d6184416e83851c354963e9c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/AspectMock/zipball/eef5e5e9ebd66c89d6184416e83851c354963e9c", - "reference": "eef5e5e9ebd66c89d6184416e83851c354963e9c", - "shasum": "" - }, - "require": { - "goaop/framework": "^2.2.0", - "php": "^7.0", - "phpunit/phpunit": "> 6.0.0", - "symfony/finder": ">=2.4 <6.0" - }, - "require-dev": { - "codeception/codeception": "^4.0", - "codeception/specify": "^1.0", - "codeception/verify": "^1.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "AspectMock": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Bodnarchuk", - "email": "davert@codeception.com" - } - ], - "description": "Experimental Mocking Framework powered by Aspects", - "support": { - "issues": "https://github.com/Codeception/AspectMock/issues", - "source": "https://github.com/Codeception/AspectMock/tree/3.1.1" - }, - "time": "2021-04-10T19:47:51+00:00" - }, - { - "name": "doctrine/cache", - "version": "1.11.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "3bb5588cec00a0268829cc4a518490df6741af9d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/3bb5588cec00a0268829cc4a518490df6741af9d", - "reference": "3bb5588cec00a0268829cc4a518490df6741af9d", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4", - "psr/cache": ">=3" - }, - "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^8.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "predis/predis": "~1.0", - "psr/cache": "^1.0 || ^2.0", - "symfony/cache": "^4.4 || ^5.2" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/1.11.3" - }, - "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%2Fcache", - "type": "tidelift" - } - ], - "time": "2021-05-25T09:01:55+00:00" - }, { "name": "gitonomy/gitlib", "version": "v1.2.3", @@ -7641,198 +7494,6 @@ ], "time": "2020-12-29T16:48:45+00:00" }, - { - "name": "goaop/framework", - "version": "2.3.5", - "source": { - "type": "git", - "url": "https://github.com/goaop/framework.git", - "reference": "19a6f2110c71aed99081ca23c359436b723a6cdf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/goaop/framework/zipball/19a6f2110c71aed99081ca23c359436b723a6cdf", - "reference": "19a6f2110c71aed99081ca23c359436b723a6cdf", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.2.3", - "doctrine/cache": "^1.5", - "goaop/parser-reflection": "~2.0", - "jakubledl/dissect": "~1.0", - "php": "~7.0", - "symfony/finder": "^3.4|^4.2|^5.0" - }, - "require-dev": { - "adlawson/vfs": "^0.12", - "doctrine/orm": "^2.5", - "phpunit/phpunit": "^5.7", - "symfony/console": "^2.7|^3.0", - "symfony/filesystem": "^3.3", - "symfony/process": "^3.3", - "webmozart/glob": "^4.1" - }, - "suggest": { - "symfony/console": "Enables the usage of the command-line tool." - }, - "bin": [ - "bin/aspect" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "Go\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lisachenko Alexander", - "homepage": "https://github.com/lisachenko" - } - ], - "description": "Framework for aspect-oriented programming in PHP.", - "homepage": "http://go.aopphp.com/", - "keywords": [ - "aop", - "aspect", - "library", - "php" - ], - "support": { - "issues": "https://github.com/goaop/framework/issues", - "source": "https://github.com/goaop/framework/tree/2.3.5" - }, - "funding": [ - { - "url": "https://github.com/lisachenko", - "type": "github" - } - ], - "time": "2021-06-11T16:17:30+00:00" - }, - { - "name": "goaop/parser-reflection", - "version": "2.1.3", - "source": { - "type": "git", - "url": "https://github.com/goaop/parser-reflection.git", - "reference": "2e837e150e15d38f7004b0dbcd0af4abe034c9e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/goaop/parser-reflection/zipball/2e837e150e15d38f7004b0dbcd0af4abe034c9e2", - "reference": "2e837e150e15d38f7004b0dbcd0af4abe034c9e2", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.0 <4.7.0", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Go\\ParserReflection\\": "src" - }, - "files": [ - "src/bootstrap.php" - ], - "exclude-from-classmap": [ - "/tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alexander Lisachenko", - "email": "lisachenko.it@gmail.com" - } - ], - "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" - }, - { - "name": "jakubledl/dissect", - "version": "v1.0.1", - "source": { - "type": "git", - "url": "https://github.com/jakubledl/dissect.git", - "reference": "d3a391de31e45a247e95cef6cf58a91c05af67c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jakubledl/dissect/zipball/d3a391de31e45a247e95cef6cf58a91c05af67c4", - "reference": "d3a391de31e45a247e95cef6cf58a91c05af67c4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/console": "~2.1" - }, - "suggest": { - "symfony/console": "for the command-line tool" - }, - "bin": [ - "bin/dissect.php", - "bin/dissect" - ], - "type": "library", - "autoload": { - "psr-0": { - "Dissect": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "unlicense" - ], - "authors": [ - { - "name": "Jakub Lédl", - "email": "jakubledl@gmail.com" - } - ], - "description": "Lexing and parsing in pure PHP", - "homepage": "https://github.com/jakubledl/dissect", - "keywords": [ - "ast", - "lexing", - "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" - }, { "name": "pdepend/pdepend", "version": "2.9.1", diff --git a/dev/tests/verification/TestModule/Test/testFile.xml b/dev/tests/verification/TestModule/Test/testFile.xml deleted file mode 100644 index 3be22cff3..000000000 --- a/dev/tests/verification/TestModule/Test/testFile.xml +++ /dev/null @@ -1 +0,0 @@ -a \ No newline at end of file From 6fa4ad0ae4718559d481367a435539716108d8f0 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Thu, 12 Aug 2021 00:21:29 +0300 Subject: [PATCH 063/674] MFTF-33582: Fixing verification test --- dev/tests/verification/Tests/SchemaValidationTest.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dev/tests/verification/Tests/SchemaValidationTest.php b/dev/tests/verification/Tests/SchemaValidationTest.php index 7da43a15d..e4e5aea40 100644 --- a/dev/tests/verification/Tests/SchemaValidationTest.php +++ b/dev/tests/verification/Tests/SchemaValidationTest.php @@ -19,9 +19,10 @@ class SchemaValidationTest extends MftfTestCase */ public function testInvalidTestSchema() { + $config = MftfApplicationConfig::getConfig(); $property = new ReflectionProperty(MftfApplicationConfig::class, 'debugLevel'); $property->setAccessible(true); - $property->setValue(MftfApplicationConfig::LEVEL_DEVELOPER); + $property->setValue($config, MftfApplicationConfig::LEVEL_DEVELOPER); $testFile = ['testFile.xml' => "a"]; $expectedError = TESTS_MODULE_PATH . @@ -39,8 +40,9 @@ public function testInvalidTestSchema() */ protected function tearDown(): void { + $config = MftfApplicationConfig::getConfig(); $property = new ReflectionProperty(MftfApplicationConfig::class, 'debugLevel'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue($config, MftfApplicationConfig::LEVEL_DEFAULT); } } From 41bd267e3b71f2ce4f378ceb6e2529815e20490b Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Mon, 16 Aug 2021 15:27:08 +0300 Subject: [PATCH 064/674] MFTF-33782: Added empty query and fragment testing to the UrlFormatterTest --- .../Util/Path/UrlFormatterTest.php | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/UrlFormatterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/UrlFormatterTest.php index 48fc9f337..dcb076b91 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/UrlFormatterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/UrlFormatterTest.php @@ -3,39 +3,41 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace tests\unit\Magento\FunctionalTestFramework\Util\Path; -use tests\unit\Util\MagentoTestCase; -use Magento\FunctionalTestingFramework\Util\Path\UrlFormatter; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; +use Magento\FunctionalTestingFramework\Util\Path\UrlFormatter; +use tests\unit\Util\MagentoTestCase; class UrlFormatterTest extends MagentoTestCase { /** - * Test url format + * Test url format. * - * @dataProvider formatDataProvider * @param string $path - * @param boolean $withTrailingSeparator - * @param mixed string|boolean $expectedPath + * @param bool $withTrailingSeparator + * @param string $expectedPath + * * @return void - * @throws TestFrameworkException + * @dataProvider formatDataProvider */ - public function testFormat($path, $withTrailingSeparator, $expectedPath) + public function testFormat(string $path, bool $withTrailingSeparator, string $expectedPath): void { $this->assertEquals($expectedPath, UrlFormatter::format($path, $withTrailingSeparator)); } /** - * Test url format with exception + * Test url format with exception. * - * @dataProvider formatExceptionDataProvider * @param string $path - * @param boolean $withTrailingSeparator + * @param bool $withTrailingSeparator + * * @return void - * @throws TestFrameworkException + * @dataProvider formatExceptionDataProvider */ - public function testFormatWithException($path, $withTrailingSeparator) + public function testFormatWithException(string $path, bool $withTrailingSeparator): void { $this->expectException(TestFrameworkException::class); $this->expectExceptionMessage("Invalid url: $path\n"); @@ -43,11 +45,11 @@ public function testFormatWithException($path, $withTrailingSeparator) } /** - * Data input + * Data input. * * @return array */ - public function formatDataProvider() + public function formatDataProvider(): array { $url1 = 'http://magento.local/index.php'; $url2 = $url1 . '/'; @@ -58,34 +60,38 @@ public function formatDataProvider() $url7 = 'http://127.0.0.1:8200'; $url8 = 'wwøw.goåoøgle.coøm'; $url9 = 'http://www.google.com'; + return [ - [$url1, null, $url1], + [$url1, false, $url1], [$url1, false, $url1], [$url1, true, $url2], - [$url2, null, $url1], + [$url2, false, $url1], [$url2, false, $url1], [$url2, true, $url2], - [$url3, null, $url3], + [$url3, false, $url3], [$url3, false, $url3], [$url3, true, $url4], - [$url4, null, $url3], + [$url4, false, $url3], [$url4, false, $url3], [$url4, true, $url4], [$url5, true, $url6], [$url7, false, $url7], [$url8, false, $url9], + ['https://magento.local/path?', false, 'https://magento.local/path?'], + ['https://magento.local/path#', false, 'https://magento.local/path#'], + ['https://magento.local/path?#', false, 'https://magento.local/path?#'] ]; } /** - * Invalid data input + * Invalid data input. * * @return array */ - public function formatExceptionDataProvider() + public function formatExceptionDataProvider(): array { return [ - ['', null], + ['', false] ]; } } From debd9bac6e40fc0a591739886718e1726b30b2ee Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 16 Aug 2021 11:14:09 -0500 Subject: [PATCH 065/674] MQE-2729: [PHP 8] Investigate and fix code related to changes in implode() --- .github/workflows/main.yml | 8 +- composer.json | 2 +- composer.lock | 1163 +++++++++++++++++++++--------------- 3 files changed, 672 insertions(+), 501 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e75a0f228..cc7811a75 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', '7.4'] + php-versions: ['7.3', '7.4', '8.0'] steps: - uses: actions/checkout@v2 @@ -54,7 +54,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3', '7.4'] + php-versions: ['7.3', '7.4', '8.0'] steps: - uses: actions/checkout@v2 @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3', '7.4'] + php-versions: ['7.3', '7.4', '8.0'] steps: - uses: actions/checkout@v2 @@ -118,7 +118,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3', '7.4'] + php-versions: ['7.3', '7.4', '8.0'] services: chrome: diff --git a/composer.json b/composer.json index f3d6f8fb0..337c0519b 100755 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "sort-packages": true }, "require": { - "php": "^7.3", + "php": ">7.3", "ext-curl": "*", "ext-dom": "*", "ext-intl": "*", diff --git a/composer.lock b/composer.lock index 232e98fb7..2ab461e57 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": "e68ce0fa4b36ffbd17d27cc6f1f39846", + "content-hash": "cb8347aab3be241fe1517983f3fc044c", "packages": [ { "name": "allure-framework/allure-codeception", @@ -127,16 +127,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.180.1", + "version": "3.190.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "7801112fd8be227954a6ecfbfd85b01ee4a7cae4" + "reference": "8ca6a5f9834de3eb3fb84b28fc12c9088bc01293" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/7801112fd8be227954a6ecfbfd85b01ee4a7cae4", - "reference": "7801112fd8be227954a6ecfbfd85b01ee4a7cae4", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8ca6a5f9834de3eb3fb84b28fc12c9088bc01293", + "reference": "8ca6a5f9834de3eb3fb84b28fc12c9088bc01293", "shasum": "" }, "require": { @@ -211,9 +211,9 @@ "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.180.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.190.2" }, - "time": "2021-05-04T18:14:38+00:00" + "time": "2021-08-13T18:12:28+00:00" }, { "name": "beberlei/assert", @@ -348,16 +348,16 @@ }, { "name": "brick/math", - "version": "0.9.2", + "version": "0.9.3", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0" + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/dff976c2f3487d42c1db75a3b180e2b9f0e72ce0", - "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0", + "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", "shasum": "" }, "require": { @@ -367,7 +367,7 @@ "require-dev": { "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", - "vimeo/psalm": "4.3.2" + "vimeo/psalm": "4.9.2" }, "type": "library", "autoload": { @@ -392,28 +392,32 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.9.2" + "source": "https://github.com/brick/math/tree/0.9.3" }, "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/brick/math", "type": "tidelift" } ], - "time": "2021-01-20T22:51:39+00:00" + "time": "2021-08-15T20:50:18+00:00" }, { "name": "codeception/codeception", - "version": "4.1.21", + "version": "4.1.22", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "c25f20d842a7e3fa0a8e6abf0828f102c914d419" + "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/c25f20d842a7e3fa0a8e6abf0828f102c914d419", - "reference": "c25f20d842a7e3fa0a8e6abf0828f102c914d419", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", + "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", "shasum": "" }, "require": { @@ -424,7 +428,7 @@ "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "guzzlehttp/psr7": "~1.4", + "guzzlehttp/psr7": "^1.4 | ^2.0", "php": ">=5.6.0 <9.0", "symfony/console": ">=2.7 <6.0", "symfony/css-selector": ">=2.7 <6.0", @@ -487,7 +491,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/4.1.21" + "source": "https://github.com/Codeception/Codeception/tree/4.1.22" }, "funding": [ { @@ -495,7 +499,7 @@ "type": "open_collective" } ], - "time": "2021-05-28T17:43:39+00:00" + "time": "2021-08-06T17:15:34+00:00" }, { "name": "codeception/lib-asserts", @@ -793,16 +797,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.2.9", + "version": "1.2.10", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5" + "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/78a0e288fdcebf92aa2318a8d3656168da6ac1a5", - "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/9fdb22c2e97a614657716178093cd1da90a64aa8", + "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8", "shasum": "" }, "require": { @@ -849,7 +853,7 @@ "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" + "source": "https://github.com/composer/ca-bundle/tree/1.2.10" }, "funding": [ { @@ -865,20 +869,20 @@ "type": "tidelift" } ], - "time": "2021-01-12T12:10:35+00:00" + "time": "2021-06-07T13:58:28+00:00" }, { "name": "composer/composer", - "version": "2.0.13", + "version": "2.1.5", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "986e8b86b7b570632ad0a905c3726c33dd4c0efb" + "reference": "ac679902e9f66b85a8f9d8c1c88180f609a8745d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/986e8b86b7b570632ad0a905c3726c33dd4c0efb", - "reference": "986e8b86b7b570632ad0a905c3726c33dd4c0efb", + "url": "https://api.github.com/repos/composer/composer/zipball/ac679902e9f66b85a8f9d8c1c88180f609a8745d", + "reference": "ac679902e9f66b85a8f9d8c1c88180f609a8745d", "shasum": "" }, "require": { @@ -886,21 +890,21 @@ "composer/metadata-minifier": "^1.0", "composer/semver": "^3.0", "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^1.1", - "justinrainbow/json-schema": "^5.2.10", + "composer/xdebug-handler": "^2.0", + "justinrainbow/json-schema": "^5.2.11", "php": "^5.3.2 || ^7.0 || ^8.0", "psr/log": "^1.0", "react/promise": "^1.2 || ^2.7", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0" + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" }, "require-dev": { "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2 || ^5.0" + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -913,7 +917,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -947,7 +951,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.0.13" + "source": "https://github.com/composer/composer/tree/2.1.5" }, "funding": [ { @@ -963,7 +967,7 @@ "type": "tidelift" } ], - "time": "2021-04-27T11:11:08+00:00" + "time": "2021-07-23T08:35:47+00:00" }, { "name": "composer/metadata-minifier", @@ -1036,16 +1040,16 @@ }, { "name": "composer/semver", - "version": "3.2.4", + "version": "3.2.5", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464" + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/a02fdf930a3c1c3ed3a49b5f63859c0c20e10464", - "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464", + "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", "shasum": "" }, "require": { @@ -1097,7 +1101,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.4" + "source": "https://github.com/composer/semver/tree/3.2.5" }, "funding": [ { @@ -1113,7 +1117,7 @@ "type": "tidelift" } ], - "time": "2020-11-13T08:59:24+00:00" + "time": "2021-05-24T12:41:47+00:00" }, { "name": "composer/spdx-licenses", @@ -1196,21 +1200,21 @@ }, { "name": "composer/xdebug-handler", - "version": "1.4.6", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "f27e06cd9675801df441b3656569b328e04aa37c" + "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f27e06cd9675801df441b3656569b328e04aa37c", - "reference": "f27e06cd9675801df441b3656569b328e04aa37c", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", + "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" + "psr/log": "^1 || ^2 || ^3" }, "require-dev": { "phpstan/phpstan": "^0.12.55", @@ -1240,7 +1244,7 @@ "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.6" + "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" }, "funding": [ { @@ -1256,7 +1260,7 @@ "type": "tidelift" } ], - "time": "2021-03-25T17:01:18+00:00" + "time": "2021-07-31T17:03:58+00:00" }, { "name": "csharpru/vault-php", @@ -1361,20 +1365,21 @@ "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" }, { "name": "doctrine/annotations", - "version": "1.13.1", + "version": "1.13.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f" + "reference": "5b668aef16090008790395c02c893b1ba13f7e08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", - "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", + "reference": "5b668aef16090008790395c02c893b1ba13f7e08", "shasum": "" }, "require": { @@ -1431,9 +1436,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.1" + "source": "https://github.com/doctrine/annotations/tree/1.13.2" }, - "time": "2021-05-16T18:07:53+00:00" + "time": "2021-08-05T19:00:23+00:00" }, { "name": "doctrine/instantiator", @@ -2472,20 +2477,20 @@ }, { "name": "jms/serializer", - "version": "3.12.3", + "version": "3.14.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "f908d17afd08f0aab9c083322022682b41483c5b" + "reference": "bf371f55d8137fec4ff096bd45ff19e2db02ac4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/f908d17afd08f0aab9c083322022682b41483c5b", - "reference": "f908d17afd08f0aab9c083322022682b41483c5b", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/bf371f55d8137fec4ff096bd45ff19e2db02ac4c", + "reference": "bf371f55d8137fec4ff096bd45ff19e2db02ac4c", "shasum": "" }, "require": { - "doctrine/annotations": "^1.0", + "doctrine/annotations": "^1.10.4", "doctrine/instantiator": "^1.0.3", "doctrine/lexer": "^1.1", "jms/metadata": "^2.0", @@ -2513,14 +2518,14 @@ "twig/twig": "~1.34|~2.4|^3.0" }, "suggest": { - "doctrine/cache": "Required if you like to use cache functionality.", "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", + "symfony/cache": "Required if you like to use cache functionality.", "symfony/yaml": "Required if you'd like to use the YAML metadata format." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.12-dev" + "dev-master": "3.14-dev" } }, "autoload": { @@ -2553,7 +2558,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/3.12.3" + "source": "https://github.com/schmittjoh/serializer/tree/3.14.0" }, "funding": [ { @@ -2561,20 +2566,20 @@ "type": "github" } ], - "time": "2021-04-25T11:03:24+00:00" + "time": "2021-08-06T12:10:02+00:00" }, { "name": "justinrainbow/json-schema", - "version": "5.2.10", + "version": "5.2.11", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" + "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", + "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", "shasum": "" }, "require": { @@ -2629,22 +2634,22 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" }, - "time": "2020-05-27T16:41:55+00:00" + "time": "2021-07-22T09:24:00+00:00" }, { "name": "monolog/monolog", - "version": "2.3.1", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "9738e495f288eec0b187e310b7cdbbb285777dbe" + "reference": "71312564759a7db5b789296369c1a264efc43aad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/9738e495f288eec0b187e310b7cdbbb285777dbe", - "reference": "9738e495f288eec0b187e310b7cdbbb285777dbe", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/71312564759a7db5b789296369c1a264efc43aad", + "reference": "71312564759a7db5b789296369c1a264efc43aad", "shasum": "" }, "require": { @@ -2715,7 +2720,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.3.1" + "source": "https://github.com/Seldaek/monolog/tree/2.3.2" }, "funding": [ { @@ -2727,20 +2732,20 @@ "type": "tidelift" } ], - "time": "2021-07-14T11:56:39+00:00" + "time": "2021-07-23T07:42:52+00:00" }, { "name": "mtdowling/jmespath.php", - "version": "2.6.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb" + "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/42dae2cbd13154083ca6d70099692fef8ca84bfb", - "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb", "shasum": "" }, "require": { @@ -2748,7 +2753,7 @@ "symfony/polyfill-mbstring": "^1.17" }, "require-dev": { - "composer/xdebug-handler": "^1.4", + "composer/xdebug-handler": "^1.4 || ^2.0", "phpunit/phpunit": "^4.8.36 || ^7.5.15" }, "bin": [ @@ -2786,9 +2791,9 @@ ], "support": { "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.6.0" + "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1" }, - "time": "2020-07-31T21:01:56+00:00" + "time": "2021-06-14T00:11:39+00:00" }, { "name": "mustache/mustache", @@ -2900,16 +2905,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.6.0", + "version": "v4.12.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "c346bbfafe2ff60680258b631afb730d186ed864" + "reference": "6608f01670c3cc5079e18c1dab1104e002579143" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c346bbfafe2ff60680258b631afb730d186ed864", - "reference": "c346bbfafe2ff60680258b631afb730d186ed864", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6608f01670c3cc5079e18c1dab1104e002579143", + "reference": "6608f01670c3cc5079e18c1dab1104e002579143", "shasum": "" }, "require": { @@ -2917,8 +2922,8 @@ "php": ">=7.0" }, "require-dev": { - "ircmaxell/php-yacc": "0.0.5", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -2926,7 +2931,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.3-dev" + "dev-master": "4.9-dev" } }, "autoload": { @@ -2950,9 +2955,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.6.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.12.0" }, - "time": "2020-07-02T17:12:47+00:00" + "time": "2021-07-21T10:44:31+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -3023,28 +3028,29 @@ }, { "name": "phar-io/manifest", - "version": "1.0.3", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", "shasum": "" }, "require": { "ext-dom": "*", "ext-phar": "*", - "phar-io/version": "^2.0", - "php": "^5.6 || ^7.0" + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -3076,26 +3082,26 @@ "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" + "source": "https://github.com/phar-io/manifest/tree/2.0.3" }, - "time": "2018-07-08T19:23:20+00:00" + "time": "2021-07-20T11:28:43+00:00" }, { "name": "phar-io/version", - "version": "2.0.1", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + "reference": "bae7c545bef187884426f042434e561ab1ddb182" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", + "reference": "bae7c545bef187884426f042434e561ab1ddb182", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { @@ -3127,9 +3133,9 @@ "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" + "source": "https://github.com/phar-io/version/tree/3.1.0" }, - "time": "2018-07-08T19:19:57+00:00" + "time": "2021-02-23T14:00:09+00:00" }, { "name": "php-webdriver/webdriver", @@ -3424,28 +3430,27 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "0.5.4", + "version": "0.5.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "e352d065af1ae9b41c12d1dfd309e90f7b1f55c9" + "reference": "ea0b17460ec38e20d7eb64e7ec49b5d44af5d28c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/e352d065af1ae9b41c12d1dfd309e90f7b1f55c9", - "reference": "e352d065af1ae9b41c12d1dfd309e90f7b1f55c9", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/ea0b17460ec38e20d7eb64e7ec49b5d44af5d28c", + "reference": "ea0b17460ec38e20d7eb64e7ec49b5d44af5d28c", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "phing/phing": "^2.16.3", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.60", + "phpstan/phpstan": "^0.12.87", "phpstan/phpstan-strict-rules": "^0.12.5", - "phpunit/phpunit": "^7.5.20", + "phpunit/phpunit": "^9.5", "symfony/process": "^5.2" }, "type": "library", @@ -3468,38 +3473,41 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/0.5.4" + "source": "https://github.com/phpstan/phpdoc-parser/tree/0.5.5" }, - "time": "2021-04-03T14:46:19+00:00" + "time": "2021-06-11T13:24:46+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "8.0.2", + "version": "9.2.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ca6647ffddd2add025ab3f21644a441d7c146cdc" + "reference": "f6293e1b30a2354e8428e004689671b83871edde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca6647ffddd2add025ab3f21644a441d7c146cdc", - "reference": "ca6647ffddd2add025ab3f21644a441d7c146cdc", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde", + "reference": "f6293e1b30a2354e8428e004689671b83871edde", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-xmlwriter": "*", - "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" + "nikic/php-parser": "^4.10.2", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-pcov": "*", @@ -3508,7 +3516,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "8.0-dev" + "dev-master": "9.2-dev" } }, "autoload": { @@ -3536,7 +3544,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/8.0.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" }, "funding": [ { @@ -3544,7 +3552,7 @@ "type": "github" } ], - "time": "2020-05-23T08:02:54+00:00" + "time": "2021-03-28T07:26:59+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3787,78 +3795,18 @@ ], "time": "2020-10-26T13:16:10+00:00" }, - { - "name": "phpunit/php-token-stream", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3", - "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "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" - }, { "name": "phpunit/phpunit", - "version": "9.2.6", + "version": "9.5.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1c6a9e4312e209e659f1fce3ce88dd197c2448f6" + "reference": "191768ccd5c85513b4068bdbe99bb6390c7d54fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c6a9e4312e209e659f1fce3ce88dd197c2448f6", - "reference": "1c6a9e4312e209e659f1fce3ce88dd197c2448f6", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/191768ccd5c85513b4068bdbe99bb6390c7d54fb", + "reference": "191768ccd5c85513b4068bdbe99bb6390c7d54fb", "shasum": "" }, "require": { @@ -3869,30 +3817,31 @@ "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" + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpspec/prophecy": "^1.12.1", + "phpunit/php-code-coverage": "^9.2.3", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.5", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.3", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^2.3.4", + "sebastian/version": "^3.0.2" }, "require-dev": { "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0" + "phpspec/prophecy-phpunit": "^2.0.1" }, "suggest": { "ext-soap": "*", @@ -3904,7 +3853,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-master": "9.5-dev" } }, "autoload": { @@ -3935,7 +3884,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.2.6" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.8" }, "funding": [ { @@ -3947,7 +3896,7 @@ "type": "github" } ], - "time": "2020-07-13T17:55:55+00:00" + "time": "2021-07-31T15:17:34+00:00" }, { "name": "psr/cache", @@ -4302,20 +4251,21 @@ }, { "name": "ramsey/collection", - "version": "1.1.3", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1" + "reference": "eaca1dc1054ddd10cbd83c1461907bee6fb528fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1", - "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1", + "url": "https://api.github.com/repos/ramsey/collection/zipball/eaca1dc1054ddd10cbd83c1461907bee6fb528fa", + "reference": "eaca1dc1054ddd10cbd83c1461907bee6fb528fa", "shasum": "" }, "require": { - "php": "^7.2 || ^8" + "php": "^7.3 || ^8", + "symfony/polyfill-php81": "^1.23" }, "require-dev": { "captainhook/captainhook": "^5.3", @@ -4325,6 +4275,7 @@ "hamcrest/hamcrest-php": "^2", "jangregor/phpstan-prophecy": "^0.8", "mockery/mockery": "^1.3", + "phpspec/prophecy-phpunit": "^2.0", "phpstan/extension-installer": "^1", "phpstan/phpstan": "^0.12.32", "phpstan/phpstan-mockery": "^0.12.5", @@ -4352,7 +4303,7 @@ "homepage": "https://benramsey.com" } ], - "description": "A PHP 7.2+ library for representing and manipulating collections.", + "description": "A PHP library for representing and manipulating collections.", "keywords": [ "array", "collection", @@ -4363,7 +4314,7 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.1.3" + "source": "https://github.com/ramsey/collection/tree/1.2.1" }, "funding": [ { @@ -4375,20 +4326,20 @@ "type": "tidelift" } ], - "time": "2021-01-21T17:40:04+00:00" + "time": "2021-08-06T03:41:06+00:00" }, { "name": "ramsey/uuid", - "version": "4.1.1", + "version": "4.2.1", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "cd4032040a750077205918c86049aa0f43d22947" + "reference": "fe665a03df4f056aa65af552a96e1976df8c8dae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947", - "reference": "cd4032040a750077205918c86049aa0f43d22947", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/fe665a03df4f056aa65af552a96e1976df8c8dae", + "reference": "fe665a03df4f056aa65af552a96e1976df8c8dae", "shasum": "" }, "require": { @@ -4402,26 +4353,26 @@ "rhumsaa/uuid": "self.version" }, "require-dev": { - "codeception/aspect-mock": "^3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7.0", + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", "doctrine/annotations": "^1.8", - "goaop/framework": "^2", + "ergebnis/composer-normalize": "^2.15", "mockery/mockery": "^1.3", "moontoast/math": "^1.1", "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", "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", + "phpbench/phpbench": "^1.0", "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", + "phpunit/phpunit": "^8.5 || ^9", + "slevomat/coding-standard": "^7.0", "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "3.9.4" + "vimeo/psalm": "^4.9" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", @@ -4434,7 +4385,10 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-main": "4.x-dev" + }, + "captainhook": { + "force-install": true } }, "autoload": { @@ -4450,7 +4404,6 @@ "MIT" ], "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", - "homepage": "https://github.com/ramsey/uuid", "keywords": [ "guid", "identifier", @@ -4458,16 +4411,19 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "rss": "https://github.com/ramsey/uuid/releases.atom", - "source": "https://github.com/ramsey/uuid" + "source": "https://github.com/ramsey/uuid/tree/4.2.1" }, "funding": [ { "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" + "time": "2021-08-11T01:06:55+00:00" }, { "name": "react/promise", @@ -4519,6 +4475,62 @@ }, "time": "2020-05-12T15:16:56+00:00" }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "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": "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" + }, { "name": "sebastian/code-unit", "version": "1.0.8", @@ -4704,6 +4716,63 @@ ], "time": "2020-10-26T15:49:45+00:00" }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, { "name": "sebastian/diff", "version": "4.0.4", @@ -4912,26 +4981,26 @@ }, { "name": "sebastian/global-state", - "version": "4.0.0", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bdb1e7c79e592b8c82cb1699be3c8743119b8a72" + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bdb1e7c79e592b8c82cb1699be3c8743119b8a72", - "reference": "bdb1e7c79e592b8c82cb1699be3c8743119b8a72", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", "shasum": "" }, "require": { - "php": "^7.3", + "php": ">=7.3", "sebastian/object-reflector": "^2.0", "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-uopz": "*" @@ -4939,7 +5008,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -4964,9 +5033,72 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/master" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" }, - "time": "2020-02-07T06:11:37+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-06-11T13:31:12+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "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": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" }, { "name": "sebastian/object-enumerator", @@ -5200,16 +5332,16 @@ }, { "name": "sebastian/type", - "version": "2.3.1", + "version": "2.3.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2" + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2", - "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", "shasum": "" }, "require": { @@ -5244,7 +5376,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.1" + "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" }, "funding": [ { @@ -5252,7 +5384,7 @@ "type": "github" } ], - "time": "2020-10-26T13:18:59+00:00" + "time": "2021-06-15T12:49:02+00:00" }, { "name": "sebastian/version", @@ -5495,36 +5627,37 @@ }, { "name": "symfony/console", - "version": "v4.4.22", + "version": "v4.4.29", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "36bbd079b69b94bcc9c9c9e1e37ca3b1e7971625" + "reference": "8baf0bbcfddfde7d7225ae8e04705cfd1081cd7b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/36bbd079b69b94bcc9c9c9e1e37ca3b1e7971625", - "reference": "36bbd079b69b94bcc9c9c9e1e37ca3b1e7971625", + "url": "https://api.github.com/repos/symfony/console/zipball/8baf0bbcfddfde7d7225ae8e04705cfd1081cd7b", + "reference": "8baf0bbcfddfde7d7225ae8e04705cfd1081cd7b", "shasum": "" }, "require": { "php": ">=7.1.3", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2" }, "conflict": { + "psr/log": ">=3", "symfony/dependency-injection": "<3.4", "symfony/event-dispatcher": "<4.3|>=5", "symfony/lock": "<4.4", "symfony/process": "<3.3" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "psr/log": "~1.0", + "psr/log": "^1|^2", "symfony/config": "^3.4|^4.0|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", "symfony/event-dispatcher": "^4.3", @@ -5564,7 +5697,7 @@ "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.22" + "source": "https://github.com/symfony/console/tree/v4.4.29" }, "funding": [ { @@ -5580,24 +5713,25 @@ "type": "tidelift" } ], - "time": "2021-04-16T17:32:19+00:00" + "time": "2021-07-27T19:04:53+00:00" }, { "name": "symfony/css-selector", - "version": "v5.2.7", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "59a684f5ac454f066ecbe6daecce6719aed283fb" + "reference": "7fb120adc7f600a59027775b224c13a33530dd90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/59a684f5ac454f066ecbe6daecce6719aed283fb", - "reference": "59a684f5ac454f066ecbe6daecce6719aed283fb", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", + "reference": "7fb120adc7f600a59027775b224c13a33530dd90", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -5629,7 +5763,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.3.0-BETA1" + "source": "https://github.com/symfony/css-selector/tree/v5.3.4" }, "funding": [ { @@ -5645,7 +5779,7 @@ "type": "tidelift" } ], - "time": "2021-04-07T16:07:52+00:00" + "time": "2021-07-21T12:38:00+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5716,21 +5850,22 @@ }, { "name": "symfony/event-dispatcher", - "version": "v4.4.20", + "version": "v4.4.27", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "c352647244bd376bf7d31efbd5401f13f50dad0c" + "reference": "958a128b184fcf0ba45ec90c0e88554c9327c2e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c352647244bd376bf7d31efbd5401f13f50dad0c", - "reference": "c352647244bd376bf7d31efbd5401f13f50dad0c", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/958a128b184fcf0ba45ec90c0e88554c9327c2e9", + "reference": "958a128b184fcf0ba45ec90c0e88554c9327c2e9", "shasum": "" }, "require": { "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1" + "symfony/event-dispatcher-contracts": "^1.1", + "symfony/polyfill-php80": "^1.16" }, "conflict": { "symfony/dependency-injection": "<3.4" @@ -5740,7 +5875,7 @@ "symfony/event-dispatcher-implementation": "1.1" }, "require-dev": { - "psr/log": "~1.0", + "psr/log": "^1|^2|^3", "symfony/config": "^3.4|^4.0|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", "symfony/error-handler": "~3.4|~4.4", @@ -5779,7 +5914,7 @@ "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.20" + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.27" }, "funding": [ { @@ -5795,7 +5930,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T09:09:26+00:00" + "time": "2021-07-23T15:41:52+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5878,21 +6013,22 @@ }, { "name": "symfony/filesystem", - "version": "v5.2.7", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "056e92acc21d977c37e6ea8e97374b2a6c8551b0" + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/056e92acc21d977c37e6ea8e97374b2a6c8551b0", - "reference": "056e92acc21d977c37e6ea8e97374b2a6c8551b0", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -5920,7 +6056,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.2.7" + "source": "https://github.com/symfony/filesystem/tree/v5.3.4" }, "funding": [ { @@ -5936,24 +6072,25 @@ "type": "tidelift" } ], - "time": "2021-04-01T10:42:13+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/finder", - "version": "v5.2.4", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "0d639a0943822626290d169965804f79400e6a04" + "reference": "17f50e06018baec41551a71a15731287dbaab186" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/0d639a0943822626290d169965804f79400e6a04", - "reference": "0d639a0943822626290d169965804f79400e6a04", + "url": "https://api.github.com/repos/symfony/finder/zipball/17f50e06018baec41551a71a15731287dbaab186", + "reference": "17f50e06018baec41551a71a15731287dbaab186", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -5981,7 +6118,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.2.4" + "source": "https://github.com/symfony/finder/tree/v5.3.4" }, "funding": [ { @@ -5997,27 +6134,27 @@ "type": "tidelift" } ], - "time": "2021-02-15T18:55:04+00:00" + "time": "2021-07-23T15:54:19+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.2.7", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "a416487a73bb9c9d120e9ba3a60547f4a3fb7a1f" + "reference": "a8388f7b7054a7401997008ce9cd8c6b0ab7ac75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a416487a73bb9c9d120e9ba3a60547f4a3fb7a1f", - "reference": "a416487a73bb9c9d120e9ba3a60547f4a3fb7a1f", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a8388f7b7054a7401997008ce9cd8c6b0ab7ac75", + "reference": "a8388f7b7054a7401997008ce9cd8c6b0ab7ac75", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "require-dev": { "predis/predis": "~1.0", @@ -6054,7 +6191,7 @@ "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.7" + "source": "https://github.com/symfony/http-foundation/tree/v5.3.6" }, "funding": [ { @@ -6070,20 +6207,20 @@ "type": "tidelift" } ], - "time": "2021-05-01T13:46:24+00:00" + "time": "2021-07-27T17:08:17+00:00" }, { "name": "symfony/mime", - "version": "v5.2.7", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7af452bf51c46f18da00feb32e1ad36db9426515" + "reference": "633e4e8afe9e529e5599d71238849a4218dd497b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7af452bf51c46f18da00feb32e1ad36db9426515", - "reference": "7af452bf51c46f18da00feb32e1ad36db9426515", + "url": "https://api.github.com/repos/symfony/mime/zipball/633e4e8afe9e529e5599d71238849a4218dd497b", + "reference": "633e4e8afe9e529e5599d71238849a4218dd497b", "shasum": "" }, "require": { @@ -6091,7 +6228,7 @@ "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "egulias/email-validator": "~3.0.0", @@ -6137,7 +6274,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.2.7" + "source": "https://github.com/symfony/mime/tree/v5.3.4" }, "funding": [ { @@ -6153,20 +6290,20 @@ "type": "tidelift" } ], - "time": "2021-04-29T20:47:09+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { @@ -6178,7 +6315,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6216,7 +6353,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" }, "funding": [ { @@ -6232,20 +6369,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "2d63434d922daf7da8dd863e7907e67ee3031483" + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/2d63434d922daf7da8dd863e7907e67ee3031483", - "reference": "2d63434d922daf7da8dd863e7907e67ee3031483", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", "shasum": "" }, "require": { @@ -6259,7 +6396,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6303,7 +6440,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" }, "funding": [ { @@ -6319,20 +6456,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248" + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { @@ -6344,7 +6481,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6387,7 +6524,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, "funding": [ { @@ -6403,20 +6540,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { @@ -6467,7 +6604,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" }, "funding": [ { @@ -6483,20 +6620,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9" + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", - "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", "shasum": "" }, "require": { @@ -6505,7 +6642,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6543,7 +6680,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" }, "funding": [ { @@ -6559,20 +6696,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-05-27T09:17:38+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -6581,7 +6718,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6622,7 +6759,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { @@ -6638,20 +6775,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.22.1", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -6660,7 +6797,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6705,7 +6842,86 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, + "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-07-28T13:41:28+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "e66119f3de95efc359483f810c4c3e6436279436" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", + "reference": "e66119f3de95efc359483f810c4c3e6436279436", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "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 backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" }, "funding": [ { @@ -6721,24 +6937,25 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-05-21T13:25:03+00:00" }, { "name": "symfony/process", - "version": "v4.4.25", + "version": "v4.4.27", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "cd61e6dd273975c6625316de9d141ebd197f93c9" + "reference": "0b7dc5599ac4aa6d7b936c8f7d10abae64f6cf7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/cd61e6dd273975c6625316de9d141ebd197f93c9", - "reference": "cd61e6dd273975c6625316de9d141ebd197f93c9", + "url": "https://api.github.com/repos/symfony/process/zipball/0b7dc5599ac4aa6d7b936c8f7d10abae64f6cf7f", + "reference": "0b7dc5599ac4aa6d7b936c8f7d10abae64f6cf7f", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": ">=7.1.3", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -6766,7 +6983,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v4.4.25" + "source": "https://github.com/symfony/process/tree/v4.4.27" }, "funding": [ { @@ -6782,7 +6999,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T11:20:16+00:00" + "time": "2021-07-23T15:41:52+00:00" }, { "name": "symfony/service-contracts", @@ -6865,31 +7082,35 @@ }, { "name": "symfony/yaml", - "version": "v4.4.22", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "1c2fd24147961525eaefb65b11987cab75adab59" + "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/1c2fd24147961525eaefb65b11987cab75adab59", - "reference": "1c2fd24147961525eaefb65b11987cab75adab59", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", + "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/console": "<3.4" + "symfony/console": "<4.4" }, "require-dev": { - "symfony/console": "^3.4|^4.0|^5.0" + "symfony/console": "^4.4|^5.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { "psr-4": { @@ -6916,7 +7137,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v4.4.22" + "source": "https://github.com/symfony/yaml/tree/v5.3.6" }, "funding": [ { @@ -6932,7 +7153,7 @@ "type": "tidelift" } ], - "time": "2021-04-23T12:09:37+00:00" + "time": "2021-07-29T06:20:01+00:00" }, { "name": "thecodingmachine/safe", @@ -7075,16 +7296,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "shasum": "" }, "require": { @@ -7113,7 +7334,7 @@ "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" + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" }, "funding": [ { @@ -7121,7 +7342,7 @@ "type": "github" } ], - "time": "2020-07-12T23:59:07+00:00" + "time": "2021-07-28T10:34:58+00:00" }, { "name": "vlucas/phpdotenv", @@ -7496,16 +7717,16 @@ }, { "name": "pdepend/pdepend", - "version": "2.9.1", + "version": "2.10.0", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "1632f0cee84512ffd6dde71e58536b3b06528c41" + "reference": "1fd30f4352b630ad53fec3fd5e8b8ba760f85596" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/1632f0cee84512ffd6dde71e58536b3b06528c41", - "reference": "1632f0cee84512ffd6dde71e58536b3b06528c41", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/1fd30f4352b630ad53fec3fd5e8b8ba760f85596", + "reference": "1fd30f4352b630ad53fec3fd5e8b8ba760f85596", "shasum": "" }, "require": { @@ -7541,7 +7762,7 @@ "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/2.9.1" + "source": "https://github.com/pdepend/pdepend/tree/2.10.0" }, "funding": [ { @@ -7549,7 +7770,7 @@ "type": "tidelift" } ], - "time": "2021-04-15T21:36:28+00:00" + "time": "2021-07-20T09:56:09+00:00" }, { "name": "php-coveralls/php-coveralls", @@ -7636,22 +7857,22 @@ }, { "name": "phpmd/phpmd", - "version": "2.10.0", + "version": "2.10.2", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "58ef9e746a1ab50ad3360d5d301e1229ed2612cb" + "reference": "1bc74db7cf834662d83abebae265be11bb2eec3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/58ef9e746a1ab50ad3360d5d301e1229ed2612cb", - "reference": "58ef9e746a1ab50ad3360d5d301e1229ed2612cb", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/1bc74db7cf834662d83abebae265be11bb2eec3a", + "reference": "1bc74db7cf834662d83abebae265be11bb2eec3a", "shasum": "" }, "require": { - "composer/xdebug-handler": "^1.0", + "composer/xdebug-handler": "^1.0 || ^2.0", "ext-xml": "*", - "pdepend/pdepend": "^2.9.1", + "pdepend/pdepend": "^2.10.0", "php": ">=5.3.9" }, "require-dev": { @@ -7707,7 +7928,7 @@ "support": { "irc": "irc://irc.freenode.org/phpmd", "issues": "https://github.com/phpmd/phpmd/issues", - "source": "https://github.com/phpmd/phpmd/tree/2.10.0" + "source": "https://github.com/phpmd/phpmd/tree/2.10.2" }, "funding": [ { @@ -7715,63 +7936,7 @@ "type": "tidelift" } ], - "time": "2021-04-26T18:44:44+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "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": "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" + "time": "2021-07-22T09:56:23+00:00" }, { "name": "sebastian/phpcpd", @@ -7892,32 +8057,35 @@ }, { "name": "symfony/config", - "version": "v4.4.22", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "f6d8318c14e4be81525ae47b30e618f0bed4c7b3" + "reference": "4268f3059c904c61636275182707f81645517a37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/f6d8318c14e4be81525ae47b30e618f0bed4c7b3", - "reference": "f6d8318c14e4be81525ae47b30e618f0bed4c7b3", + "url": "https://api.github.com/repos/symfony/config/zipball/4268f3059c904c61636275182707f81645517a37", + "reference": "4268f3059c904c61636275182707f81645517a37", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/filesystem": "^3.4|^4.0|^5.0", - "symfony/polyfill-ctype": "~1.8" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/filesystem": "^4.4|^5.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22" }, "conflict": { - "symfony/finder": "<3.4" + "symfony/finder": "<4.4" }, "require-dev": { - "symfony/event-dispatcher": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/messenger": "^4.1|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/yaml": "^4.4|^5.0" }, "suggest": { "symfony/yaml": "To use the yaml reference dumper" @@ -7948,7 +8116,7 @@ "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.22" + "source": "https://github.com/symfony/config/tree/v5.3.4" }, "funding": [ { @@ -7964,41 +8132,44 @@ "type": "tidelift" } ], - "time": "2021-04-07T15:47:03+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/dependency-injection", - "version": "v4.4.22", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "778b140b3e8f6890f43dc2c978e58e69f188909a" + "reference": "5a825e4b386066167a8b55487091cb62beec74c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/778b140b3e8f6890f43dc2c978e58e69f188909a", - "reference": "778b140b3e8f6890f43dc2c978e58e69f188909a", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5a825e4b386066167a8b55487091cb62beec74c2", + "reference": "5a825e4b386066167a8b55487091cb62beec74c2", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/container": "^1.0", + "php": ">=7.2.5", + "psr/container": "^1.1.1", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { - "symfony/config": "<4.3|>=5.0", - "symfony/finder": "<3.4", - "symfony/proxy-manager-bridge": "<3.4", - "symfony/yaml": "<3.4" + "ext-psr": "<1.1|>=2", + "symfony/config": "<5.3", + "symfony/finder": "<4.4", + "symfony/proxy-manager-bridge": "<4.4", + "symfony/yaml": "<4.4" }, "provide": { "psr/container-implementation": "1.0", "symfony/service-implementation": "1.0|2.0" }, "require-dev": { - "symfony/config": "^4.3", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/config": "^5.3", + "symfony/expression-language": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" }, "suggest": { "symfony/config": "", @@ -8033,7 +8204,7 @@ "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.22" + "source": "https://github.com/symfony/dependency-injection/tree/v5.3.4" }, "funding": [ { @@ -8049,20 +8220,20 @@ "type": "tidelift" } ], - "time": "2021-04-07T15:47:03+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "313d02f59d6543311865007e5ff4ace05b35ee65" + "reference": "b24c6a92c6db316fee69e38c80591e080e41536c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/313d02f59d6543311865007e5ff4ace05b35ee65", - "reference": "313d02f59d6543311865007e5ff4ace05b35ee65", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b24c6a92c6db316fee69e38c80591e080e41536c", + "reference": "b24c6a92c6db316fee69e38c80591e080e41536c", "shasum": "" }, "require": { @@ -8095,7 +8266,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.3.0" + "source": "https://github.com/symfony/stopwatch/tree/v5.3.4" }, "funding": [ { @@ -8111,7 +8282,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-10T08:58:57+00:00" } ], "aliases": [], @@ -8120,7 +8291,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^7.3", + "php": ">7.3", "ext-curl": "*", "ext-dom": "*", "ext-intl": "*", @@ -8128,5 +8299,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } From 918e7ec112f1250ff99df11b93ee6788b5d1ca4b Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 16 Aug 2021 12:40:31 -0500 Subject: [PATCH 066/674] MQE-2729: [PHP 8] Investigate and fix code related to changes in implode() - Remove usage of \ReflectionParameter::getClass() --- .../FunctionalTestingFramework/Code/Reader/ClassReader.php | 5 ++++- .../FunctionalTestingFramework/System/Code/ClassReader.php | 7 +++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Code/Reader/ClassReader.php b/src/Magento/FunctionalTestingFramework/Code/Reader/ClassReader.php index bc29d47fc..3d359a5f2 100644 --- a/src/Magento/FunctionalTestingFramework/Code/Reader/ClassReader.php +++ b/src/Magento/FunctionalTestingFramework/Code/Reader/ClassReader.php @@ -24,9 +24,12 @@ public function getConstructor($className) /** @var $parameter \ReflectionParameter */ foreach ($constructor->getParameters() as $parameter) { try { + $name = $parameter->getType() && !$parameter->getType()->isBuiltin() + ? new \ReflectionClass($parameter->getType()->getName()) + : null; $result[] = [ $parameter->getName(), - $parameter->getClass() !== null ? $parameter->getClass()->getName() : null, + $name !== null ? $name->getName() : null, !$parameter->isOptional(), $parameter->isOptional() ? ($parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null) diff --git a/src/Magento/FunctionalTestingFramework/System/Code/ClassReader.php b/src/Magento/FunctionalTestingFramework/System/Code/ClassReader.php index 5f44ea104..ad3f3b054 100644 --- a/src/Magento/FunctionalTestingFramework/System/Code/ClassReader.php +++ b/src/Magento/FunctionalTestingFramework/System/Code/ClassReader.php @@ -31,9 +31,12 @@ public function getParameters($className, $method) /** @var $parameter \ReflectionParameter */ foreach ($method->getParameters() as $parameter) { try { - $result[$parameter->getName()] = [ + $name = $parameter->getType() && !$parameter->getType()->isBuiltin() + ? new \ReflectionClass($parameter->getType()->getName()) + : null; + $result[$parameter->getName()] = [ $parameter->getName(), - ($parameter->getClass() !== null) ? $parameter->getClass()->getName() : null, + $name !== null ? $name->getName() : null, !$parameter->isOptional(), $parameter->isOptional() ? $parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null : From ebaac57a0a86b3cfefc0cfd567ba78293cc7b095 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 16 Aug 2021 13:28:53 -0500 Subject: [PATCH 067/674] MQE-2729: [PHP 8] Investigate and fix code related to changes in implode() - Remove usage of \ReflectionParameter::getClass() --- .../FunctionalTestingFramework/System/Code/ClassReader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/System/Code/ClassReader.php b/src/Magento/FunctionalTestingFramework/System/Code/ClassReader.php index ad3f3b054..1ccb28cc6 100644 --- a/src/Magento/FunctionalTestingFramework/System/Code/ClassReader.php +++ b/src/Magento/FunctionalTestingFramework/System/Code/ClassReader.php @@ -34,7 +34,7 @@ public function getParameters($className, $method) $name = $parameter->getType() && !$parameter->getType()->isBuiltin() ? new \ReflectionClass($parameter->getType()->getName()) : null; - $result[$parameter->getName()] = [ + $result[$parameter->getName()] = [ $parameter->getName(), $name !== null ? $name->getName() : null, !$parameter->isOptional(), From 2a40fdfd1614d75569724fcf3894e313da1706c0 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Mon, 16 Aug 2021 21:37:34 +0300 Subject: [PATCH 068/674] MFTF-33782: Code refactoring --- .../Util/Path/FilePathFormatterTest.php | 45 ++++++++------ .../Util/Path/FilePathFormatter.php | 6 +- .../Util/Path/FormatterInterface.php | 6 +- .../Util/Path/UrlFormatter.php | 61 +++++++++++-------- 4 files changed, 70 insertions(+), 48 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/FilePathFormatterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/FilePathFormatterTest.php index 1bad633e2..34365ac5d 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/FilePathFormatterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/FilePathFormatterTest.php @@ -3,25 +3,28 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace tests\unit\Magento\FunctionalTestFramework\Util\Path; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; -use tests\unit\Util\MagentoTestCase; use Magento\FunctionalTestingFramework\Util\Path\FilePathFormatter; +use tests\unit\Util\MagentoTestCase; class FilePathFormatterTest extends MagentoTestCase { /** - * Test file format + * Test file format. * - * @dataProvider formatDataProvider * @param string $path - * @param boolean $withTrailingSeparator - * @param mixed string|boolean $expectedPath + * @param bool $withTrailingSeparator + * @param string|null $expectedPath + * * @return void * @throws TestFrameworkException + * @dataProvider formatDataProvider */ - public function testFormat($path, $withTrailingSeparator, $expectedPath) + public function testFormat(string $path, bool $withTrailingSeparator, ?string $expectedPath): void { if (null !== $expectedPath) { $this->assertEquals($expectedPath, FilePathFormatter::format($path, $withTrailingSeparator)); @@ -33,15 +36,16 @@ public function testFormat($path, $withTrailingSeparator, $expectedPath) } /** - * Test file format with exception + * Test file format with exception. * - * @dataProvider formatExceptionDataProvider * @param string $path - * @param boolean $withTrailingSeparator + * @param bool $withTrailingSeparator + * * @return void * @throws TestFrameworkException + * @dataProvider formatExceptionDataProvider */ - public function testFormatWithException($path, $withTrailingSeparator) + public function testFormatWithException(string $path, bool $withTrailingSeparator): void { $this->expectException(TestFrameworkException::class); $this->expectExceptionMessage("Invalid or non-existing file: $path\n"); @@ -49,36 +53,37 @@ public function testFormatWithException($path, $withTrailingSeparator) } /** - * Data input + * Data input. * * @return array */ - public function formatDataProvider() + public function formatDataProvider(): array { $path1 = rtrim(TESTS_BP, '/'); $path2 = $path1 . DIRECTORY_SEPARATOR; + return [ - [$path1, null, $path1], + [$path1, false, $path1], [$path1, false, $path1], [$path1, true, $path2], - [$path2, null, $path1], + [$path2, false, $path1], [$path2, false, $path1], [$path2, true, $path2], - [__DIR__. DIRECTORY_SEPARATOR . basename(__FILE__), null, __FILE__], - ['', null, null] // Empty string is valid + [__DIR__. DIRECTORY_SEPARATOR . basename(__FILE__), false, __FILE__], + ['', false, null] // Empty string is valid ]; } /** - * Invalid data input + * Invalid data input. * * @return array */ - public function formatExceptionDataProvider() + public function formatExceptionDataProvider(): array { return [ - ['abc', null], - ['X://some\dir/@', null], + ['abc', false], + ['X://some\dir/@', false] ]; } } diff --git a/src/Magento/FunctionalTestingFramework/Util/Path/FilePathFormatter.php b/src/Magento/FunctionalTestingFramework/Util/Path/FilePathFormatter.php index 8b496e739..092e060b5 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Path/FilePathFormatter.php +++ b/src/Magento/FunctionalTestingFramework/Util/Path/FilePathFormatter.php @@ -3,6 +3,7 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace Magento\FunctionalTestingFramework\Util\Path; @@ -11,14 +12,15 @@ class FilePathFormatter implements FormatterInterface { /** - * Return formatted full file path from input string, or false on error + * Return formatted full file path from input string, or false on error. * * @param string $path * @param boolean $withTrailingSeparator + * * @return string * @throws TestFrameworkException */ - public static function format($path, $withTrailingSeparator = true) + public static function format(string $path, bool $withTrailingSeparator = true): string { $validPath = realpath($path); diff --git a/src/Magento/FunctionalTestingFramework/Util/Path/FormatterInterface.php b/src/Magento/FunctionalTestingFramework/Util/Path/FormatterInterface.php index 11de71204..0da9fe6d8 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Path/FormatterInterface.php +++ b/src/Magento/FunctionalTestingFramework/Util/Path/FormatterInterface.php @@ -3,6 +3,7 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace Magento\FunctionalTestingFramework\Util\Path; @@ -11,12 +12,13 @@ interface FormatterInterface { /** - * Return formatted path (file path, url, etc) from input string, or false on error + * Return formatted path (file path, url, etc) from input string, or false on error. * * @param string $input * @param boolean $withTrailingSeparator + * * @return string * @throws TestFrameworkException */ - public static function format($input, $withTrailingSeparator = true); + public static function format(string $input, bool $withTrailingSeparator = true): string; } diff --git a/src/Magento/FunctionalTestingFramework/Util/Path/UrlFormatter.php b/src/Magento/FunctionalTestingFramework/Util/Path/UrlFormatter.php index c7b60b6ab..49f5e0e18 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Path/UrlFormatter.php +++ b/src/Magento/FunctionalTestingFramework/Util/Path/UrlFormatter.php @@ -3,6 +3,7 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace Magento\FunctionalTestingFramework\Util\Path; @@ -11,14 +12,15 @@ class UrlFormatter implements FormatterInterface { /** - * Return formatted url path from input string + * Return formatted url path from input string. * * @param string $url * @param boolean $withTrailingSeparator + * * @return string * @throws TestFrameworkException */ - public static function format($url, $withTrailingSeparator = true) + public static function format(string $url, bool $withTrailingSeparator = true): string { $sanitizedUrl = rtrim($url, '/'); @@ -47,12 +49,13 @@ public static function format($url, $withTrailingSeparator = true) } /** - * Try to build missing url scheme and host + * Try to build missing url scheme and host. * * @param string $url + * * @return string */ - private static function buildUrl($url) + private static function buildUrl(string $url): string { $urlParts = parse_url($url); @@ -76,32 +79,42 @@ private static function buildUrl($url) /** * Returns url from $parts given, used with parse_url output for convenience. * This only exists because of deprecation of http_build_url, which does the exact same thing as the code below. + * * @param array $parts + * * @return string */ - private static function merge(array $parts) + private static function merge(array $parts): string { $get = function ($key) use ($parts) { - return isset($parts[$key]) ? $parts[$key] : null; + return $parts[$key] ?? ''; }; - $pass = $get('pass'); - $user = $get('user'); - $userinfo = $pass !== null ? "$user:$pass" : $user; - $port = $get('port'); - $scheme = $get('scheme'); - $query = $get('query'); - $fragment = $get('fragment'); - $authority = - ($userinfo !== null ? "$userinfo@" : '') . - $get('host') . - ($port ? ":$port" : ''); - - return - (strlen($scheme) ? "$scheme:" : '') . - (strlen($authority) ? "//$authority" : '') . - $get('path') . - (strlen($query) ? "?$query" : '') . - (strlen($fragment) ? "#$fragment" : ''); + $pass = $get('pass'); + $user = $get('user'); + $userinfo = $pass !== '' ? "$user:$pass" : $user; + $port = $get('port'); + $scheme = $get('scheme'); + $query = $get('query'); + $fragment = $get('fragment'); + $authority = ($userinfo !== '' ? "$userinfo@" : '') . $get('host') . ($port ? ":$port" : ''); + + return str_replace( + [ + '%scheme', + '%authority', + '%path', + '%query', + '%fragment' + ], + [ + strlen($scheme) ? "$scheme:" : '', + strlen($authority) ? "//$authority" : '', + $get('path'), + strlen($query) ? "?$query" : '', + strlen($fragment) ? "#$fragment" : '' + ], + '%scheme%authority%path%query%fragment' + ); } } From bbd90dc6067cc13dc31aca2215ad5d265420937d Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 16 Aug 2021 15:40:00 -0500 Subject: [PATCH 069/674] MQE-2729: [PHP 8] Investigate and fix code related to changes in implode() - update ParallelGroupSorter to avoid issues with 'asort' function --- .../Util/Sorter/ParallelGroupSorterTest.php | 28 +++++++++---------- .../Util/Sorter/ParallelGroupSorter.php | 13 +++++---- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php index edc244e1b..5429ec92a 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php @@ -49,8 +49,8 @@ public function testBasicTestsSplitByTime(): void $actualResult = $testSorter->getTestsGroupedBySize([], $sampleTestArray, 200); $this->assertCount(5, $actualResult); - foreach ($actualResult as $gropuNumber => $actualTests) { - $expectedTests = $expectedResult[$gropuNumber]; + foreach ($actualResult as $groupNumber => $actualTests) { + $expectedTests = $expectedResult[$groupNumber]; $this->assertEquals($expectedTests, array_keys($actualTests)); } } @@ -134,18 +134,18 @@ public function testBasicTestsSplitByGroup(): void $expectedResult = [ 1 => ['test2', 'test8'], - 2 => ['test11', 'test9', 'test17', 'test19', 'test13'], - 3 => ['test7', 'test18', 'test14', 'test21'], - 4 => ['test6', 'test12', 'test20', 'test5', 'test10'], - 5 => ['test1', 'test16', 'test4', 'test3', 'test15'] + 2 => ['test7', 'test18', 'test14', 'test21'], + 3 => ['test6', 'test12', 'test20', 'test5', 'test10'], + 4 => ['test1', 'test16', 'test4', 'test3', 'test15'], + 5 => ['test11', 'test9', 'test17', 'test19', 'test13'], ]; $testSorter = new ParallelGroupSorter(); $actualResult = $testSorter->getTestsGroupedByFixedGroupCount([], $sampleTestArray, 5); $this->assertCount(5, $actualResult); - foreach ($actualResult as $gropuNumber => $actualTests) { - $expectedTests = $expectedResult[$gropuNumber]; + foreach ($actualResult as $groupNumber => $actualTests) { + $expectedTests = $expectedResult[$groupNumber]; $this->assertEquals($expectedTests, array_keys($actualTests)); } } @@ -178,8 +178,8 @@ public function testBasicTestsSplitByBigGroupNumber(): void $actualResult = $testSorter->getTestsGroupedByFixedGroupCount([], $sampleTestArray, 10); $this->assertCount(5, $actualResult); - foreach ($actualResult as $gropuNumber => $actualTests) { - $expectedTests = $expectedResult[$gropuNumber]; + foreach ($actualResult as $groupNumber => $actualTests) { + $expectedTests = $expectedResult[$groupNumber]; $this->assertEquals($expectedTests, array_keys($actualTests)); } } @@ -208,8 +208,8 @@ public function testBasicTestsSplitByMinGroupNumber(): void $actualResult = $testSorter->getTestsGroupedByFixedGroupCount([], $sampleTestArray, 1); $this->assertCount(1, $actualResult); - foreach ($actualResult as $gropuNumber => $actualTests) { - $expectedTests = $expectedResult[$gropuNumber]; + foreach ($actualResult as $groupNumber => $actualTests) { + $expectedTests = $expectedResult[$groupNumber]; $this->assertEquals($expectedTests, array_keys($actualTests)); } } @@ -274,14 +274,14 @@ public function testTestsAndSuitesSplitByGroup(): void $this->assertCount(15, $actualResult); $expectedResults = [ - 1 => ['test31', 'test8', 'test1'], + 1 => ['test31', 'test3'], 2 => ['test6', 'test5'], 3 => ['test33', 'test17'], 4 => ['test25', 'test32'], 5 => ['test7', 'test22'], 6 => ['test10', 'test30'], 7 => ['test29', 'test12'], - 8 => ['test13', 'test11', 'test3'], + 8 => ['test13', 'test11', 'test8', 'test1'], 9 => ['test21', 'test26', 'test14'], 10 => ['test24', 'test27', 'test18'], 11 => ['test9', 'test4', 'test23'], diff --git a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php index a0651e051..660dafb62 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php +++ b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php @@ -215,16 +215,17 @@ private function getSuiteGroupCountFromGroupTime($suiteNameToTestSize, $time) private function splitTestsIntoGroups($tests, $groupCnt) { // Reverse sort the test array by size - arsort($tests); + uasort($tests, function ($a, $b) { + return $a >= $b ? -1 : 1; + }); $groups = array_fill(0, $groupCnt, []); + $sums = array_fill(0, $groupCnt, 0); foreach ($tests as $test => $size) { - for ($i = 0; $i < $groupCnt; $i++) { - $sums[$i] = array_sum($groups[$i]); - } - asort($sums); // Always add the next test to the group with the smallest sum - $groups[array_key_first($sums)][$test] = $size; + $key = array_search(min($sums), $sums); + $groups[$key][$test] = $size; + $sums[$key] += $size; } // Filter empty array return array_filter($groups); From ee3f81fc7bcb3dfa2c4ac24c8e9309043cba4861 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 16 Aug 2021 16:58:00 -0500 Subject: [PATCH 070/674] MQE-2729: [PHP 8] Investigate and fix code related to changes in implode() - add 'match' as reserved word to static tests --- .../Magento/Sniffs/NamingConventions/ReservedWordsSniff.php | 1 + 1 file changed, 1 insertion(+) diff --git a/dev/tests/static/Magento/Sniffs/NamingConventions/ReservedWordsSniff.php b/dev/tests/static/Magento/Sniffs/NamingConventions/ReservedWordsSniff.php index f41c235a6..7d1957195 100644 --- a/dev/tests/static/Magento/Sniffs/NamingConventions/ReservedWordsSniff.php +++ b/dev/tests/static/Magento/Sniffs/NamingConventions/ReservedWordsSniff.php @@ -32,6 +32,7 @@ class ReservedWordsSniff implements Sniff 'object' => '7', 'mixed' => '7', 'numeric' => '7', + 'match' => '8', ]; /** From 3e453ac900dbbae800cd1ec4b4fbfb2788345b65 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Tue, 17 Aug 2021 10:37:04 -0500 Subject: [PATCH 071/674] MQE-2729: [PHP 8] Investigate and fix code related to changes in implode() - update MFTF phpunit.xml file to follow latest schema --- dev/tests/phpunit.xml | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/dev/tests/phpunit.xml b/dev/tests/phpunit.xml index 1014ec7c3..049977650 100644 --- a/dev/tests/phpunit.xml +++ b/dev/tests/phpunit.xml @@ -1,16 +1,25 @@ + - - + + + + ../../src/Magento/FunctionalTestingFramework/DataGenerator + ../../src/Magento/FunctionalTestingFramework/Page + ../../src/Magento/FunctionalTestingFramework/Suite + ../../src/Magento/FunctionalTestingFramework/Test + ../../src/Magento/FunctionalTestingFramework/Util + + + + + verification @@ -19,16 +28,5 @@ unit - - - ../../src/Magento/FunctionalTestingFramework/DataGenerator - ../../src/Magento/FunctionalTestingFramework/Page - ../../src/Magento/FunctionalTestingFramework/Suite - ../../src/Magento/FunctionalTestingFramework/Test - ../../src/Magento/FunctionalTestingFramework/Util - - - - - + From bbf9b20c1f6a90deaa843b53bdf8793db684f043 Mon Sep 17 00:00:00 2001 From: Karyna Date: Wed, 18 Aug 2021 14:44:12 +0300 Subject: [PATCH 072/674] PHP 8 support - fix code related to changes in CURL --- .../DataTransport/Protocol/CurlTransport.php | 17 ++++++++++++----- .../Extension/TestContextExtension.php | 5 ++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Protocol/CurlTransport.php b/src/Magento/FunctionalTestingFramework/DataTransport/Protocol/CurlTransport.php index a34bad6ce..6d064feb5 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Protocol/CurlTransport.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Protocol/CurlTransport.php @@ -132,18 +132,18 @@ public function write($url, $body = [], $method = CurlInterface::POST, $headers CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_COOKIEFILE => '', - CURLOPT_HTTPHEADER => $headers, + CURLOPT_HTTPHEADER => is_object($headers) ? (array) $headers : $headers, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, ]; switch ($method) { case CurlInterface::POST: $options[CURLOPT_POST] = true; - $options[CURLOPT_POSTFIELDS] = $body; + $options[CURLOPT_POSTFIELDS] = is_object($body) ? (array) $body : $body; break; case CurlInterface::PUT: $options[CURLOPT_CUSTOMREQUEST] = self::PUT; - $options[CURLOPT_POSTFIELDS] = $body; + $options[CURLOPT_POSTFIELDS] = is_object($body) ? (array) $body : $body; break; case CurlInterface::DELETE: $options[CURLOPT_CUSTOMREQUEST] = self::DELETE; @@ -189,7 +189,10 @@ public function read($successRegex = null, $returnRegex = null, $returnIndex = n */ public function close() { - curl_close($this->getResource()); + if (version_compare(PHP_VERSION, '8.0') < 0) { + // this function no longer has an effect in PHP 8.0, but it's required in earlier versions + curl_close($this->getResource()); + } $this->resource = null; } @@ -271,7 +274,11 @@ public function multiRequest(array $urls, array $options = []) $result[$key] = curl_multi_getcontent($handle); curl_multi_remove_handle($multiHandle, $handle); } - curl_multi_close($multiHandle); + if (version_compare(PHP_VERSION, '8.0') < 0) { + // this function no longer has an effect in PHP 8.0, but it's required in earlier versions + curl_multi_close($multiHandle); + } + return $result; } diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index e4f433a2a..bc3777c4c 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -72,7 +72,10 @@ public function testStart(\Codeception\Event\TestEvent $e) CURLOPT_URL => getenv('MAGENTO_BASE_URL') . "/test.php?test=" . $this->currentTest, ]); curl_exec($cURLConnection); - curl_close($cURLConnection); + if (version_compare(PHP_VERSION, '8.0') < 0) { + // this function no longer has an effect in PHP 8.0, but it's required in earlier versions + curl_close($cURLConnection); + } } PersistedObjectHandler::getInstance()->clearHookObjects(); From f884ba807b1995c7af3cb3d7f910e98c27d7eac0 Mon Sep 17 00:00:00 2001 From: Andrii Beziazychnyi Date: Wed, 18 Aug 2021 15:38:25 +0300 Subject: [PATCH 073/674] The `squizlabs/php_codesniffer` composer dependency has been updated to 3.6.0 --- composer.json | 2 +- composer.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 337c0519b..4a29f72e3 100755 --- a/composer.json +++ b/composer.json @@ -45,7 +45,7 @@ "phpmd/phpmd": "^2.8.0", "phpunit/phpunit": "^9.0", "sebastian/phpcpd": "~6.0.0", - "squizlabs/php_codesniffer": "~3.5.4" + "squizlabs/php_codesniffer": "~3.6.0" }, "autoload": { "files": ["src/Magento/FunctionalTestingFramework/_bootstrap.php"], diff --git a/composer.lock b/composer.lock index 2ab461e57..f12838d3b 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": "cb8347aab3be241fe1517983f3fc044c", + "content-hash": "56d4fb53d9dbda3444499d2fce97e9fc", "packages": [ { "name": "allure-framework/allure-codeception", @@ -8001,16 +8001,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.5.8", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "9d583721a7157ee997f235f327de038e7ea6dac4" + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/9d583721a7157ee997f235f327de038e7ea6dac4", - "reference": "9d583721a7157ee997f235f327de038e7ea6dac4", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", "shasum": "" }, "require": { @@ -8053,7 +8053,7 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2020-10-23T02:01:07+00:00" + "time": "2021-04-09T00:54:41+00:00" }, { "name": "symfony/config", From 860a39e280091930e8110e1711e333054330ebaa Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Wed, 18 Aug 2021 17:39:18 +0300 Subject: [PATCH 074/674] MFTF-33782: Made NULL value equal to the default argument value --- .../Util/Path/FilePathFormatterTest.php | 39 ++++++++++++------- .../Util/Path/UrlFormatterTest.php | 27 ++++++++----- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/FilePathFormatterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/FilePathFormatterTest.php index 34365ac5d..c833fc6be 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/FilePathFormatterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/FilePathFormatterTest.php @@ -16,21 +16,29 @@ class FilePathFormatterTest extends MagentoTestCase /** * Test file format. * - * @param string $path - * @param bool $withTrailingSeparator + * @param string $path + * @param bool|null $withTrailingSeparator * @param string|null $expectedPath * * @return void * @throws TestFrameworkException * @dataProvider formatDataProvider */ - public function testFormat(string $path, bool $withTrailingSeparator, ?string $expectedPath): void + public function testFormat(string $path, ?bool $withTrailingSeparator, ?string $expectedPath): void { if (null !== $expectedPath) { + if ($withTrailingSeparator === null) { + $this->assertEquals($expectedPath, FilePathFormatter::format($path)); + return; + } $this->assertEquals($expectedPath, FilePathFormatter::format($path, $withTrailingSeparator)); } else { // Assert no exception - FilePathFormatter::format($path, $withTrailingSeparator); + if ($withTrailingSeparator === null) { + FilePathFormatter::format($path); + } else { + FilePathFormatter::format($path, $withTrailingSeparator); + } $this->assertTrue(true); } } @@ -38,17 +46,22 @@ public function testFormat(string $path, bool $withTrailingSeparator, ?string $e /** * Test file format with exception. * - * @param string $path - * @param bool $withTrailingSeparator + * @param string $path + * @param bool|null $withTrailingSeparator * * @return void * @throws TestFrameworkException * @dataProvider formatExceptionDataProvider */ - public function testFormatWithException(string $path, bool $withTrailingSeparator): void + public function testFormatWithException(string $path, ?bool $withTrailingSeparator): void { $this->expectException(TestFrameworkException::class); $this->expectExceptionMessage("Invalid or non-existing file: $path\n"); + + if ($withTrailingSeparator === null) { + FilePathFormatter::format($path); + return; + } FilePathFormatter::format($path, $withTrailingSeparator); } @@ -63,14 +76,14 @@ public function formatDataProvider(): array $path2 = $path1 . DIRECTORY_SEPARATOR; return [ - [$path1, false, $path1], + [$path1, null, $path2], [$path1, false, $path1], [$path1, true, $path2], - [$path2, false, $path1], + [$path2, null, $path2], [$path2, false, $path1], [$path2, true, $path2], - [__DIR__. DIRECTORY_SEPARATOR . basename(__FILE__), false, __FILE__], - ['', false, null] // Empty string is valid + [__DIR__ . DIRECTORY_SEPARATOR . basename(__FILE__), null, __FILE__ . DIRECTORY_SEPARATOR], + ['', null, null] // Empty string is valid ]; } @@ -82,8 +95,8 @@ public function formatDataProvider(): array public function formatExceptionDataProvider(): array { return [ - ['abc', false], - ['X://some\dir/@', false] + ['abc', null], + ['X://some\dir/@', null] ]; } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/UrlFormatterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/UrlFormatterTest.php index dcb076b91..21cfa9daa 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/UrlFormatterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/UrlFormatterTest.php @@ -17,14 +17,18 @@ class UrlFormatterTest extends MagentoTestCase * Test url format. * * @param string $path - * @param bool $withTrailingSeparator + * @param bool|null $withTrailingSeparator * @param string $expectedPath * * @return void * @dataProvider formatDataProvider */ - public function testFormat(string $path, bool $withTrailingSeparator, string $expectedPath): void + public function testFormat(string $path, ?bool $withTrailingSeparator, string $expectedPath): void { + if ($withTrailingSeparator === null) { + $this->assertEquals($expectedPath, UrlFormatter::format($path)); + return; + } $this->assertEquals($expectedPath, UrlFormatter::format($path, $withTrailingSeparator)); } @@ -32,15 +36,20 @@ public function testFormat(string $path, bool $withTrailingSeparator, string $ex * Test url format with exception. * * @param string $path - * @param bool $withTrailingSeparator + * @param bool|null $withTrailingSeparator * * @return void * @dataProvider formatExceptionDataProvider */ - public function testFormatWithException(string $path, bool $withTrailingSeparator): void + public function testFormatWithException(string $path, ?bool $withTrailingSeparator): void { $this->expectException(TestFrameworkException::class); $this->expectExceptionMessage("Invalid url: $path\n"); + + if ($withTrailingSeparator === null) { + UrlFormatter::format($path); + return; + } UrlFormatter::format($path, $withTrailingSeparator); } @@ -62,16 +71,16 @@ public function formatDataProvider(): array $url9 = 'http://www.google.com'; return [ - [$url1, false, $url1], + [$url1, null, $url2], [$url1, false, $url1], [$url1, true, $url2], - [$url2, false, $url1], + [$url2, null, $url2], [$url2, false, $url1], [$url2, true, $url2], - [$url3, false, $url3], + [$url3, null, $url4], [$url3, false, $url3], [$url3, true, $url4], - [$url4, false, $url3], + [$url4, null, $url4], [$url4, false, $url3], [$url4, true, $url4], [$url5, true, $url6], @@ -91,7 +100,7 @@ public function formatDataProvider(): array public function formatExceptionDataProvider(): array { return [ - ['', false] + ['', null] ]; } } From a08684a1af36903d1ef2ca28cf897d6168502246 Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Wed, 18 Aug 2021 09:55:09 -0500 Subject: [PATCH 075/674] MQE-2721: [PHP 8] Remove usage of reserved keyword "match" --- .../FunctionalTestingFramework/Config/Dom/ArrayNodeConfig.php | 4 ++-- .../Config/Dom/NodeMergingConfig.php | 2 +- .../FunctionalTestingFramework/Config/Dom/NodePathMatcher.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Config/Dom/ArrayNodeConfig.php b/src/Magento/FunctionalTestingFramework/Config/Dom/ArrayNodeConfig.php index 5f03450dc..d224bb882 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Dom/ArrayNodeConfig.php +++ b/src/Magento/FunctionalTestingFramework/Config/Dom/ArrayNodeConfig.php @@ -64,7 +64,7 @@ public function __construct( public function isNumericArray($nodeXpath) { foreach ($this->numericArrays as $pathPattern) { - if ($this->nodePathMatcher->match($pathPattern, $nodeXpath)) { + if ($this->nodePathMatcher->pathMatch($pathPattern, $nodeXpath)) { return true; } } @@ -84,7 +84,7 @@ public function getAssocArrayKeyAttribute($nodeXpath) } foreach ($this->assocArrays as $pathPattern => $keyAttribute) { - if ($this->nodePathMatcher->match($pathPattern, $nodeXpath)) { + if ($this->nodePathMatcher->pathMatch($pathPattern, $nodeXpath)) { return $keyAttribute; } } diff --git a/src/Magento/FunctionalTestingFramework/Config/Dom/NodeMergingConfig.php b/src/Magento/FunctionalTestingFramework/Config/Dom/NodeMergingConfig.php index e4231c8ec..f02b1dc5c 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Dom/NodeMergingConfig.php +++ b/src/Magento/FunctionalTestingFramework/Config/Dom/NodeMergingConfig.php @@ -44,7 +44,7 @@ public function __construct(NodePathMatcher $nodePathMatcher, array $idAttribute public function getIdAttribute($nodeXpath) { foreach ($this->idAttributes as $pathPattern => $idAttribute) { - if ($this->nodePathMatcher->match($pathPattern, $nodeXpath)) { + if ($this->nodePathMatcher->pathMatch($pathPattern, $nodeXpath)) { return $idAttribute; } } diff --git a/src/Magento/FunctionalTestingFramework/Config/Dom/NodePathMatcher.php b/src/Magento/FunctionalTestingFramework/Config/Dom/NodePathMatcher.php index 2857bbea6..b7c3f9185 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Dom/NodePathMatcher.php +++ b/src/Magento/FunctionalTestingFramework/Config/Dom/NodePathMatcher.php @@ -17,7 +17,7 @@ class NodePathMatcher * @param string $xpathSubject Example: '/some[@attr="value"]/static/ns:path'. * @return boolean */ - public function match($pathPattern, $xpathSubject) + public function pathMatch($pathPattern, $xpathSubject) { $pathSubject = $this->simplifyXpath($xpathSubject); $pathPattern = '#^' . $pathPattern . '$#'; From c817aeaac98f1a3924ea8f9aa5621386e002344c Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Thu, 19 Aug 2021 15:35:29 +0300 Subject: [PATCH 076/674] MFTF-33780: Changed loose comparisons into strict --- .../NamingConventions/InterfaceNameSniff.php | 6 ++--- .../OperationDataArrayResolverTest.php | 4 ++-- .../Suite/Handlers/SuiteObjectHandlerTest.php | 4 ++-- .../Suite/SuiteGeneratorTest.php | 6 ++--- .../Test/Objects/ActionGroupObjectTest.php | 10 ++++---- dev/tests/unit/Util/SuiteDataArrayBuilder.php | 4 ++-- dev/tests/unit/Util/TestDataArrayBuilder.php | 12 +++++----- dev/tests/unit/Util/TestLoggingUtil.php | 2 +- .../Tests/ResilientGenerationTest.php | 6 ++--- etc/config/command.php | 4 ++-- .../Allure/Adapter/MagentoAllureAdapter.php | 8 +++---- .../Allure/AllureHelper.php | 2 +- .../Codeception/Subscriber/Console.php | 4 ++-- .../Composer/ComposerInstall.php | 4 ++-- .../Composer/ComposerPackage.php | 2 +- .../Config/Converter.php | 10 ++++---- .../Config/Converter/Dom/Flat.php | 8 +++---- .../FunctionalTestingFramework/Config/Dom.php | 4 ++-- .../Config/MftfApplicationConfig.php | 4 ++-- .../Config/Reader/Filesystem.php | 2 +- .../Config/Reader/MftfFilesystem.php | 4 ++-- .../Config/ValidationState.php | 2 +- .../Console/DoctorCommand.php | 2 +- .../Console/GenerateDevUrnCommand.php | 4 ++-- .../Console/GenerateTestsCommand.php | 3 ++- .../Console/RunManifestCommand.php | 2 +- .../Console/RunTestCommand.php | 4 ++-- .../Console/RunTestFailedCommand.php | 6 ++--- .../Console/RunTestGroupCommand.php | 4 ++-- .../Data/Argument/Interpreter/ArrayType.php | 2 +- .../DataGenerator/Config/Dom.php | 2 +- .../Handlers/CredentialStore.php | 8 +++---- .../Handlers/DataObjectHandler.php | 4 ++-- .../Handlers/PersistedObjectHandler.php | 10 ++++---- .../Objects/EntityDataObject.php | 12 +++++----- .../Objects/OperationDefinitionObject.php | 2 +- .../Persist/OperationDataArrayResolver.php | 18 +++++++------- .../DataGenerator/Util/DataExtensionUtil.php | 2 +- .../DataTransport/WebApiExecutor.php | 2 +- .../Extension/TestContextExtension.php | 8 +++---- .../Module/MagentoAssert.php | 2 +- .../Module/MagentoWebDriver.php | 8 +++---- .../ObjectManager/Config/Mapper/Dom.php | 8 +++---- .../ObjectManager/Factory.php | 6 +++-- .../Factory/Dynamic/Developer.php | 3 ++- .../Page/Handlers/PageObjectHandler.php | 2 +- .../Page/Objects/ElementObject.php | 8 +++---- .../StaticCheck/AnnotationsCheck.php | 4 ++-- .../StaticCheck/TestDependencyCheck.php | 4 ++-- .../Suite/Generators/GroupClassGenerator.php | 6 ++--- .../Suite/Handlers/SuiteObjectHandler.php | 2 +- .../Suite/SuiteGenerator.php | 4 ++-- .../Suite/Util/SuiteObjectExtractor.php | 13 +++++----- .../Test/Config/Converter/Dom/Flat.php | 12 +++++----- .../Test/Config/Dom.php | 2 +- .../Handlers/ActionGroupObjectHandler.php | 4 ++-- .../Test/Handlers/TestObjectHandler.php | 8 +++---- .../Test/Objects/ActionGroupObject.php | 4 ++-- .../Test/Objects/ActionObject.php | 24 +++++++++---------- .../Test/Objects/TestObject.php | 2 +- .../Test/Util/ActionMergeUtil.php | 4 ++-- .../Test/Util/ActionObjectExtractor.php | 11 +++++---- .../Test/Util/AnnotationExtractor.php | 12 +++++----- .../Test/Util/ObjectExtensionUtil.php | 4 ++-- .../Upgrade/UpdateAssertionSchema.php | 14 +++++------ .../Util/ComposerModuleResolver.php | 4 ++-- .../Util/ConfigSanitizerUtil.php | 8 +++---- .../Util/Logger/LoggingUtil.php | 2 +- .../Util/ModulePathExtractor.php | 4 ++-- .../Util/ModuleResolver.php | 8 +++---- .../ModuleResolver/ModuleResolverService.php | 4 ++-- .../Util/Script/ScriptUtil.php | 2 +- .../Util/Sorter/ParallelGroupSorter.php | 14 +++++------ .../Util/TestGenerator.php | 22 ++++++++--------- .../DuplicateNodeValidationUtil.php | 4 ++-- .../SingleNodePerFileValidationUtil.php | 2 +- 76 files changed, 229 insertions(+), 223 deletions(-) diff --git a/dev/tests/static/Magento/Sniffs/NamingConventions/InterfaceNameSniff.php b/dev/tests/static/Magento/Sniffs/NamingConventions/InterfaceNameSniff.php index 1618beb66..4c8461bea 100644 --- a/dev/tests/static/Magento/Sniffs/NamingConventions/InterfaceNameSniff.php +++ b/dev/tests/static/Magento/Sniffs/NamingConventions/InterfaceNameSniff.php @@ -29,9 +29,9 @@ public function process(File $sourceFile, $stackPtr) $declarationLine = $tokens[$stackPtr]['line']; $suffixLength = strlen(self::INTERFACE_SUFFIX); // Find first T_STRING after 'interface' keyword in the line and verify it - while ($tokens[$stackPtr]['line'] == $declarationLine) { - if ($tokens[$stackPtr]['type'] == 'T_STRING') { - if (substr($tokens[$stackPtr]['content'], 0 - $suffixLength) != self::INTERFACE_SUFFIX) { + while ($tokens[$stackPtr]['line'] === $declarationLine) { + if ($tokens[$stackPtr]['type'] === 'T_STRING') { + if (substr($tokens[$stackPtr]['content'], 0 - $suffixLength) !== self::INTERFACE_SUFFIX) { $sourceFile->addError( 'Interface should have name that ends with "Interface" suffix.', $stackPtr, diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php index db043f860..ce1911fd0 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php @@ -306,7 +306,7 @@ public function testNestedMetadataArrayOfValue(): void $callback = function ($name) { $entityDataObjectBuilder = new EntityDataObjectBuilder(); - if ($name == 'childObject1') { + if ($name === 'childObject1') { return $entityDataObjectBuilder ->withName('childObject1') ->withType('childType') @@ -314,7 +314,7 @@ public function testNestedMetadataArrayOfValue(): void ->build(); }; - if ($name == 'childObject2') { + if ($name === 'childObject2') { return $entityDataObjectBuilder ->withName('childObject2') ->withType('childType') diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php index c672d20b7..373e0d6c1 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php @@ -113,11 +113,11 @@ private function setMockTestAndSuiteParserOutput(array $testData, array $suiteDa ->will( $this->returnCallback( function ($clazz) use ($mockDataParser, $mockSuiteDataParser) { - if ($clazz == TestDataParser::class) { + if ($clazz === TestDataParser::class) { return $mockDataParser; } - if ($clazz == SuiteDataParser::class) { + if ($clazz === SuiteDataParser::class) { return $mockSuiteDataParser; } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php index 15d6b4a5f..f6e215a5b 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php @@ -347,13 +347,13 @@ function ( $mockGroupClass, $objectManager ) { - if ($class == TestDataParser::class) { + if ($class === TestDataParser::class) { return $mockDataParser; } - if ($class == SuiteDataParser::class) { + if ($class === SuiteDataParser::class) { return $mockSuiteDataParser; } - if ($class == GroupClassGenerator::class) { + if ($class === GroupClassGenerator::class) { return $mockGroupClass; } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php index 60e97e79c..a6df01937 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php @@ -61,7 +61,7 @@ public function testGetStepsWithDefaultCase(): void public function testGetStepsWithCustomArgs(): void { $this->setEntityObjectHandlerReturn(function ($entityName) { - if ($entityName == "data2") { + if ($entityName === 'data2') { return (new EntityDataObjectBuilder())->withDataFields(['field2' => 'testValue2'])->build(); } }); @@ -128,7 +128,7 @@ public function testGetStepsWithPersistedArgs(): void public function testGetStepsWithNoFieldArg(): void { $this->setEntityObjectHandlerReturn(function ($entityName) { - if ($entityName == "data2") { + if ($entityName === 'data2') { return (new EntityDataObjectBuilder())->withDataFields(['field2' => 'testValue2'])->build(); } }); @@ -151,7 +151,7 @@ public function testGetStepsWithNoFieldArg(): void public function testGetStepsWithNoArgs(): void { $this->setEntityObjectHandlerReturn(function ($entityName) { - if ($entityName == "data1") { + if ($entityName === 'data1') { return (new EntityDataObjectBuilder())->withDataFields(['field1' => 'testValue'])->build(); } }); @@ -174,7 +174,7 @@ public function testGetStepsWithParameterizedArg(): void { // Mock Entity Object Handler $this->setEntityObjectHandlerReturn(function ($entityName) { - if ($entityName == "data2") { + if ($entityName === 'data2') { return (new EntityDataObjectBuilder())->withDataFields(['field2' => 'testValue2'])->build(); } }); @@ -216,7 +216,7 @@ public function testGetStepsWithParameterizedSimpleArg(): void { // Mock Entity Object Handler $this->setEntityObjectHandlerReturn(function ($entityName) { - if ($entityName == "data2") { + if ($entityName === 'data2') { return (new EntityDataObjectBuilder())->withDataFields(['field2' => 'testValue2'])->build(); } }); diff --git a/dev/tests/unit/Util/SuiteDataArrayBuilder.php b/dev/tests/unit/Util/SuiteDataArrayBuilder.php index 85411b447..9f937707a 100644 --- a/dev/tests/unit/Util/SuiteDataArrayBuilder.php +++ b/dev/tests/unit/Util/SuiteDataArrayBuilder.php @@ -181,7 +181,7 @@ private function appendEntriesToSuiteContents($currentContents, $type, $contents */ public function withAfterHook($afterHook = null) { - if ($afterHook == null) { + if ($afterHook === null) { $this->afterHook = [$this->testActionAfterName => [ ActionObjectExtractor::NODE_NAME => $this->testActionType, ActionObjectExtractor::TEST_STEP_MERGE_KEY => $this->testActionAfterName @@ -202,7 +202,7 @@ public function withAfterHook($afterHook = null) */ public function withBeforeHook($beforeHook = null) { - if ($beforeHook == null) { + if ($beforeHook === null) { $this->beforeHook = [$this->testActionBeforeName => [ ActionObjectExtractor::NODE_NAME => $this->testActionType, ActionObjectExtractor::TEST_STEP_MERGE_KEY => $this->testActionBeforeName diff --git a/dev/tests/unit/Util/TestDataArrayBuilder.php b/dev/tests/unit/Util/TestDataArrayBuilder.php index e40d80e83..0a9672dd7 100644 --- a/dev/tests/unit/Util/TestDataArrayBuilder.php +++ b/dev/tests/unit/Util/TestDataArrayBuilder.php @@ -109,7 +109,7 @@ public function withName($name) */ public function withAnnotations($annotations = null) { - if ($annotations == null) { + if ($annotations === null) { $this->annotations = ['group' => [['value' => 'test']]]; } else { $this->annotations = $annotations; @@ -126,7 +126,7 @@ public function withAnnotations($annotations = null) */ public function withBeforeHook($beforeHook = null) { - if ($beforeHook == null) { + if ($beforeHook === null) { $this->beforeHook = [$this->testActionBeforeName => [ ActionObjectExtractor::NODE_NAME => $this->testActionType, ActionObjectExtractor::TEST_STEP_MERGE_KEY => $this->testActionBeforeName @@ -146,7 +146,7 @@ public function withBeforeHook($beforeHook = null) */ public function withAfterHook($afterHook = null) { - if ($afterHook == null) { + if ($afterHook === null) { $this->afterHook = [$this->testActionAfterName => [ ActionObjectExtractor::NODE_NAME => $this->testActionType, ActionObjectExtractor::TEST_STEP_MERGE_KEY => $this->testActionAfterName @@ -167,7 +167,7 @@ public function withAfterHook($afterHook = null) */ public function withFailedHook($failedHook = null) { - if ($failedHook == null) { + if ($failedHook === null) { $this->failedHook = [$this->testActionFailedName => [ ActionObjectExtractor::NODE_NAME => $this->testActionType, ActionObjectExtractor::TEST_STEP_MERGE_KEY => $this->testActionFailedName @@ -188,7 +188,7 @@ public function withFailedHook($failedHook = null) */ public function withTestActions($actions = null) { - if ($actions == null) { + if ($actions === null) { $this->testActions = [$this->testTestActionName => [ ActionObjectExtractor::NODE_NAME => $this->testActionType, ActionObjectExtractor::TEST_STEP_MERGE_KEY => $this->testTestActionName @@ -207,7 +207,7 @@ public function withTestActions($actions = null) */ public function withFileName($filename = null) { - if ($filename == null) { + if ($filename === null) { $this->filename = "/magento2-functional-testing-framework/dev/tests/verification/TestModule/Test/BasicFunctionalTest.xml"; } else { diff --git a/dev/tests/unit/Util/TestLoggingUtil.php b/dev/tests/unit/Util/TestLoggingUtil.php index f275a5c97..ed29f091c 100644 --- a/dev/tests/unit/Util/TestLoggingUtil.php +++ b/dev/tests/unit/Util/TestLoggingUtil.php @@ -40,7 +40,7 @@ private function __construct() */ public static function getInstance(): TestLoggingUtil { - if (self::$instance == null) { + if (self::$instance === null) { self::$instance = new TestLoggingUtil(); } return self::$instance; diff --git a/dev/tests/verification/Tests/ResilientGenerationTest.php b/dev/tests/verification/Tests/ResilientGenerationTest.php index bf65094e3..cbd032ed2 100644 --- a/dev/tests/verification/Tests/ResilientGenerationTest.php +++ b/dev/tests/verification/Tests/ResilientGenerationTest.php @@ -123,7 +123,7 @@ public function testGenerateAllSuites() SuiteGenerator::getInstance()->generateAllSuites($testManifest); foreach (SuiteTestReferences::$data as $groupName => $expectedContents) { - if (substr($groupName, 0, 11) != 'NotGenerate') { + if (substr($groupName, 0, 11) !== 'NotGenerate') { // Validate Yaml file updated $yml = Yaml::parse(file_get_contents(self::CONFIG_YML_FILE)); $this->assertArrayHasKey($groupName, $yml['groups']); @@ -175,7 +175,7 @@ function () use ($groupName) { ); } - if (substr($groupName, 0, 11) != 'NotGenerate') { + if (substr($groupName, 0, 11) !== 'NotGenerate') { // Validate Yaml file updated $yml = Yaml::parse(file_get_contents(self::CONFIG_YML_FILE)); $this->assertArrayHasKey($groupName, $yml['groups']); @@ -199,7 +199,7 @@ function () use ($groupName) { } // Validate log message - if (substr($groupName, 0, 11) != 'NotGenerate' + if (substr($groupName, 0, 11) !== 'NotGenerate' && !in_array($groupName, array_keys(self::$exceptionGrpLogs))) { $type = 'info'; $message = '/suite generated/'; diff --git a/etc/config/command.php b/etc/config/command.php index e3b8f1191..72c6f1a42 100644 --- a/etc/config/command.php +++ b/etc/config/command.php @@ -18,7 +18,7 @@ // Token returned will be null if the token we passed in is invalid $tokenFromMagento = $tokenModel->loadByToken($tokenPassedIn)->getToken(); - if (!empty($tokenFromMagento) && ($tokenFromMagento == $tokenPassedIn)) { + if (!empty($tokenFromMagento) && ($tokenFromMagento === $tokenPassedIn)) { $php = PHP_BINDIR ? PHP_BINDIR . '/php' : 'php'; $magentoBinary = $php . ' -f ../../../../bin/magento'; $valid = validateCommand($magentoBinary, $command); @@ -52,7 +52,7 @@ $exitCode = $process->getExitCode(); - if ($exitCode == 0 || $idleTimeout) { + if ($process->isSuccessful() || $idleTimeout) { http_response_code(202); } else { http_response_code(500); diff --git a/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php b/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php index 7d7a7bd44..d5efbbc0f 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php +++ b/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php @@ -63,7 +63,7 @@ class MagentoAllureAdapter extends AllureCodeception */ private function getGroup() { - if ($this->options['groups'] != null) { + if ($this->options['groups'] !== null) { return $this->options['groups'][0]; } return null; @@ -79,7 +79,7 @@ public function suiteBefore(SuiteEvent $suiteEvent) { $changeSuiteEvent = $suiteEvent; - if ($this->getGroup() != null) { + if ($this->getGroup() !== null) { $suite = $suiteEvent->getSuite(); $suiteName = ($suite->getName()) . "\\" . $this->sanitizeGroupName($this->getGroup()); @@ -414,8 +414,8 @@ private function removeAttachments($step, $testFailed) private function formatAllureTestClassName($test) { if ($this->getGroup() !== null) { - foreach ($test->getLabels() as $name => $label) { - if ($label->getName() == 'testClass') { + foreach ($test->getLabels() as $label) { + if ($label->getName() === 'testClass') { $originalTestClass = $this->sanitizeTestClassLabel($label->getValue()); call_user_func(\Closure::bind( function () use ($label, $originalTestClass) { diff --git a/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php b/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php index 4fbd65eb7..cc0251a48 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php +++ b/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php @@ -50,7 +50,7 @@ public static function addAttachmentToLastStep($data, $caption): void $rootStep = Allure::lifecycle()->getStepStorage()->getLast(); $trueLastStep = array_last($rootStep->getSteps()); - if ($trueLastStep == null) { + if ($trueLastStep === null) { // Nothing to attach to; do not fire off allure event return; } diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php b/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php index 90f04abae..c6c6a4eec 100644 --- a/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php +++ b/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php @@ -119,7 +119,7 @@ public function beforeStep(StepEvent $e) } $metaStep = $e->getStep()->getMetaStep(); - if ($metaStep and $this->metaStep != $metaStep) { + if ($metaStep and $this->metaStep !== $metaStep) { $this->message(' ' . $metaStep->getPrefix()) ->style('bold') ->append($metaStep->__toString()) @@ -158,7 +158,7 @@ public function afterStep(StepEvent $e) */ private function printStepKeys(Step $step) { - if ($step instanceof Comment and $step->__toString() == '') { + if ($step instanceof Comment and $step->__toString() === '') { return; // don't print empty comments } diff --git a/src/Magento/FunctionalTestingFramework/Composer/ComposerInstall.php b/src/Magento/FunctionalTestingFramework/Composer/ComposerInstall.php index f10c0b418..151fdc86e 100644 --- a/src/Magento/FunctionalTestingFramework/Composer/ComposerInstall.php +++ b/src/Magento/FunctionalTestingFramework/Composer/ComposerInstall.php @@ -50,7 +50,7 @@ public function isInstalledPackageOfType($packageName, $packageType) { /** @var CompletePackageInterface $package */ foreach ($this->getLocker()->getLockedRepository()->getPackages() as $package) { - if (($package->getName() == $packageName) && ($package->getType() == $packageType)) { + if (($package->getName() === $packageName) && ($package->getType() === $packageType)) { return true; } } @@ -67,7 +67,7 @@ public function getInstalledTestPackages() $packages = []; /** @var CompletePackageInterface $package */ foreach ($this->getLocker()->getLockedRepository()->getPackages() as $package) { - if ($package->getType() == self::TEST_MODULE_PACKAGE_TYPE) { + if ($package->getType() === self::TEST_MODULE_PACKAGE_TYPE) { $packages[$package->getName()] = [ self::PACKAGE_NAME => $package->getName(), self::PACKAGE_TYPE => $package->getType(), diff --git a/src/Magento/FunctionalTestingFramework/Composer/ComposerPackage.php b/src/Magento/FunctionalTestingFramework/Composer/ComposerPackage.php index 0a6bfdca2..5e2d21c15 100644 --- a/src/Magento/FunctionalTestingFramework/Composer/ComposerPackage.php +++ b/src/Magento/FunctionalTestingFramework/Composer/ComposerPackage.php @@ -116,7 +116,7 @@ public function getSuggestedMagentoModules() */ public function isMftfTestPackage() { - return ($this->getType() == self::TEST_MODULE_PACKAGE_TYPE) ? true : false; + return $this->getType() === self::TEST_MODULE_PACKAGE_TYPE; } /** diff --git a/src/Magento/FunctionalTestingFramework/Config/Converter.php b/src/Magento/FunctionalTestingFramework/Config/Converter.php index cf61805dc..14b96907e 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Converter.php +++ b/src/Magento/FunctionalTestingFramework/Config/Converter.php @@ -91,7 +91,7 @@ protected function convertXml($elements) foreach ($elements as $element) { if ($element instanceof \DOMElement) { - if ($element->getAttribute('remove') == 'true') { + if ($element->getAttribute('remove') === 'true') { // Remove element continue; } @@ -119,7 +119,7 @@ protected function convertXml($elements) } elseif (!empty($elementData)) { $result[$element->nodeName][] = $elementData; } - } elseif ($element->nodeType == XML_TEXT_NODE && trim($element->nodeValue) != '') { + } elseif ($element->nodeType === XML_TEXT_NODE && trim($element->nodeValue) !== '') { return ['value' => $element->nodeValue]; } } @@ -156,9 +156,9 @@ protected function getElementKey(\DOMElement $element) protected function isKeyAttribute(\DOMElement $element, \DOMAttr $attribute) { if (isset($this->idAttributes[$element->nodeName])) { - return $attribute->name == $this->idAttributes[$element->nodeName]; + return $attribute->name === $this->idAttributes[$element->nodeName]; } else { - return $attribute->name == self::NAME_ATTRIBUTE; + return $attribute->name === self::NAME_ATTRIBUTE; } } @@ -174,7 +174,7 @@ protected function getAttributes(\DOMElement $element) if ($element->hasAttributes()) { /** @var \DomAttr $attribute */ foreach ($element->attributes as $attribute) { - if (trim($attribute->nodeValue) != '' && !$this->isKeyAttribute($element, $attribute)) { + if (trim($attribute->nodeValue) !== '' && !$this->isKeyAttribute($element, $attribute)) { $attributes[$attribute->nodeName] = $this->castNumeric($attribute->nodeValue); } } diff --git a/src/Magento/FunctionalTestingFramework/Config/Converter/Dom/Flat.php b/src/Magento/FunctionalTestingFramework/Config/Converter/Dom/Flat.php index 001a811d9..742ef64f3 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Converter/Dom/Flat.php +++ b/src/Magento/FunctionalTestingFramework/Config/Converter/Dom/Flat.php @@ -41,7 +41,7 @@ protected function getNodeAttributes(\DOMNode $node) $attributes = $node->attributes ?: []; /** @var \DOMNode $attribute */ foreach ($attributes as $attribute) { - if ($attribute->nodeType == XML_ATTRIBUTE_NODE) { + if ($attribute->nodeType === XML_ATTRIBUTE_NODE) { $result[$attribute->nodeName] = $attribute->nodeValue; } } @@ -77,7 +77,7 @@ public function convert(\DOMNode $source, $basePath = '') $value = []; /** @var \DOMNode $node */ foreach ($source->childNodes as $node) { - if ($node->nodeType == XML_ELEMENT_NODE) { + if ($node->nodeType === XML_ELEMENT_NODE) { $nodeName = $node->nodeName; $nodePath = $basePath . '/' . $nodeName; @@ -107,8 +107,8 @@ public function convert(\DOMNode $source, $basePath = '') } else { $value[$nodeName] = $nodeData; } - } elseif ($node->nodeType == XML_CDATA_SECTION_NODE - || ($node->nodeType == XML_TEXT_NODE && trim($node->nodeValue) != '') + } elseif ($node->nodeType === XML_CDATA_SECTION_NODE + || ($node->nodeType === XML_TEXT_NODE && trim($node->nodeValue) !== '') ) { $value = $node->nodeValue; break; diff --git a/src/Magento/FunctionalTestingFramework/Config/Dom.php b/src/Magento/FunctionalTestingFramework/Config/Dom.php index 881b677dc..91de64ae1 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Dom.php +++ b/src/Magento/FunctionalTestingFramework/Config/Dom.php @@ -207,7 +207,7 @@ protected function replaceNodeValue($parentPath, \DOMElement $node, \DOMElement */ protected function isTextNode($node) { - return $node->childNodes->length == 1 && $node->childNodes->item(0) instanceof \DOMText; + return $node->childNodes->length === 1 && $node->childNodes->item(0) instanceof \DOMText; } /** @@ -273,7 +273,7 @@ protected function getMatchedNode($nodePath) $node = null; if ($matchedNodes->length > 1) { throw new \Exception("More than one node matching the query: {$nodePath}"); - } elseif ($matchedNodes->length == 1) { + } elseif ($matchedNodes->length === 1) { $node = $matchedNodes->item(0); } return $node; diff --git a/src/Magento/FunctionalTestingFramework/Config/MftfApplicationConfig.php b/src/Magento/FunctionalTestingFramework/Config/MftfApplicationConfig.php index 3aad73a06..7685ac919 100644 --- a/src/Magento/FunctionalTestingFramework/Config/MftfApplicationConfig.php +++ b/src/Magento/FunctionalTestingFramework/Config/MftfApplicationConfig.php @@ -135,7 +135,7 @@ public static function create( $allowSkipped = false, $filters = [] ) { - if (self::$MFTF_APPLICATION_CONTEXT == null) { + if (self::$MFTF_APPLICATION_CONTEXT === null) { self::$MFTF_APPLICATION_CONTEXT = new MftfApplicationConfig( $forceGenerate, @@ -159,7 +159,7 @@ public static function getConfig() // TODO explicitly set this with AcceptanceTester or MagentoWebDriver // during execution we cannot guarantee the use of the robofile so we return the default application config, // we don't want to set the application context in case the user explicitly does so at a later time. - if (self::$MFTF_APPLICATION_CONTEXT == null) { + if (self::$MFTF_APPLICATION_CONTEXT === null) { return new MftfApplicationConfig(); } diff --git a/src/Magento/FunctionalTestingFramework/Config/Reader/Filesystem.php b/src/Magento/FunctionalTestingFramework/Config/Reader/Filesystem.php index edf490669..8e36a63d7 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Reader/Filesystem.php +++ b/src/Magento/FunctionalTestingFramework/Config/Reader/Filesystem.php @@ -159,7 +159,7 @@ protected function readFiles($fileList) } else { $configMerger->merge($content); } - if (strcasecmp($debugLevel, MftfApplicationConfig::LEVEL_DEVELOPER) == 0) { + if (strcasecmp($debugLevel, MftfApplicationConfig::LEVEL_DEVELOPER) === 0) { $this->validateSchema($configMerger, $fileList->getFilename()); } } catch (\Magento\FunctionalTestingFramework\Config\Dom\ValidationException $e) { diff --git a/src/Magento/FunctionalTestingFramework/Config/Reader/MftfFilesystem.php b/src/Magento/FunctionalTestingFramework/Config/Reader/MftfFilesystem.php index 3740d683f..88a176a3c 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Reader/MftfFilesystem.php +++ b/src/Magento/FunctionalTestingFramework/Config/Reader/MftfFilesystem.php @@ -42,7 +42,7 @@ public function readFiles($fileList) $configMerger->merge($content, $fileList->getFilename(), $exceptionCollector); } // run per file validation with generate:tests -d - if (strcasecmp($debugLevel, MftfApplicationConfig::LEVEL_DEVELOPER) == 0) { + if (strcasecmp($debugLevel, MftfApplicationConfig::LEVEL_DEVELOPER) === 0) { $this->validateSchema($configMerger, $fileList->getFilename()); } } catch (\Magento\FunctionalTestingFramework\Config\Dom\ValidationException $e) { @@ -52,7 +52,7 @@ public function readFiles($fileList) $exceptionCollector->throwException(); //run validation on merged file with generate:tests - if (strcasecmp($debugLevel, MftfApplicationConfig::LEVEL_DEFAULT) == 0) { + if (strcasecmp($debugLevel, MftfApplicationConfig::LEVEL_DEFAULT) === 0) { $this->validateSchema($configMerger); } diff --git a/src/Magento/FunctionalTestingFramework/Config/ValidationState.php b/src/Magento/FunctionalTestingFramework/Config/ValidationState.php index f08dc141a..d610f428a 100644 --- a/src/Magento/FunctionalTestingFramework/Config/ValidationState.php +++ b/src/Magento/FunctionalTestingFramework/Config/ValidationState.php @@ -37,6 +37,6 @@ public function __construct($appMode) */ public function isValidationRequired() { - return $this->appMode == 'developer'; // @todo + return $this->appMode === 'developer'; // @todo } } diff --git a/src/Magento/FunctionalTestingFramework/Console/DoctorCommand.php b/src/Magento/FunctionalTestingFramework/Console/DoctorCommand.php index aa0c81d57..f48da60d3 100644 --- a/src/Magento/FunctionalTestingFramework/Console/DoctorCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/DoctorCommand.php @@ -190,7 +190,7 @@ private function runMagentoWebDriverDoctor() // Disable MagentoWebDriver to avoid conflicts foreach ($settings['modules']['enabled'] as $index => $module) { - if ($module == $magentoWebDriver) { + if ($module === $magentoWebDriver) { unset($settings['modules']['enabled'][$index]); break; } diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateDevUrnCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateDevUrnCommand.php index bca72421b..034e6f516 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateDevUrnCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateDevUrnCommand.php @@ -61,10 +61,10 @@ protected function execute(InputInterface $input, OutputInterface $output) { $miscXmlFilePath = $input->getArgument(self::IDE_FILE_PATH_ARGUMENT); $miscXmlFile = realpath($miscXmlFilePath); - $force = $input->getOption('force'); + $force = (bool) $input->getOption('force'); if ($miscXmlFile === false) { - if ($force == true) { + if ($force === true) { // create file and refresh realpath $xml = ""; file_put_contents($miscXmlFilePath, $xml); diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index e783415f3..ed3050898 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -231,7 +231,8 @@ private function createTestConfiguration( $message = "Unable to create test object {$test} from test configuration. " . $e->getMessage(); LoggingUtil::getInstance()->getLogger(self::class)->error($message); if (MftfApplicationConfig::getConfig()->verboseEnabled() - && MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::GENERATION_PHASE) { + && MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::GENERATION_PHASE + ) { print($message); } GenerationErrorHandler::getInstance()->addError('test', $test, $message); diff --git a/src/Magento/FunctionalTestingFramework/Console/RunManifestCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunManifestCommand.php index 89b184676..fbabc5282 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunManifestCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunManifestCommand.php @@ -86,7 +86,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int continue; } - if ($line == count($manifestFile) - 1) { + if ($line === count($manifestFile) - 1) { $this->runManifestLine($manifestFile[$line], $output, true); } else { $this->runManifestLine($manifestFile[$line], $output); diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php index fcf04cb3d..096c6794c 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php @@ -156,7 +156,7 @@ private function runTests(array $tests, OutputInterface $output) if ($this->pauseEnabled()) { $fullCommand = $codeceptionCommand . $testsDirectory . $testName . ' --verbose --steps --debug'; - if ($i != count($tests) - 1) { + if ($i !== count($tests) - 1) { $fullCommand .= self::CODECEPT_RUN_OPTION_NO_EXIT; } $this->returnCode = max($this->returnCode, $this->codeceptRunTest($fullCommand, $output)); @@ -195,7 +195,7 @@ private function runTestsInSuite(array $suitesConfig, OutputInterface $output) $index += 1; if ($this->pauseEnabled()) { - if ($index != $count) { + if ($index !== $count) { $fullCommand .= self::CODECEPT_RUN_OPTION_NO_EXIT; } $this->returnCode = max($this->returnCode, $this->codeceptRunTest($fullCommand, $output)); diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index 1652a896d..695be0695 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -108,7 +108,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int for ($i = 0; $i < count($testManifestList); $i++) { if ($this->pauseEnabled()) { $codeceptionCommand = self::CODECEPT_RUN_FUNCTIONAL . $testManifestList[$i] . ' --debug '; - if ($i != count($testManifestList) - 1) { + if ($i !== count($testManifestList) - 1) { $codeceptionCommand .= self::CODECEPT_RUN_OPTION_NO_EXIT; } $returnCode = $this->codeceptRunTest($codeceptionCommand, $output); @@ -161,7 +161,7 @@ private function getFailedTestList() $testName = explode(":", $testInfo[count($testInfo) - 1])[1]; $suiteName = $testInfo[count($testInfo) - 2]; - if ($suiteName == self::DEFAULT_TEST_GROUP) { + if ($suiteName === self::DEFAULT_TEST_GROUP) { array_push($failedTestDetails['tests'], $testName); } else { $suiteName = $this->sanitizeSuiteName($suiteName); @@ -195,7 +195,7 @@ private function getFailedTestList() private function sanitizeSuiteName($suiteName) { $suiteNameArray = explode("_", $suiteName); - if (array_pop($suiteNameArray) == 'G') { + if (array_pop($suiteNameArray) === 'G') { if (is_numeric(array_pop($suiteNameArray))) { $suiteName = implode("_", $suiteNameArray); } diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php index a6302dacd..d9a549627 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php @@ -115,7 +115,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $codeceptionCommandString = $commandString . ' -g ' . $groups[$i]; if ($this->pauseEnabled()) { - if ($i != count($groups) - 1) { + if ($i !== count($groups) - 1) { $codeceptionCommandString .= self::CODECEPT_RUN_OPTION_NO_EXIT; } $returnCodes[] = $this->codeceptRunTest($codeceptionCommandString, $output); @@ -139,7 +139,7 @@ function ($type, $buffer) use ($output) { $this->applyAllFailed(); foreach ($returnCodes as $returnCode) { - if ($returnCode != 0) { + if ($returnCode !== 0) { return $returnCode; } $exitCode = 0; diff --git a/src/Magento/FunctionalTestingFramework/Data/Argument/Interpreter/ArrayType.php b/src/Magento/FunctionalTestingFramework/Data/Argument/Interpreter/ArrayType.php index 566c09912..b292236c6 100644 --- a/src/Magento/FunctionalTestingFramework/Data/Argument/Interpreter/ArrayType.php +++ b/src/Magento/FunctionalTestingFramework/Data/Argument/Interpreter/ArrayType.php @@ -98,7 +98,7 @@ private function compareItems($firstItemKey, $secondItemKey, $indexedItems) $secondValue = intval($secondItem['sortOrder']); } - if ($firstValue == $secondValue) { + if ($firstValue === $secondValue) { // These keys reflect initial relative position of items. // Allows stable sort for items with equal 'sortOrder' return $firstItemKey < $secondItemKey ? -1 : 1; diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Config/Dom.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Config/Dom.php index bc19c35aa..830abe6c9 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Config/Dom.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Config/Dom.php @@ -84,7 +84,7 @@ public function initDom($xml, $filename = null) $itemNodes = $dom->getElementsByTagName('item'); /** @var \DOMElement $itemNode */ foreach ($itemNodes as $itemKey => $itemNode) { - if ($itemNode->hasAttribute("name") == false) { + if ($itemNode->hasAttribute("name") === false) { $itemNode->setAttribute("name", (string)$itemKey); } } diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/CredentialStore.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/CredentialStore.php index 36b2daf41..0347ddaa8 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/CredentialStore.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/CredentialStore.php @@ -58,7 +58,7 @@ class CredentialStore */ public static function getInstance() { - if (self::$INSTANCE == null) { + if (self::$INSTANCE === null) { self::$INSTANCE = new CredentialStore(); } @@ -162,13 +162,13 @@ private function getExceptionContexts() $exceptionMessage = "\n"; foreach ($this->exceptionContexts->getErrors() as $type => $exceptions) { $exceptionMessage .= "\nException from "; - if ($type == self::ARRAY_KEY_FOR_FILE) { + if ($type === self::ARRAY_KEY_FOR_FILE) { $exceptionMessage .= "File Storage: \n"; } - if ($type == self::ARRAY_KEY_FOR_VAULT) { + if ($type === self::ARRAY_KEY_FOR_VAULT) { $exceptionMessage .= "Vault Storage: \n"; } - if ($type == self::ARRAY_KEY_FOR_AWS_SECRETS_MANAGER) { + if ($type === self::ARRAY_KEY_FOR_AWS_SECRETS_MANAGER) { $exceptionMessage .= "AWS Secrets Manager Storage: \n"; } diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php index 87dc6a13d..da7888388 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php @@ -319,8 +319,8 @@ private function processVarElements($entityData) */ private function extendDataObject($dataObject) { - if ($dataObject->getParentName() != null) { - if ($dataObject->getParentName() == $dataObject->getName()) { + if ($dataObject->getParentName() !== null) { + if ($dataObject->getParentName() === $dataObject->getName()) { throw new TestFrameworkException("Mftf Data can not extend from itself: " . $dataObject->getName()); } return $this->extendUtil->extendEntity($dataObject); diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/PersistedObjectHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/PersistedObjectHandler.php index c1f5d8d85..e9f905a6b 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/PersistedObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/PersistedObjectHandler.php @@ -106,9 +106,9 @@ public function createEntity( $persistedObject->createEntity($storeCode); - if ($scope == self::TEST_SCOPE) { + if ($scope === self::TEST_SCOPE) { $this->testObjects[$key] = $persistedObject; - } elseif ($scope == self::HOOK_SCOPE) { + } elseif ($scope === self::HOOK_SCOPE) { $this->hookObjects[$key] = $persistedObject; } else { $this->suiteObjects[$key] = $persistedObject; @@ -170,9 +170,9 @@ public function getEntity($key, $scope, $entity, $dependentObjectKeys = [], $sto ); $persistedObject->getEntity($index, $storeCode); - if ($scope == self::TEST_SCOPE) { + if ($scope === self::TEST_SCOPE) { $this->testObjects[$key] = $persistedObject; - } elseif ($scope == self::HOOK_SCOPE) { + } elseif ($scope === self::HOOK_SCOPE) { $this->hookObjects[$key] = $persistedObject; } else { $this->suiteObjects[$key] = $persistedObject; @@ -214,7 +214,7 @@ private function retrieveEntity($stepKey, $scope) // Assume TEST_SCOPE is default $entityArrays = [$this->testObjects, $this->hookObjects, $this->suiteObjects]; - if ($scope == self::HOOK_SCOPE) { + if ($scope === self::HOOK_SCOPE) { $entityArrays[0] = $this->hookObjects; $entityArrays[1] = $this->testObjects; } diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/EntityDataObject.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/EntityDataObject.php index 2204364f5..817fb6ec4 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/EntityDataObject.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/EntityDataObject.php @@ -233,7 +233,7 @@ private function resolveDataReferences($name, $uniquenessFormat) $this->data[$name_lower], $this->name . '.' . $name ); - if (null === $uniquenessData || $uniquenessFormat == self::NO_UNIQUE_PROCESS) { + if (null === $uniquenessData || $uniquenessFormat === self::NO_UNIQUE_PROCESS) { return $this->data[$name_lower]; } return $this->formatUniqueData($name_lower, $uniquenessData, $uniquenessFormat); @@ -276,7 +276,7 @@ private function formatUniqueData($name, $uniqueData, $uniqueDataFormat) switch ($uniqueDataFormat) { case self::SUITE_UNIQUE_VALUE: $this->checkUniquenessFunctionExists(self::SUITE_UNIQUE_FUNCTION, $uniqueDataFormat); - if ($uniqueData == 'prefix') { + if ($uniqueData === 'prefix') { return msqs($this->getName()) . $this->data[$name]; } else { // $uniData == 'suffix' return $this->data[$name] . msqs($this->getName()); @@ -284,21 +284,21 @@ private function formatUniqueData($name, $uniqueData, $uniqueDataFormat) break; case self::CEST_UNIQUE_VALUE: $this->checkUniquenessFunctionExists(self::CEST_UNIQUE_FUNCTION, $uniqueDataFormat); - if ($uniqueData == 'prefix') { + if ($uniqueData === 'prefix') { return msq($this->getName()) . $this->data[$name]; } else { // $uniqueData == 'suffix' return $this->data[$name] . msq($this->getName()); } break; case self::SUITE_UNIQUE_NOTATION: - if ($uniqueData == 'prefix') { + if ($uniqueData === 'prefix') { return self::SUITE_UNIQUE_FUNCTION . '("' . $this->getName() . '")' . $this->data[$name]; } else { // $uniqueData == 'suffix' return $this->data[$name] . self::SUITE_UNIQUE_FUNCTION . '("' . $this->getName() . '")'; } break; case self::CEST_UNIQUE_NOTATION: - if ($uniqueData == 'prefix') { + if ($uniqueData === 'prefix') { return self::CEST_UNIQUE_FUNCTION . '("' . $this->getName() . '")' . $this->data[$name]; } else { // $uniqueData == 'suffix' return $this->data[$name] . self::CEST_UNIQUE_FUNCTION . '("' . $this->getName() . '")'; @@ -358,7 +358,7 @@ public function getLinkedEntitiesOfType($type) $groupedArray = []; foreach ($this->linkedEntities as $entityName => $entityType) { - if ($entityType == $type) { + if ($entityType === $type) { $groupedArray[] = $entityName; } } diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/OperationDefinitionObject.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/OperationDefinitionObject.php index ef1a7faa5..ff84c0959 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/OperationDefinitionObject.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/OperationDefinitionObject.php @@ -351,7 +351,7 @@ public function addQueryParams() */ public function logDeprecated() { - if ($this->deprecated != null) { + if ($this->deprecated !== null) { LoggingUtil::getInstance()->getLogger(self::class)->deprecation( $message = "The operation {$this->name} is deprecated.", ["operationType" => $this->operation, "deprecatedMessage" => $this->deprecated], diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/OperationDataArrayResolver.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/OperationDataArrayResolver.php index e4dc5f267..431ab5d4e 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/OperationDataArrayResolver.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/OperationDataArrayResolver.php @@ -78,7 +78,7 @@ public function resolveOperationDataArray($entityObject, $operationMetadata, $op self::incrementSequence($entityObject->getName()); foreach ($operationMetadata as $operationElement) { - if ($operationElement->getType() == OperationElementExtractor::OPERATION_OBJECT_OBJ_NAME) { + if ($operationElement->getType() === OperationElementExtractor::OPERATION_OBJECT_OBJ_NAME) { $entityObj = $this->resolveOperationObjectAndEntityData($entityObject, $operationElement->getValue()); if (null === $entityObj && $operationElement->isRequired()) { throw new \Exception(sprintf( @@ -189,13 +189,13 @@ private function resolvePrimitiveReference($entityObject, $operationKey, $operat EntityDataObject::CEST_UNIQUE_VALUE ); - if ($elementData == null && $entityObject->getVarReference($operationKey) != null) { + if ($elementData === null && $entityObject->getVarReference($operationKey) !== null) { list($type, $field) = explode( DataObjectHandler::_SEPARATOR, $entityObject->getVarReference($operationKey) ); - if ($operationElementType == OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY) { + if ($operationElementType === OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY) { $elementDatas = []; $entities = $this->getDependentEntitiesOfType($type); foreach ($entities as $entity) { @@ -224,7 +224,7 @@ private function getDependentEntitiesOfType($type) $entitiesOfType = []; foreach ($this->dependentEntities as $dependentEntity) { - if ($dependentEntity->getType() == $type) { + if ($dependentEntity->getType() === $type) { $entitiesOfType[] = $dependentEntity; } } @@ -244,7 +244,7 @@ private function getDependentEntitiesOfType($type) */ private function resolveOperationObjectAndEntityData($entityObject, $operationElementValue) { - if ($operationElementValue != $entityObject->getType()) { + if ($operationElementValue !== $entityObject->getType()) { // if we have a mismatch attempt to retrieve linked data and return just the last linkage // this enables overwriting of required entity fields $linkName = $entityObject->getLinkedEntitiesOfType($operationElementValue); @@ -275,7 +275,7 @@ private function resolveNonPrimitiveElement($entityName, $operationElement, $ope // in array case if (!is_array($operationElement->getValue()) && !empty($operationElement->getNestedOperationElement($operationElement->getValue())) - && $operationElement->getType() == OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY + && $operationElement->getType() === OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY ) { $operationSubArray = $this->resolveOperationDataArray( $linkedEntityObj, @@ -403,7 +403,7 @@ private function resolvePrimitiveReferenceElement($entityObject, $operationEleme // If data was defined at all, attempt to put it into operation data array // If data was not defined, and element is required, throw exception // If no data is defined, don't input defaults per primitive into operation data array - if ($elementData != null) { + if ($elementData !== null) { if (array_key_exists($operationElement->getKey(), $entityObject->getUniquenessData())) { $uniqueData = $entityObject->getUniquenessDataByName($operationElement->getKey()); if ($uniqueData === 'suffix') { @@ -449,7 +449,7 @@ private function resolveNonPrimitiveReferenceElement($entityObject, $operation, $entityNamesOfType = $entityObject->getLinkedEntitiesOfType($operationElementType); // If an element is required by metadata, but was not provided in the entity, throw an exception - if ($operationElement->isRequired() && $entityNamesOfType == null) { + if ($operationElement->isRequired() && $entityNamesOfType === null) { throw new \Exception(sprintf( self::EXCEPTION_REQUIRED_DATA, $operationElement->getType(), @@ -476,7 +476,7 @@ private function resolveNonPrimitiveReferenceElement($entityObject, $operation, } } - if ($operationElement->getType() == OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY) { + if ($operationElement->getType() === OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY) { $operationDataArray[$operationElement->getKey()][] = $operationDataSubArray; } else { $operationDataArray[$operationElement->getKey()] = $operationDataSubArray; diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Util/DataExtensionUtil.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Util/DataExtensionUtil.php index 986f087e3..d803be9a2 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Util/DataExtensionUtil.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Util/DataExtensionUtil.php @@ -32,7 +32,7 @@ public function extendEntity($entityObject) { // Check to see if the parent entity exists $parentEntity = DataObjectHandler::getInstance()->getObject($entityObject->getParentName()); - if ($parentEntity == null) { + if ($parentEntity === null) { throw new XmlException( "Parent Entity " . $entityObject->getParentName() . diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/WebApiExecutor.php b/src/Magento/FunctionalTestingFramework/DataTransport/WebApiExecutor.php index 1bf792003..3a4b627bd 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/WebApiExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/WebApiExecutor.php @@ -135,7 +135,7 @@ public function close() protected function getFormattedUrl($resource) { $urlResult = MftfGlobals::getWebApiBaseUrl(); - if ($this->storeCode != null) { + if ($this->storeCode !== null) { $urlResult .= $this->storeCode . '/'; } $urlResult .= trim($resource, '/'); diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index e4f433a2a..4e65e992f 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -100,7 +100,7 @@ function () use ($cest) { // check for errors in all test hooks and attach in allure if (!empty($testResultObject->errors())) { foreach ($testResultObject->errors() as $error) { - if ($error->failedTest()->getTestMethod() == $cest->getTestMethod()) { + if ($error->failedTest()->getTestMethod() === $cest->getTestMethod()) { $this->attachExceptionToAllure($error->thrownException(), $cest->getTestMethod()); } } @@ -109,7 +109,7 @@ function () use ($cest) { // check for failures in all test hooks and attach in allure if (!empty($testResultObject->failures())) { foreach ($testResultObject->failures() as $failure) { - if ($failure->failedTest()->getTestMethod() == $cest->getTestMethod()) { + if ($failure->failedTest()->getTestMethod() === $cest->getTestMethod()) { $this->attachExceptionToAllure($failure->thrownException(), $cest->getTestMethod()); } } @@ -128,7 +128,7 @@ public function extractContext($trace, $class) { foreach ($trace as $entry) { $traceClass = $entry["class"] ?? null; - if (strpos($traceClass, $class) != 0) { + if (strpos($traceClass, $class) !== 0) { return $entry["function"]; } } @@ -257,7 +257,7 @@ public function saveFailed(\Codeception\Event\PrintResultEvent $e) protected function localizePath($path) { $root = realpath($this->getRootDir()) . DIRECTORY_SEPARATOR; - if (substr($path, 0, strlen($root)) == $root) { + if (substr($path, 0, strlen($root)) === $root) { return substr($path, strlen($root)); } return $path; diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoAssert.php b/src/Magento/FunctionalTestingFramework/Module/MagentoAssert.php index 3c6c08173..78301ad6f 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoAssert.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoAssert.php @@ -36,7 +36,7 @@ public function assertArrayIsSorted(array $data, $sortOrder = "asc") $data = array_map('strtolower', $data); } - if ($sortOrder == "asc") { + if ($sortOrder === 'asc') { for ($i = 1; $i < $elementTotal; $i++) { // $i >= $i-1 $this->assertLessThanOrEqual($data[$i], $data[$i-1], $message); diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 7a3220921..328eb4842 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -222,7 +222,7 @@ public function _getUrl() public function _getCurrentUri() { $url = $this->webDriver->getCurrentURL(); - if ($url == 'about:blank') { + if ($url === 'about:blank') { throw new ModuleException($this, 'Current url is blank, no page was opened'); } @@ -509,7 +509,7 @@ public function parseFloat($floatString) */ public function mSetLocale(int $category, $locale) { - if (self::$localeAll[$category] == $locale) { + if (self::$localeAll[$category] === $locale) { return; } foreach (self::$localeAll as $c => $l) { @@ -849,7 +849,7 @@ public function _failed(TestInterface $test, $fail) } } - if ($this->current_test == null) { + if ($this->current_test === null) { throw new \RuntimeException("Suite condition failure: \n" . $fail->getMessage()); } @@ -869,7 +869,7 @@ public function _failed(TestInterface $test, $fail) public function saveScreenshot() { $testDescription = "unknown." . uniqid(); - if ($this->current_test != null) { + if ($this->current_test !== null) { $testDescription = Descriptor::getTestSignature($this->current_test); } diff --git a/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Mapper/Dom.php b/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Mapper/Dom.php index ba7bc64cd..99912355d 100644 --- a/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Mapper/Dom.php +++ b/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Mapper/Dom.php @@ -54,7 +54,7 @@ public function convert($config) $output = []; /** @var \DOMNode $node */ foreach ($config->documentElement->childNodes as $node) { - if ($node->nodeType != XML_ELEMENT_NODE) { + if ($node->nodeType !== XML_ELEMENT_NODE) { continue; } switch ($node->nodeName) { @@ -73,7 +73,7 @@ public function convert($config) if ($typeNodeShared) { $typeData['shared'] = $this->booleanUtils->toBoolean($typeNodeShared->nodeValue); } - if ($node->nodeName == 'virtualType') { + if ($node->nodeName === 'virtualType') { $attributeType = $typeNodeAttributes->getNamedItem('type'); // attribute type is required for virtual type only in merged configuration if ($attributeType) { @@ -102,14 +102,14 @@ private function setTypeArguments($node) foreach ($node->childNodes as $typeChildNode) { /** @var \DOMNode $typeChildNode */ - if ($typeChildNode->nodeType != XML_ELEMENT_NODE) { + if ($typeChildNode->nodeType !== XML_ELEMENT_NODE) { continue; } switch ($typeChildNode->nodeName) { case 'arguments': /** @var \DOMNode $argumentNode */ foreach ($typeChildNode->childNodes as $argumentNode) { - if ($argumentNode->nodeType != XML_ELEMENT_NODE) { + if ($argumentNode->nodeType !== XML_ELEMENT_NODE) { continue; } $argumentName = $argumentNode->attributes->getNamedItem('name')->nodeValue; diff --git a/src/Magento/FunctionalTestingFramework/ObjectManager/Factory.php b/src/Magento/FunctionalTestingFramework/ObjectManager/Factory.php index c5882d035..922235011 100644 --- a/src/Magento/FunctionalTestingFramework/ObjectManager/Factory.php +++ b/src/Magento/FunctionalTestingFramework/ObjectManager/Factory.php @@ -84,7 +84,8 @@ public function prepareArguments($object, $method, array $arguments = []) { $type = get_class($object); $parameters = $this->classReader->getParameters($type, $method); - if ($parameters == null) { + + if ($parameters === null) { return []; } @@ -227,7 +228,8 @@ public function create($requestedType, array $arguments = []) { $instanceType = $this->config->getInstanceType($requestedType); $parameters = $this->definitions->getParameters($instanceType); - if ($parameters == null) { + + if ($parameters === null) { return new $instanceType(); } if (isset($this->creationStack[$requestedType])) { diff --git a/src/Magento/FunctionalTestingFramework/ObjectManager/Factory/Dynamic/Developer.php b/src/Magento/FunctionalTestingFramework/ObjectManager/Factory/Dynamic/Developer.php index 937be7da6..0d6623d09 100644 --- a/src/Magento/FunctionalTestingFramework/ObjectManager/Factory/Dynamic/Developer.php +++ b/src/Magento/FunctionalTestingFramework/ObjectManager/Factory/Dynamic/Developer.php @@ -178,7 +178,8 @@ public function create($requestedType, array $arguments = []) { $type = $this->config->getInstanceType($requestedType); $parameters = $this->definitions->getParameters($type); - if ($parameters == null) { + + if ($parameters === null) { return new $type(); } if (isset($this->creationStack[$requestedType])) { diff --git a/src/Magento/FunctionalTestingFramework/Page/Handlers/PageObjectHandler.php b/src/Magento/FunctionalTestingFramework/Page/Handlers/PageObjectHandler.php index 8f4302077..dd723fa1b 100644 --- a/src/Magento/FunctionalTestingFramework/Page/Handlers/PageObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/Page/Handlers/PageObjectHandler.php @@ -66,7 +66,7 @@ private function __construct() $area = $pageData[self::AREA] ?? null; $url = $pageData[self::URL] ?? null; - if ($area == 'admin') { + if ($area === 'admin') { $url = ltrim($url, "/"); } diff --git a/src/Magento/FunctionalTestingFramework/Page/Objects/ElementObject.php b/src/Magento/FunctionalTestingFramework/Page/Objects/ElementObject.php index 567872fc7..f00ded056 100644 --- a/src/Magento/FunctionalTestingFramework/Page/Objects/ElementObject.php +++ b/src/Magento/FunctionalTestingFramework/Page/Objects/ElementObject.php @@ -75,9 +75,9 @@ class ElementObject */ public function __construct($name, $type, $selector, $locatorFunction, $timeout, $parameterized, $deprecated = null) { - if ($selector != null && $locatorFunction != null) { + if ($selector !== null && $locatorFunction !== null) { throw new XmlException("Element '{$name}' cannot have both a selector and a locatorFunction."); - } elseif ($selector == null && $locatorFunction == null) { + } elseif ($selector === null && $locatorFunction === null) { throw new XmlException("Element '{$name}' must have either a selector or a locatorFunction.'"); } @@ -160,11 +160,11 @@ public function getPrioritizedSelector() */ public function getTimeout() { - if ($this->timeout == ElementObject::DEFAULT_TIMEOUT_SYMBOL) { + if ($this->timeout === ElementObject::DEFAULT_TIMEOUT_SYMBOL) { return null; } - return (int)$this->timeout; + return (int) $this->timeout; } /** diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/AnnotationsCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/AnnotationsCheck.php index e7a0b7e54..0b3e6c40d 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/AnnotationsCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/AnnotationsCheck.php @@ -173,8 +173,8 @@ private function validateSkipIssueId($test) $skip = $annotations['skip'] ?? null; if ($skip !== null) { $validateSkipped = true; - if ((!isset($skip[0]) || strlen($skip[0]) == 0) - && (!isset($skip['issueId']) || strlen($skip['issueId']) == 0)) { + if ((!isset($skip[0]) || strlen($skip[0]) === 0) + && (!isset($skip['issueId']) || strlen($skip['issueId']) === 0)) { $this->errors[][] = "Test {$test->getName()} is skipped but the issueId is empty."; } } diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php index 6bfe17219..556d30d28 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php @@ -157,7 +157,7 @@ private function findErrorsInFileSet($files) $this->allEntities = []; $moduleName = $this->getModuleName($filePath); // Not a module, is either dev/tests/acceptance or loose folder with test materials - if ($moduleName == null) { + if ($moduleName === null) { continue; } @@ -219,7 +219,7 @@ private function findViolatingReferences($moduleName) foreach ($modulesReferencedInTest as $entityName => $files) { $valid = false; foreach ($files as $module) { - if (array_key_exists($module, $moduleDependencies) || $module == $currentModule) { + if (array_key_exists($module, $moduleDependencies) || $module === $currentModule) { $valid = true; break; } diff --git a/src/Magento/FunctionalTestingFramework/Suite/Generators/GroupClassGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/Generators/GroupClassGenerator.php index f90a25322..e160c4875 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/Generators/GroupClassGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/Generators/GroupClassGenerator.php @@ -152,7 +152,7 @@ private function buildHookMustacheArray($hookObj) } // add these as vars to be created a class level in the template - if ($action->getType() == 'createData') { + if ($action->getType() === 'createData') { $mustacheHookArray[self::MUSTACHE_VAR_TAG][] = [self::ENTITY_MERGE_KEY => $action->getStepKey()]; } @@ -213,7 +213,7 @@ private function replaceReservedTesterFunctions($formattedStep, $actionEntries, $formattedStep = rtrim($formattedStep); foreach (self::REPLACEMENT_ACTIONS as $testAction => $replacement) { $testActionCall = "\${$actor}->{$testAction}"; - if (substr($formattedStep, 0, strlen($testActionCall)) == $testActionCall) { + if (substr($formattedStep, 0, strlen($testActionCall)) === $testActionCall) { $resultingStep = str_replace($testActionCall, $replacement, $formattedStep); $actionEntries[] = ['action' => $resultingStep]; } else { @@ -278,7 +278,7 @@ private function buildReqEntitiesMustacheArray($customAttributes) continue; } - if ($attribute[ActionObjectExtractor::NODE_NAME] == 'requiredEntity') { + if ($attribute[ActionObjectExtractor::NODE_NAME] === 'requiredEntity') { $requiredEntities[] = [self::ENTITY_NAME_TAG => $attribute[TestGenerator::REQUIRED_ENTITY_REFERENCE]]; } } diff --git a/src/Magento/FunctionalTestingFramework/Suite/Handlers/SuiteObjectHandler.php b/src/Magento/FunctionalTestingFramework/Suite/Handlers/SuiteObjectHandler.php index f5d9e45dd..7583f2472 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/Handlers/SuiteObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/Suite/Handlers/SuiteObjectHandler.php @@ -62,7 +62,7 @@ private function __clone() */ public static function getInstance(): ObjectHandlerInterface { - if (self::$instance == null) { + if (self::$instance === null) { self::$instance = new SuiteObjectHandler(); self::$instance->initSuiteData(); } diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index ced0ac552..44e4e0b45 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -206,7 +206,7 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa $this->appendEntriesToConfig($suiteName, $fullPath, $groupNamespace); if (MftfApplicationConfig::getConfig()->verboseEnabled() - && MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::GENERATION_PHASE) { + && MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::GENERATION_PHASE) { print("suite {$suiteName} generated\n"); } LoggingUtil::getInstance()->getLogger(self::class)->info( @@ -304,7 +304,7 @@ private function generateGroupFile($suiteName, $tests, $originalSuiteName) } else { $suiteObject = SuiteObjectHandler::getInstance()->getObject($suiteName); // we have to handle the case when there is a custom configuration for an existing suite. - if (count($suiteObject->getTests()) != count($tests)) { + if (count($suiteObject->getTests()) !== count($tests)) { return $this->generateGroupFile($suiteName, $tests, $suiteName); } } diff --git a/src/Magento/FunctionalTestingFramework/Suite/Util/SuiteObjectExtractor.php b/src/Magento/FunctionalTestingFramework/Suite/Util/SuiteObjectExtractor.php index 247286f6d..6af9070ba 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/Util/SuiteObjectExtractor.php +++ b/src/Magento/FunctionalTestingFramework/Suite/Util/SuiteObjectExtractor.php @@ -92,7 +92,7 @@ public function parseSuiteDataIntoObjects($parsedSuiteData) $includeTests = $include['objects'] ?? []; $stepError = $include['status'] ?? 0; $includeMessage = ''; - if ($stepError != 0) { + if ($stepError !== 0) { $includeMessage = "ERROR: " . strval($stepError) . " test(s) not included for suite " . $parsedSuite[self::NAME]; } @@ -127,7 +127,8 @@ public function parseSuiteDataIntoObjects($parsedSuiteData) if (!empty($includeMessage)) { LoggingUtil::getInstance()->getLogger(self::class)->error($includeMessage); if (MftfApplicationConfig::getConfig()->verboseEnabled() - && MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::GENERATION_PHASE) { + && MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::GENERATION_PHASE + ) { print($includeMessage); } @@ -145,7 +146,7 @@ public function parseSuiteDataIntoObjects($parsedSuiteData) "Unable to parse suite " . $parsedSuite[self::NAME] . "\n" . $e->getMessage() ); if (MftfApplicationConfig::getConfig()->verboseEnabled() - && MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::GENERATION_PHASE) { + && MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::GENERATION_PHASE) { print("ERROR: Unable to parse suite " . $parsedSuite[self::NAME] . "\n"); } @@ -183,7 +184,7 @@ private function validateSuiteName($parsedSuite) { //check if name used is using special char or the "default" reserved name NameValidationUtil::validateName($parsedSuite[self::NAME], 'Suite'); - if ($parsedSuite[self::NAME] == 'default') { + if ($parsedSuite[self::NAME] === 'default') { throw new FastFailException("A Suite can not have the name \"default\""); } @@ -235,7 +236,7 @@ private function parseObjectHooks($parsedSuite) $suiteHooks[TestObjectExtractor::TEST_AFTER_HOOK] = $hookObject; } - if (count($suiteHooks) == 1) { + if (count($suiteHooks) === 1) { throw new XmlException(sprintf( "Suites that contain hooks must contain both a 'before' and an 'after' hook. Suite: \"%s\"", $parsedSuite[self::NAME] @@ -254,7 +255,7 @@ private function parseObjectHooks($parsedSuite) */ private function isSuiteEmpty($suiteHooks, $includeTests, $excludeTests) { - $noHooks = count($suiteHooks) == 0 || + $noHooks = count($suiteHooks) === 0 || ( empty($suiteHooks['before']->getActions()) && empty($suiteHooks['after']->getActions()) diff --git a/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php b/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php index 0769f5ebf..23d8d5331 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php +++ b/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php @@ -77,7 +77,7 @@ public function convertXml(\DOMNode $source, $basePath = '') $value = []; /** @var \DOMNode $node */ foreach ($source->childNodes as $node) { - if ($node->nodeType == XML_ELEMENT_NODE) { + if ($node->nodeType === XML_ELEMENT_NODE) { $nodeName = $node->nodeName; $nodePath = $basePath . '/' . $nodeName; $arrayKeyAttribute = $this->arrayNodeConfig->getAssocArrayKeyAttribute($nodePath); @@ -90,7 +90,7 @@ public function convertXml(\DOMNode $source, $basePath = '') ); } - if ($nodeName == self::REMOVE_ACTION) { + if ($nodeName === self::REMOVE_ACTION) { // Check to see if the test extends for this remove action $parentHookExtends = in_array($node->parentNode->nodeName, self::TEST_HOOKS) && !empty($node->parentNode->parentNode->getAttribute('extends')); @@ -121,12 +121,12 @@ public function convertXml(\DOMNode $source, $basePath = '') } else { $value[$nodeName] = $nodeData; } - } elseif ($node->nodeType == XML_CDATA_SECTION_NODE - || ($node->nodeType == XML_TEXT_NODE && trim($node->nodeValue) != '') + } elseif ($node->nodeType === XML_CDATA_SECTION_NODE + || ($node->nodeType === XML_TEXT_NODE && trim($node->nodeValue) !== '') ) { $value = $node->nodeValue; break; - } elseif ($node->nodeType == XML_COMMENT_NODE && + } elseif ($node->nodeType === XML_COMMENT_NODE && in_array($node->parentNode->nodeName, self::VALID_COMMENT_PARENT)) { $uniqid = uniqid($node->nodeName); $value[$uniqid] = [ @@ -163,7 +163,7 @@ protected function getNodeAttributes(\DOMNode $node) $attributes = $node->attributes ?: []; /** @var \DOMNode $attribute */ foreach ($attributes as $attribute) { - if ($attribute->nodeType == XML_ATTRIBUTE_NODE) { + if ($attribute->nodeType === XML_ATTRIBUTE_NODE) { $result[$attribute->nodeName] = $attribute->nodeValue; } } diff --git a/src/Magento/FunctionalTestingFramework/Test/Config/Dom.php b/src/Magento/FunctionalTestingFramework/Test/Config/Dom.php index 7ded754be..89f779968 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Config/Dom.php +++ b/src/Magento/FunctionalTestingFramework/Test/Config/Dom.php @@ -173,7 +173,7 @@ protected function appendMergePointerToActions($testNode, $insertType, $insertKe $childNodes = $testNode->childNodes; $previousStepKey = $insertKey; $actionInsertType = ActionObject::MERGE_ACTION_ORDER_AFTER; - if ($insertType == self::TEST_MERGE_POINTER_BEFORE) { + if ($insertType === self::TEST_MERGE_POINTER_BEFORE) { $actionInsertType = ActionObject::MERGE_ACTION_ORDER_BEFORE; } for ($i = 0; $i < $childNodes->length; $i++) { diff --git a/src/Magento/FunctionalTestingFramework/Test/Handlers/ActionGroupObjectHandler.php b/src/Magento/FunctionalTestingFramework/Test/Handlers/ActionGroupObjectHandler.php index 5a87a32f6..fb4dac688 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Handlers/ActionGroupObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/Test/Handlers/ActionGroupObjectHandler.php @@ -151,9 +151,9 @@ private function initActionGroups() private function extendActionGroup($actionGroupObject): ActionGroupObject { if ($actionGroupObject->getParentName() !== null) { - if ($actionGroupObject->getParentName() == $actionGroupObject->getName()) { + if ($actionGroupObject->getParentName() === $actionGroupObject->getName()) { throw new TestFrameworkException( - "Mftf Action Group can not extend from itself: " . $actionGroupObject->getName() + 'Mftf Action Group can not extend from itself: ' . $actionGroupObject->getName() ); } return $this->extendUtil->extendActionGroup($actionGroupObject); diff --git a/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php b/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php index 4abc26c36..287e5306e 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php @@ -124,7 +124,7 @@ public function getAllObjects() if ($errCount > 0 && MftfApplicationConfig::getConfig()->verboseEnabled() - && MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::GENERATION_PHASE) { + && MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::GENERATION_PHASE) { print( "ERROR: " . strval($errCount) @@ -173,7 +173,7 @@ public function getTestsByGroup($groupName) if ($errCount > 0 && MftfApplicationConfig::getConfig()->verboseEnabled() - && MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::GENERATION_PHASE) { + && MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::GENERATION_PHASE) { print( "ERROR: " . strval($errCount) @@ -248,7 +248,7 @@ private function initTestData($validateAnnotations = true) "Unable to parse test " . $testName . "\n" . $exception->getMessage() ); if (MftfApplicationConfig::getConfig()->verboseEnabled() - && MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::GENERATION_PHASE) { + && MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::GENERATION_PHASE) { print("ERROR: Unable to parse test " . $testName . "\n"); } GenerationErrorHandler::getInstance()->addError( @@ -276,7 +276,7 @@ private function initTestData($validateAnnotations = true) private function extendTest($testObject) { if ($testObject->getParentName() !== null) { - if ($testObject->getParentName() == $testObject->getName()) { + if ($testObject->getParentName() === $testObject->getName()) { throw new TestFrameworkException( "Mftf Test can not extend from itself: " . $testObject->getName() ); diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionGroupObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionGroupObject.php index 74aa414a8..b608a4846 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionGroupObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionGroupObject.php @@ -239,7 +239,7 @@ private function getResolvedActionsWithArgs($arguments, $actionReferenceKey) $action->getStepKey() . ucfirst($actionReferenceKey), $action->getType(), array_replace_recursive($resolvedActionAttributes, $newActionAttributes), - $action->getLinkedAction() == null ? null : $action->getLinkedAction() . ucfirst($actionReferenceKey), + $action->getLinkedAction() === null ? null : $action->getLinkedAction() . ucfirst($actionReferenceKey), $orderOffset, [self::ACTION_GROUP_ORIGIN_NAME => $this->name, self::ACTION_GROUP_ORIGIN_TEST_REF => $actionReferenceKey], @@ -531,7 +531,7 @@ private function findArgumentByName($name, $argumentList) $matchedArgument = array_filter( $argumentList, function ($e) use ($name) { - return $e->getName() == $name; + return $e->getName() === $name; } ); if (isset(array_values($matchedArgument)[0])) { diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index 8e4aa973c..ed5cc0936 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -290,7 +290,7 @@ public function resolveReferences() $this->resolveUrlReference(); $this->resolveDataInputReferences(); $this->validateTimezoneAttribute(); - if ($this->getType() == "deleteData") { + if ($this->getType() === "deleteData") { $this->validateMutuallyExclusiveAttributes(self::DELETE_DATA_MUTUAL_EXCLUSIVE_ATTRIBUTES); } } @@ -561,24 +561,24 @@ private function findAndReplaceReferences($objectHandler, $inputString) continue; } - if ($obj == null) { + if ($obj === null) { // keep initial values for subsequent logic $replacement = null; $parameterized = false; - } elseif (get_class($obj) == PageObject::class) { + } elseif (get_class($obj) === PageObject::class) { if ($obj->getDeprecated() !== null) { $this->deprecatedUsage[] = "DEPRECATED PAGE in Test: " . $match . ' ' . $obj->getDeprecated(); } $this->validateUrlAreaAgainstActionType($obj); $replacement = $obj->getUrl(); $parameterized = $obj->isParameterized(); - } elseif (get_class($obj) == SectionObject::class) { + } elseif (get_class($obj) === SectionObject::class) { if ($obj->getDeprecated() !== null) { $this->deprecatedUsage[] = "DEPRECATED SECTION in Test: " . $match . ' ' . $obj->getDeprecated(); } list(,$objField) = $this->stripAndSplitReference($match); - if ($obj->getElement($objField) == null) { + if ($obj->getElement($objField) === null) { throw new TestReferenceException( "Could not resolve entity reference \"{$inputString}\" " . "in Action with stepKey \"{$this->getStepKey()}\"", @@ -592,7 +592,7 @@ private function findAndReplaceReferences($objectHandler, $inputString) $this->deprecatedUsage[] = "DEPRECATED ELEMENT in Test: " . $match . ' ' . $obj->getElement($objField)->getDeprecated(); } - } elseif (get_class($obj) == EntityDataObject::class) { + } elseif (get_class($obj) === EntityDataObject::class) { if ($obj->getDeprecated() !== null) { $this->deprecatedUsage[] = "DEPRECATED DATA ENTITY in Test: " . $match . ' ' . $obj->getDeprecated(); @@ -638,7 +638,7 @@ private function validateMutuallyExclusiveAttributes(array $attributes) . implode("', '", $attributes) . "'", ["type" => $this->getType(), "attributes" => $attributes] ); - } elseif (count($matches) == 0) { + } elseif (count($matches) === 0) { throw new TestReferenceException( "Actions of type '{$this->getType()}' must contain at least one attribute of types '" . implode("', '", $attributes) . "'", @@ -656,7 +656,7 @@ private function validateMutuallyExclusiveAttributes(array $attributes) */ private function validateUrlAreaAgainstActionType($obj) { - if ($obj->getArea() == 'external' && + if ($obj->getArea() === 'external' && in_array($this->getType(), self::EXTERNAL_URL_AREA_INVALID_ACTIONS)) { throw new TestReferenceException( "Page of type 'external' is not compatible with action type '{$this->getType()}'", @@ -697,7 +697,7 @@ private function resolveEntityDataObjectReference($obj, $match) { list(,$objField) = $this->stripAndSplitReference($match); - if (strpos($objField, '[') == true) { + if (strpos($objField, '[') === true) { // Access ... $parts = explode('[', $objField); $name = $parts[0]; @@ -726,7 +726,7 @@ private function resolveParameterization($isParameterized, $replacement, $match, } else { $resolvedReplacement = $replacement; } - if (get_class($object) == PageObject::class && $object->getArea() == PageObject::ADMIN_AREA) { + if (get_class($object) === PageObject::class && $object->getArea() === PageObject::ADMIN_AREA) { $urlSegments = [ '{{_ENV.MAGENTO_BACKEND_BASE_URL}}', '{{_ENV.MAGENTO_BACKEND_NAME}}', @@ -794,7 +794,7 @@ private function checkParameterCount($matches, $parameters, $reference) if (count($matches) > count($parameters)) { if (is_array($parameters)) { $parametersGiven = implode(",", $parameters); - } elseif ($parameters == null) { + } elseif ($parameters === null) { $parametersGiven = "NONE"; } else { $parametersGiven = $parameters; @@ -810,7 +810,7 @@ private function checkParameterCount($matches, $parameters, $reference) $reference . ". Parameters Given: " . implode(", ", $parameters), ["reference" => $reference, "parametersGiven" => $parameters] ); - } elseif (count($matches) == 0) { + } elseif (count($matches) === 0) { throw new TestReferenceException( "Parameter Resolution Failed: No parameter matches found in parameterized element with selector " . $reference, diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php index 82bb04906..8341fc7b1 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php @@ -174,7 +174,7 @@ public function isSkipped() */ public function getCodeceptionName() { - if (strpos($this->name, 'Cest') && substr($this->name, -4) == 'Cest') { + if (strpos($this->name, 'Cest') && substr($this->name, -4) === 'Cest') { return $this->name; } diff --git a/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php b/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php index 28a7d405d..a601deb24 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php +++ b/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php @@ -170,10 +170,10 @@ private function resolveActionGroups($mergedSteps) foreach ($mergedSteps as $key => $mergedStep) { /**@var ActionObject $mergedStep**/ - if ($mergedStep->getType() == ActionObjectExtractor::ACTION_GROUP_TAG) { + if ($mergedStep->getType() === ActionObjectExtractor::ACTION_GROUP_TAG) { $actionGroupRef = $mergedStep->getCustomActionAttributes()[ActionObjectExtractor::ACTION_GROUP_REF]; $actionGroup = ActionGroupObjectHandler::getInstance()->getObject($actionGroupRef); - if ($actionGroup == null) { + if ($actionGroup === null) { throw new TestReferenceException("Could not find ActionGroup by ref \"{$actionGroupRef}\""); } $args = $mergedStep->getCustomActionAttributes()[ActionObjectExtractor::ACTION_GROUP_ARGUMENTS] ?? null; diff --git a/src/Magento/FunctionalTestingFramework/Test/Util/ActionObjectExtractor.php b/src/Magento/FunctionalTestingFramework/Test/Util/ActionObjectExtractor.php index 8fdcf82f6..a9fb0817e 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Util/ActionObjectExtractor.php +++ b/src/Magento/FunctionalTestingFramework/Test/Util/ActionObjectExtractor.php @@ -90,7 +90,7 @@ public function extractActions($testActions, $testName = null) $actions = $this->extractFieldActions($actionData, $actions); $actionAttributes = $this->extractFieldReferences($actionData, $actionAttributes); - if ($linkedAction['stepKey'] != null) { + if ($linkedAction['stepKey'] !== null) { $stepKeyRefs[$linkedAction['stepKey']][] = $stepKey; } @@ -157,7 +157,7 @@ private function processActionGroupArgs($actionType, $actionAttributeData) $actionAttributeArgData = []; foreach ($actionAttributeData as $attributeDataKey => $attributeDataValues) { - if ($attributeDataKey == self::ACTION_GROUP_REF) { + if ($attributeDataKey === self::ACTION_GROUP_REF) { $actionAttributeArgData[self::ACTION_GROUP_REF] = $attributeDataValues; continue; } @@ -187,7 +187,7 @@ private function processHelperArgs($actionType, $actionAttributeData) $actionAttributeArgData = []; foreach ($actionAttributeData as $attributeDataKey => $attributeDataValues) { - if (isset($attributeDataValues['nodeName']) && $attributeDataValues['nodeName'] == 'argument') { + if (isset($attributeDataValues['nodeName']) && $attributeDataValues['nodeName'] === 'argument') { if (isset($attributeDataValues['name']) && in_array($attributeDataValues['name'], $reservedHelperVariableNames)) { $message = 'Helper argument names ' . implode(',', $reservedHelperVariableNames); @@ -225,7 +225,7 @@ private function extractFieldActions($actionData, $actions) $fieldActions = []; foreach ($actionData as $type => $data) { // determine if field type is entity passed in - if (!is_array($data) || $data[self::NODE_NAME] != self::DATA_PERSISTENCE_CUSTOM_FIELD) { + if (!is_array($data) || $data[self::NODE_NAME] !== self::DATA_PERSISTENCE_CUSTOM_FIELD) { continue; } @@ -258,7 +258,8 @@ private function extractFieldReferences($actionData, $actionAttributes) $attributes = []; foreach ($actionAttributes as $attributeName => $attributeValue) { - if (!is_array($attributeValue) || $attributeValue[self::NODE_NAME] != self::DATA_PERSISTENCE_CUSTOM_FIELD) { + if (!is_array($attributeValue) || + $attributeValue[self::NODE_NAME] !== self::DATA_PERSISTENCE_CUSTOM_FIELD) { $attributes[$attributeName] = $attributeValue; continue; } diff --git a/src/Magento/FunctionalTestingFramework/Test/Util/AnnotationExtractor.php b/src/Magento/FunctionalTestingFramework/Test/Util/AnnotationExtractor.php index 4afddc769..8710fbb22 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Util/AnnotationExtractor.php +++ b/src/Magento/FunctionalTestingFramework/Test/Util/AnnotationExtractor.php @@ -77,14 +77,14 @@ public function extractAnnotations($testAnnotations, $filename, $validateAnnotat } $annotationValues = []; // Only transform severity annotation - if ($annotationKey == "severity") { + if ($annotationKey === "severity") { $annotationObjects[$annotationKey] = $this->transformAllureSeverityToMagento( trim($annotationData[0][self::ANNOTATION_VALUE]) ); continue; } - if ($annotationKey == "skip") { + if ($annotationKey === "skip") { $annotationData = $annotationData['issueId']; if ($validateAnnotations) { $this->validateSkippedIssues($annotationData, $filename); @@ -182,7 +182,7 @@ private function validateMissingAnnotations($annotationObjects, $filename) */ public function validateStoryTitleUniqueness() { - if (MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::EXECUTION_PHASE) { + if (MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::EXECUTION_PHASE) { return; } @@ -197,7 +197,7 @@ public function validateStoryTitleUniqueness() $message = "Story and Title annotation pairs is not unique in Tests {$tests}\n"; LoggingUtil::getInstance()->getLogger(self::class)->error($message); if (MftfApplicationConfig::getConfig()->verboseEnabled() - && MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::GENERATION_PHASE) { + && MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::GENERATION_PHASE) { print('ERROR: ' . $message); } $testArray = explode(',', $tests); @@ -220,7 +220,7 @@ public function validateStoryTitleUniqueness() */ public function validateTestCaseIdTitleUniqueness() { - if (MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::EXECUTION_PHASE) { + if (MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::EXECUTION_PHASE) { return; } @@ -235,7 +235,7 @@ public function validateTestCaseIdTitleUniqueness() $message = "TestCaseId and Title pairs is not unique in Tests {$tests}\n"; LoggingUtil::getInstance()->getLogger(self::class)->error($message); if (MftfApplicationConfig::getConfig()->verboseEnabled() - && MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::GENERATION_PHASE) { + && MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::GENERATION_PHASE) { print('ERROR: ' . $message); } $testArray = explode(',', $tests); diff --git a/src/Magento/FunctionalTestingFramework/Test/Util/ObjectExtensionUtil.php b/src/Magento/FunctionalTestingFramework/Test/Util/ObjectExtensionUtil.php index 1be3c895f..7f6d050fb 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Util/ObjectExtensionUtil.php +++ b/src/Magento/FunctionalTestingFramework/Test/Util/ObjectExtensionUtil.php @@ -98,7 +98,7 @@ public function extendActionGroup($actionGroupObject) { // Check to see if the parent action group exists $parentActionGroup = ActionGroupObjectHandler::getInstance()->getObject($actionGroupObject->getParentName()); - if ($parentActionGroup == null) { + if ($parentActionGroup === null) { throw new XmlException( "Parent Action Group " . $actionGroupObject->getParentName() . @@ -200,7 +200,7 @@ private function processRemoveActions($actions) // remove actions merged that are of type 'remove' foreach ($actions as $actionName => $actionData) { - if ($actionData->getType() != "remove") { + if ($actionData->getType() !== 'remove') { $cleanedActions[$actionName] = $actionData; } } diff --git a/src/Magento/FunctionalTestingFramework/Upgrade/UpdateAssertionSchema.php b/src/Magento/FunctionalTestingFramework/Upgrade/UpdateAssertionSchema.php index 2628be851..3c6825092 100644 --- a/src/Magento/FunctionalTestingFramework/Upgrade/UpdateAssertionSchema.php +++ b/src/Magento/FunctionalTestingFramework/Upgrade/UpdateAssertionSchema.php @@ -104,9 +104,9 @@ private function convertOldAssertionToNew($assertion) $value = rtrim(ltrim($value, "'"), "'"); } // If value is empty string (" " or ' '), trim again to become empty - if (str_replace(" ", "", $value) == "''") { + if (str_replace(" ", "", $value) === "''") { $value = ""; - } elseif (str_replace(" ", "", $value) == '""') { + } elseif (str_replace(" ", "", $value) === '""') { $value = ""; } @@ -119,20 +119,20 @@ private function convertOldAssertionToNew($assertion) } // Store in subtype for child element creation - if ($type == "actual") { + if ($type === "actual") { $subElements["actual"]["value"] = $value; - } elseif ($type == "actualType") { + } elseif ($type === "actualType") { $subElements["actual"]["type"] = $value; - } elseif ($type == "expected" or $type == "expectedValue") { + } elseif ($type === "expected" or $type === "expectedValue") { $subElements["expected"]["value"] = $value; - } elseif ($type == "expectedType") { + } elseif ($type === "expectedType") { $subElements["expected"]["type"] = $value; } } $newString .= ">\n"; // Assert type is very edge-cased, completely different schema - if ($assertType == 'assertElementContainsAttribute') { + if ($assertType === 'assertElementContainsAttribute') { // assertElementContainsAttribute type defaulted to string if not present if (!isset($subElements["expected"]['type'])) { $subElements["expected"]['type'] = "string"; diff --git a/src/Magento/FunctionalTestingFramework/Util/ComposerModuleResolver.php b/src/Magento/FunctionalTestingFramework/Util/ComposerModuleResolver.php index 210c10fdd..92d5dc121 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ComposerModuleResolver.php +++ b/src/Magento/FunctionalTestingFramework/Util/ComposerModuleResolver.php @@ -48,7 +48,7 @@ public function getComposerInstalledTestModules($rootComposerFile) return $this->installedTestModules; } - if (!file_exists($rootComposerFile) || basename($rootComposerFile, '.json') != 'composer') { + if (!file_exists($rootComposerFile) || basename($rootComposerFile, '.json') !== 'composer') { throw new TestFrameworkException("Invalid root composer json file: {$rootComposerFile}"); } @@ -168,7 +168,7 @@ private function findComposerJsonFilesAtDepth($directory, $depth) self::findComposerJsonFilesAtDepth($dir, $depth-1) ); } - } elseif ($depth == 0) { + } elseif ($depth === 0) { $jsonFileList = glob($directory . $jsonPattern); if ($jsonFileList === false) { $jsonFileList = []; diff --git a/src/Magento/FunctionalTestingFramework/Util/ConfigSanitizerUtil.php b/src/Magento/FunctionalTestingFramework/Util/ConfigSanitizerUtil.php index 3b92b48e4..ee4c85018 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ConfigSanitizerUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/ConfigSanitizerUtil.php @@ -43,16 +43,16 @@ public static function sanitizeWebDriverConfig($config, $params = ['url', 'selen */ private static function sanitizeSeleniumEnvs($config) { - if ($config['protocol'] == '%SELENIUM_PROTOCOL%') { + if ($config['protocol'] === '%SELENIUM_PROTOCOL%') { $config['protocol'] = "http"; } - if ($config['host'] == '%SELENIUM_HOST%') { + if ($config['host'] === '%SELENIUM_HOST%') { $config['host'] = "127.0.0.1"; } - if ($config['port'] == '%SELENIUM_PORT%') { + if ($config['port'] === '%SELENIUM_PORT%') { $config['port'] = "4444"; } - if ($config['path'] == '%SELENIUM_PATH%') { + if ($config['path'] === '%SELENIUM_PATH%') { $config['path'] = "/wd/hub"; } return $config; diff --git a/src/Magento/FunctionalTestingFramework/Util/Logger/LoggingUtil.php b/src/Magento/FunctionalTestingFramework/Util/Logger/LoggingUtil.php index 268bc5193..c32348bcc 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Logger/LoggingUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Logger/LoggingUtil.php @@ -66,7 +66,7 @@ private function __clone() */ public function getLogger($className): MftfLogger { - if ($className == null) { + if ($className === null) { throw new TestFrameworkException("You must pass a class name to receive a logger"); } diff --git a/src/Magento/FunctionalTestingFramework/Util/ModulePathExtractor.php b/src/Magento/FunctionalTestingFramework/Util/ModulePathExtractor.php index b7386a586..a9f51d226 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModulePathExtractor.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModulePathExtractor.php @@ -72,7 +72,7 @@ public function getExtensionPath($path) private function splitKeyForParts($key) { $parts = explode(self::SPLIT_DELIMITER, $key); - return count($parts) == 2 ? $parts : []; + return count($parts) === 2 ? $parts : []; } /** @@ -90,7 +90,7 @@ private function extractKeyByPath($path) } foreach ($this->testModulePaths as $key => $value) { - if (substr($path, 0, strlen($value)) == $value) { + if (substr($path, 0, strlen($value)) === $value) { return $key; } } diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php index b04168673..434a1cdc3 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php @@ -156,7 +156,7 @@ private function __construct() { $objectManager = \Magento\FunctionalTestingFramework\ObjectManagerFactory::getObjectManager(); - if (MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::UNIT_TEST_PHASE) { + if (MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::UNIT_TEST_PHASE) { $this->sequenceSorter = $objectManager->get(AlphabeticSequenceSorter::class); } else { $this->sequenceSorter = $objectManager->get(SequenceSorterInterface::class); @@ -175,7 +175,7 @@ public function getEnabledModules() return $this->enabledModules; } - if (MftfApplicationConfig::getConfig()->getPhase() == MftfApplicationConfig::GENERATION_PHASE) { + if (MftfApplicationConfig::getConfig()->getPhase() === MftfApplicationConfig::GENERATION_PHASE) { $this->printMagentoVersionInfo(); } @@ -338,8 +338,8 @@ private function flipAndFilterModulePathsArray($objectArray, $filterArray) // Filter array by enabled modules foreach ($objectArray as $path => $modules) { if (!array_diff($modules, $filterArray) - || (count($modules) == 1 && isset($this->knownDirectories[$modules[0]]))) { - if (count($modules) == 1) { + || (count($modules) === 1 && isset($this->knownDirectories[$modules[0]]))) { + if (count($modules) === 1) { $oneToOneArray[$path] = $modules[0]; } else { $oneToManyArray[$path] = $modules; diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php index 015fa4e9f..16d3e7d2b 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver/ModuleResolverService.php @@ -162,11 +162,11 @@ public function globRelevantPaths(string $testPath, string $pattern): array */ private static function globRelevantWrapper(string $testPath, string $pattern): array { - if ($pattern == "") { + if ($pattern === '') { return glob($testPath . '*' . DIRECTORY_SEPARATOR . '*' . $pattern); } - $subDirectory = "*" . DIRECTORY_SEPARATOR; + $subDirectory = '*' . DIRECTORY_SEPARATOR; $directories = glob($testPath . $subDirectory . $pattern, GLOB_ONLYDIR); foreach (glob($testPath . $subDirectory, GLOB_ONLYDIR) as $dir) { diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php index 11afa5cc1..745ab53fe 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php @@ -273,7 +273,7 @@ public function resolveEntityByNames($references) */ public function findEntity($name) { - if ($name == '_ENV' || $name == '_CREDS') { + if ($name === '_ENV' || $name === '_CREDS') { return null; } diff --git a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php index 660dafb62..612d32fd6 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php +++ b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php @@ -37,7 +37,7 @@ public function __construct() public function getTestsGroupedBySize($suiteConfiguration, $testNameToSize, $time) { // we must have the lines argument in order to create the test groups - if ($time == 0) { + if ($time === 0) { throw new FastFailException( "Please provide the argument '--time' to the robo command in order to". " generate grouped tests manifests for a parallel execution" @@ -139,7 +139,7 @@ private function getSuiteGroupCounts($suiteNameToTestSize, $testNameToSize, $gro $ceilSuiteGroupNumber = ceil($maxSuiteTime / $minGroupTime); $ceilSuiteGroupTime = max(ceil($maxSuiteTime / $ceilSuiteGroupNumber), $minGroupTime); $floorSuiteGroupNumber = floor($maxSuiteTime / $minGroupTime); - if ($floorSuiteGroupNumber != 0) { + if ($floorSuiteGroupNumber !== 0) { $floorSuiteGroupTime = max(ceil($maxSuiteTime / $floorSuiteGroupNumber), $minGroupTime); } @@ -148,7 +148,7 @@ private function getSuiteGroupCounts($suiteNameToTestSize, $testNameToSize, $gro $ceilSuiteGroupTotal = array_sum($ceilSuiteNameToGroupCount); $ceilTestGroupTotal = $groupTotal - $ceilSuiteGroupTotal; - if ($ceilTestGroupTotal == 0) { + if ($ceilTestGroupTotal === 0) { $ceilTestGroupTime = 0; } else { $ceilTestGroupTime = ceil(array_sum($testNameToSize) / $ceilTestGroupTotal); @@ -157,7 +157,7 @@ private function getSuiteGroupCounts($suiteNameToTestSize, $testNameToSize, $gro // Set suite group total to ceiling $suiteNameToGroupCount = $ceilSuiteNameToGroupCount; - if (isset($floorSuiteGroupTime) && $ceilSuiteGroupTime != $floorSuiteGroupTime) { + if (isset($floorSuiteGroupTime) && $ceilSuiteGroupTime !== $floorSuiteGroupTime) { // Calculate test group time for floor $floorSuiteNameToGroupCount = $this->getSuiteGroupCountFromGroupTime( $suiteNameToTestSize, @@ -165,7 +165,7 @@ private function getSuiteGroupCounts($suiteNameToTestSize, $testNameToSize, $gro ); $floorSuiteGroupTotal = array_sum($floorSuiteNameToGroupCount); $floorTestGroupTotal = $groupTotal - $floorSuiteGroupTotal; - if ($floorTestGroupTotal == 0) { + if ($floorTestGroupTotal === 0) { $floorTestGroupTime = 0; } else { $floorTestGroupTime = ceil(array_sum($testNameToSize) / $floorTestGroupTotal); @@ -243,7 +243,7 @@ private function splitSuitesIntoGroups($suiteNameToTestSize, $suiteNameToGroupCo $groups = []; foreach ($suiteNameToTestSize as $suiteName => $suiteTests) { $suiteCnt = $suiteNameToGroupCount[$suiteName]; - if ($suiteCnt == 1) { + if ($suiteCnt === 1) { $groups[][$suiteName] = array_sum($suiteTests); $this->addSuiteToConfig($suiteName, null, $suiteTests); } elseif ($suiteCnt > 1) { @@ -457,7 +457,7 @@ private function splitTestSuite($suiteName, $tests, $maxTime) */ private function addSuiteToConfig($originalSuiteName, $newSuiteName, $tests) { - if ($newSuiteName == null) { + if ($newSuiteName === null) { $this->suiteConfig[$originalSuiteName] = array_keys($tests); return; } diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 917b40809..fbf530fd8 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -371,7 +371,7 @@ private function assembleAllTestPhp($testManifest, array $testsToIgnore) $this->debug("Finish creating test: " . $test->getCodeceptionName() . "" . PHP_EOL); // Write to manifest here if manifest is not null - if ($testManifest != null) { + if ($testManifest !== null) { $testManifest->addTest($test); } } catch (FastFailException $e) { @@ -460,7 +460,7 @@ private function generateAnnotationsPhp($annotationsObject, $isMethod = false) foreach ($annotationsObject as $annotationType => $annotationName) { //Remove conditional and output useCaseId upon completion of MQE-588 - if ($annotationType == "useCaseId") { + if ($annotationType === 'useCaseId') { continue; } if (!$isMethod) { @@ -752,7 +752,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $time = $time ?? ActionObject::getDefaultWaitTimeout(); } - if (isset($customActionAttributes['parameterArray']) && $actionObject->getType() != 'pressKey') { + if (isset($customActionAttributes['parameterArray']) && $actionObject->getType() !== 'pressKey') { // validate the param array is in the correct format $this->validateParameterArray($customActionAttributes['parameterArray']); @@ -799,7 +799,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $function = trim($function, '"'); } // turn $javaVariable => \$javaVariable but not {$mftfVariable} - if ($actionObject->getType() == "executeJS") { + if ($actionObject->getType() === "executeJS") { $function = preg_replace('/(?getCustomActionAttributes() as $actionAttribute) { - if (is_array($actionAttribute) && $actionAttribute['nodeName'] == 'requiredEntity') { + if (is_array($actionAttribute) && $actionAttribute['nodeName'] === 'requiredEntity') { //append ActionGroup if provided $requiredEntityActionGroup = $actionAttribute['actionGroup'] ?? null; $requiredEntityKeys[] = $actionAttribute['createDataKey'] . $requiredEntityActionGroup; @@ -977,7 +977,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato // Build array of requiredEntities $requiredEntityKeys = []; foreach ($actionObject->getCustomActionAttributes() as $actionAttribute) { - if (is_array($actionAttribute) && $actionAttribute['nodeName'] == 'requiredEntity') { + if (is_array($actionAttribute) && $actionAttribute['nodeName'] === 'requiredEntity') { //append ActionGroup if provided $requiredEntityActionGroup = $actionAttribute['actionGroup'] ?? null; $requiredEntityKeys[] = $actionAttribute['createDataKey'] . $requiredEntityActionGroup; @@ -1012,7 +1012,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato // Build array of requiredEntities $requiredEntityKeys = []; foreach ($actionObject->getCustomActionAttributes() as $actionAttribute) { - if (is_array($actionAttribute) && $actionAttribute['nodeName'] == 'requiredEntity') { + if (is_array($actionAttribute) && $actionAttribute['nodeName'] === 'requiredEntity') { $requiredEntityActionGroup = $actionAttribute['actionGroup'] ?? null; $requiredEntityKeys[] = $actionAttribute['createDataKey'] . $requiredEntityActionGroup; } @@ -1587,7 +1587,7 @@ private function replaceMatchesIntoArg($matches, &$outputArg) $replacement = null; $delimiter = '$'; $variable = $this->stripAndSplitReference($match, $delimiter); - if (count($variable) != 2) { + if (count($variable) !== 2) { throw new \Exception( "Invalid Persisted Entity Reference: {$match}. Test persisted entity references must follow {$delimiter}entityStepKey.field{$delimiter} format." @@ -1639,7 +1639,7 @@ private function processQuoteBreaks($match, $argument, $replacement) */ private function resolveStepKeyReferences($input, $actionGroupOrigin, $matchAll = false) { - if ($actionGroupOrigin == null) { + if ($actionGroupOrigin === null) { return $input; } $output = $input; @@ -1701,7 +1701,7 @@ private function wrapFunctionArgsWithQuotes($functionRegex, $input) foreach ($allArguments as $argument) { $argument = trim($argument); - if ($argument[0] == self::ARRAY_WRAP_OPEN) { + if ($argument[0] === self::ARRAY_WRAP_OPEN) { $replacement = $this->wrapParameterArray($this->addUniquenessToParamArray($argument)); } elseif (is_numeric($argument)) { $replacement = $argument; @@ -1948,7 +1948,7 @@ private function addUniquenessFunctionCall($input, $wrapWithDoubleQuotes = true) */ private function wrapWithDoubleQuotes($input) { - if ($input == null) { + if ($input === null) { return ''; } //Only replace " with \" so that it doesn't break outer string. diff --git a/src/Magento/FunctionalTestingFramework/Util/Validation/DuplicateNodeValidationUtil.php b/src/Magento/FunctionalTestingFramework/Util/Validation/DuplicateNodeValidationUtil.php index 0c323a2dd..2eba2c493 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Validation/DuplicateNodeValidationUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Validation/DuplicateNodeValidationUtil.php @@ -65,10 +65,10 @@ public function validateChildUniqueness(\DOMElement $parentNode, $filename, $par $withoutDuplicates = array_unique($keyValues); - if (count($withoutDuplicates) != count($keyValues)) { + if (count($withoutDuplicates) !== count($keyValues)) { $duplicates = array_diff_assoc($keyValues, $withoutDuplicates); $keyError = ""; - foreach ($duplicates as $duplicateKey => $duplicateValue) { + foreach ($duplicates as $duplicateValue) { $keyError .= "\t{$this->uniqueKey}: {$duplicateValue} is used more than once."; if ($parentKey !== null) { $keyError .=" (Parent: {$parentKey})"; diff --git a/src/Magento/FunctionalTestingFramework/Util/Validation/SingleNodePerFileValidationUtil.php b/src/Magento/FunctionalTestingFramework/Util/Validation/SingleNodePerFileValidationUtil.php index c560349be..0fd440888 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Validation/SingleNodePerFileValidationUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Validation/SingleNodePerFileValidationUtil.php @@ -43,7 +43,7 @@ public function validateSingleNodeForTag($dom, $tag, $filename = '') { $tagNodes = $dom->getElementsByTagName($tag); $count = $tagNodes->length; - if ($count == 1) { + if ($count === 1) { return; } From 738b490af5e048eb7cb7ab447e9e712ea0690719 Mon Sep 17 00:00:00 2001 From: bohdan-harniuk Date: Thu, 19 Aug 2021 17:00:40 +0300 Subject: [PATCH 077/674] MFTF-33780: Fixed verification tests --- .../FunctionalTestingFramework/Test/Objects/ActionObject.php | 4 ++-- .../Util/Sorter/ParallelGroupSorter.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index ed5cc0936..aec38c9a5 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -290,7 +290,7 @@ public function resolveReferences() $this->resolveUrlReference(); $this->resolveDataInputReferences(); $this->validateTimezoneAttribute(); - if ($this->getType() === "deleteData") { + if ($this->getType() === 'deleteData') { $this->validateMutuallyExclusiveAttributes(self::DELETE_DATA_MUTUAL_EXCLUSIVE_ATTRIBUTES); } } @@ -697,7 +697,7 @@ private function resolveEntityDataObjectReference($obj, $match) { list(,$objField) = $this->stripAndSplitReference($match); - if (strpos($objField, '[') === true) { + if (strpos($objField, '[') !== false) { // Access ... $parts = explode('[', $objField); $name = $parts[0]; diff --git a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php index 612d32fd6..74f5af3ca 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php +++ b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php @@ -146,7 +146,7 @@ private function getSuiteGroupCounts($suiteNameToTestSize, $testNameToSize, $gro // Calculate test group time for ceiling $ceilSuiteNameToGroupCount = $this->getSuiteGroupCountFromGroupTime($suiteNameToTestSize, $ceilSuiteGroupTime); $ceilSuiteGroupTotal = array_sum($ceilSuiteNameToGroupCount); - $ceilTestGroupTotal = $groupTotal - $ceilSuiteGroupTotal; + $ceilTestGroupTotal = (int) $groupTotal - (int) $ceilSuiteGroupTotal; if ($ceilTestGroupTotal === 0) { $ceilTestGroupTime = 0; From 964981508dd2e9fcb7a9540cfebab6d1d99a2e1f Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 26 Aug 2021 11:19:01 -0500 Subject: [PATCH 078/674] MQE-2873: allure dependency - repo name change --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index 226426ef8..122825b76 100644 --- a/composer.lock +++ b/composer.lock @@ -72,12 +72,12 @@ "version": "1.3.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": "f64b69afeff472c564a4e2379efb2b69c430ec5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-commons/zipball/f64b69afeff472c564a4e2379efb2b69c430ec5a", + "url": "https://api.github.com/repos/allure-framework/allure-php-api/zipball/f64b69afeff472c564a4e2379efb2b69c430ec5a", "reference": "f64b69afeff472c564a4e2379efb2b69c430ec5a", "shasum": "" }, @@ -120,7 +120,7 @@ ], "support": { "email": "allure@yandex-team.ru", - "issues": "https://github.com/allure-framework/allure-php-commons/issues", + "issues": "https://github.com/allure-framework/allure-php-api/issues", "source": "https://github.com/allure-framework/allure-php-api" }, "time": "2021-03-26T14:32:27+00:00" @@ -8467,5 +8467,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } From 7b246aff9ab20f9f345cdd17945ea9a2564d65ed Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 26 Aug 2021 13:46:16 -0500 Subject: [PATCH 079/674] MQE-2873: allure dependency - repo name change --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 741a15260..a5dcc7dd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ Magento Functional Testing Framework Changelog ================================================ +3.6.1 +--------- + +### Enhancements + +* Maintainability + * Updated allure dependencies to pull package from new repo `allure-framework/allure-php-api`. + 3.6.0 --------- From a2e2cc716cf8325f8075acac01b263b22d7c8e34 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 26 Aug 2021 14:00:29 -0500 Subject: [PATCH 080/674] MQE-2873: allure dependency - repo name change --- composer.json | 2 +- composer.lock | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index bdf92ca3d..88029c93d 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": "3.6.0", + "version": "3.6.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 122825b76..422d5f39e 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": "9bec96d8a169a4286803657bbf61004c", + "content-hash": "4827eceed3051f9eb57bfb47aff974dc", "packages": [ { "name": "allure-framework/allure-codeception", @@ -1361,6 +1361,7 @@ "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" }, { From 1ed0a11aba9866a1908cc14fb0b0e0cb4e0a6f7e Mon Sep 17 00:00:00 2001 From: eduard13 Date: Wed, 1 Sep 2021 12:25:35 +0300 Subject: [PATCH 081/674] Removing the Guzzle6Transport's dependency --- composer.json | 2 +- composer.lock | 101 ++++++++---------- .../Handlers/SecretStorage/VaultStorage.php | 12 ++- 3 files changed, 55 insertions(+), 60 deletions(-) diff --git a/composer.json b/composer.json index 1d9ac37b4..ae040423f 100755 --- a/composer.json +++ b/composer.json @@ -23,7 +23,7 @@ "codeception/module-webdriver": "^1.0", "composer/composer": "^1.9||^2.0", "csharpru/vault-php": "^4.2.1", - "csharpru/vault-php-guzzle6-transport": "^2.0", + "guzzlehttp/guzzle": "^7.3.0", "hoa/console": "~3.0", "monolog/monolog": "^2.3", "mustache/mustache": "~2.5", diff --git a/composer.lock b/composer.lock index 72c28adbd..b6065e228 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": "1a03b6b0a4885e0049c74d187c70836c", + "content-hash": "edfa5cf6f951445f14be6d5deb535db3", "packages": [ { "name": "allure-framework/allure-codeception", @@ -1325,49 +1325,6 @@ }, "time": "2021-05-21T06:39:35+00:00" }, - { - "name": "csharpru/vault-php-guzzle6-transport", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/CSharpRU/vault-php-guzzle6-transport.git", - "reference": "33c392120ac9f253b62b034e0e8ffbbdb3513bd8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/CSharpRU/vault-php-guzzle6-transport/zipball/33c392120ac9f253b62b034e0e8ffbbdb3513bd8", - "reference": "33c392120ac9f253b62b034e0e8ffbbdb3513bd8", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "~6.2", - "guzzlehttp/promises": "^1.3", - "guzzlehttp/psr7": "^1.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "VaultTransports\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Yaroslav Lukyanov", - "email": "c_sharp@mail.ru" - } - ], - "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" - }, { "name": "doctrine/annotations", "version": "1.13.2", @@ -1591,37 +1548,44 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.5.5", + "version": "7.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" + "reference": "7008573787b430c1c1f650e3722d9bba59967628" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", - "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7008573787b430c1c1f650e3722d9bba59967628", + "reference": "7008573787b430c1c1f650e3722d9bba59967628", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17.0" + "guzzlehttp/promises": "^1.4", + "guzzlehttp/psr7": "^1.7 || ^2.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.5 || ^9.3.5", "psr/log": "^1.1" }, "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.5-dev" + "dev-master": "7.3-dev" } }, "autoload": { @@ -1641,6 +1605,11 @@ "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "Guzzle is a PHP HTTP client library", @@ -1651,14 +1620,34 @@ "framework", "http", "http client", + "psr-18", + "psr-7", "rest", "web service" ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/6.5" + "source": "https://github.com/guzzle/guzzle/tree/7.3.0" }, - "time": "2020-06-16T21:01:06+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://github.com/alexeyshockov", + "type": "github" + }, + { + "url": "https://github.com/gmponos", + "type": "github" + } + ], + "time": "2021-03-23T11:33:13+00:00" }, { "name": "guzzlehttp/promises", diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/VaultStorage.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/VaultStorage.php index 39839e8f9..cc0b3e7a8 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/VaultStorage.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/VaultStorage.php @@ -6,12 +6,12 @@ namespace Magento\FunctionalTestingFramework\DataGenerator\Handlers\SecretStorage; +use GuzzleHttp\Client as GuzzleClient; use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; use Vault\Client; -use VaultTransports\Guzzle6Transport; class VaultStorage extends BaseStorage { @@ -78,8 +78,14 @@ public function __construct($baseUrl, $secretBasePath) { parent::__construct(); if (null === $this->client) { - // Creating the client using Guzzle6 Transport and passing a custom url - $this->client = new Client(new Guzzle6Transport(['base_uri' => $baseUrl])); + // client configuration and override http errors settings + $config = [ + 'timeout' => 15, + 'base_uri' => $baseUrl, + 'http_errors' => false + ]; + + $this->client = new Client(new GuzzleClient($config)); $this->secretBasePath = $secretBasePath; } $this->readVaultTokenFromFileSystem(); From 9110451b88663bdfc6773961c27a4419fea54d36 Mon Sep 17 00:00:00 2001 From: Maksym Aposov Date: Thu, 9 Sep 2021 12:23:53 -0500 Subject: [PATCH 082/674] AC-1193: Fix broken MFTF tests --- dev/tests/unit/Util/EntityDataObjectBuilder.php | 3 ++- dev/tests/unit/Util/OperationElementBuilder.php | 3 ++- .../DataGenerator/Persist/OperationDataArrayResolver.php | 2 +- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/dev/tests/unit/Util/EntityDataObjectBuilder.php b/dev/tests/unit/Util/EntityDataObjectBuilder.php index dfe7d6836..82496d2ce 100644 --- a/dev/tests/unit/Util/EntityDataObjectBuilder.php +++ b/dev/tests/unit/Util/EntityDataObjectBuilder.php @@ -18,7 +18,8 @@ class EntityDataObjectBuilder "name" => "Hopper", "gpa" => "3.5678", "phone" => "5555555", - "isprimary" => "true" + "isprimary" => "true", + "empty_string" => "" ]; /** diff --git a/dev/tests/unit/Util/OperationElementBuilder.php b/dev/tests/unit/Util/OperationElementBuilder.php index 2c2a4d9da..69e848de1 100644 --- a/dev/tests/unit/Util/OperationElementBuilder.php +++ b/dev/tests/unit/Util/OperationElementBuilder.php @@ -20,7 +20,8 @@ class OperationElementBuilder 'name' => 'string', 'gpa' => 'number', 'phone' => 'integer', - 'isPrimary' => 'boolean' + 'isPrimary' => 'boolean', + 'empty_string' => 'string' ]; /** diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/OperationDataArrayResolver.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/OperationDataArrayResolver.php index 431ab5d4e..3266f5a24 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/OperationDataArrayResolver.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/OperationDataArrayResolver.php @@ -403,7 +403,7 @@ private function resolvePrimitiveReferenceElement($entityObject, $operationEleme // If data was defined at all, attempt to put it into operation data array // If data was not defined, and element is required, throw exception // If no data is defined, don't input defaults per primitive into operation data array - if ($elementData !== null) { + if ($elementData !== null && $elementData !== '') { if (array_key_exists($operationElement->getKey(), $entityObject->getUniquenessData())) { $uniqueData = $entityObject->getUniquenessDataByName($operationElement->getKey()); if ($uniqueData === 'suffix') { diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index fbf530fd8..17c045977 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1948,7 +1948,7 @@ private function addUniquenessFunctionCall($input, $wrapWithDoubleQuotes = true) */ private function wrapWithDoubleQuotes($input) { - if ($input === null) { + if ($input === null || $input === '') { return ''; } //Only replace " with \" so that it doesn't break outer string. From 5ba5c537050813adf266315ac7e3a1183af87e76 Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Thu, 9 Sep 2021 17:33:48 -0500 Subject: [PATCH 083/674] MQE-2920: mftf 3.7.0 release --- CHANGELOG.md | 34 +++++++++++++++++++++++++++++++++- composer.json | 2 +- composer.lock | 5 +++-- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5dcc7dd2..25271e6e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,38 @@ Magento Functional Testing Framework Changelog ================================================ -3.6.1 +3.7.0 +--------- + +### GitHub Pull Requests: + +* [#842](https://github.com/magento/magento2-functional-testing-framework/pull/842) -- Eliminated AspectMock from FileStorageTest +* [#843](https://github.com/magento/magento2-functional-testing-framework/pull/843) -- Eliminated AspectMock from ObjectExtensionUtilTest +* [#844](https://github.com/magento/magento2-functional-testing-framework/pull/844) -- Eliminated AspectMock from TestObjectHandlerTest +* [#845](https://github.com/magento/magento2-functional-testing-framework/pull/845) -- Eliminated AspectMock from SuiteObjectHandlerTest +* [#846](https://github.com/magento/magento2-functional-testing-framework/pull/846) -- Eliminated AspectMock from ActionGroupObjectTest +* [#847](https://github.com/magento/magento2-functional-testing-framework/pull/847) -- Removed not used mocked object +* [#848](https://github.com/magento/magento2-functional-testing-framework/pull/848) -- Eliminated AspectMock usage from ActionObjectTest +* [#850](https://github.com/magento/magento2-functional-testing-framework/pull/850) -- Eliminated AspectMock from TestGeneratorTest +* [#852](https://github.com/magento/magento2-functional-testing-framework/pull/852) -- Eliminated AspectMock from ModuleResolverTest +* [#853](https://github.com/magento/magento2-functional-testing-framework/pull/853) -- Eliminated AspectMock from PersistedObjectHandlerTest +* [#855](https://github.com/magento/magento2-functional-testing-framework/pull/855) -- Eliminated AspectMock from OperationDataArrayResolverTest +* [#856](https://github.com/magento/magento2-functional-testing-framework/pull/856) -- Eliminated AspectMock from DataExtensionUtilTest +* [#857](https://github.com/magento/magento2-functional-testing-framework/pull/857) -- Eliminated AspectMock from ParallelGroupSorterTest +* [#859](https://github.com/magento/magento2-functional-testing-framework/pull/859) -- Eliminated AspectMock usage from SuiteGeneratorTest +* [#861](https://github.com/magento/magento2-functional-testing-framework/pull/861) -- Eliminated aspect mock from mock module resolver builder +* [#862](https://github.com/magento/magento2-functional-testing-framework/pull/862) -- Eliminated AspectMock where it was imported but never used +* [#863](https://github.com/magento/magento2-functional-testing-framework/pull/863) -- Eliminated AspectMock from MagentoTestCase +* [#864](https://github.com/magento/magento2-functional-testing-framework/pull/864) -- Eliminated AspectMock usage from TestLoggingUtil +* [#865](https://github.com/magento/magento2-functional-testing-framework/pull/865) -- Eliminated aspect mock from object handler uti +* [#866](https://github.com/magento/magento2-functional-testing-framework/pull/866) -- Added access/secret key config parameters +* [#867](https://github.com/magento/magento2-functional-testing-framework/pull/867) -- Added empty query and fragment testing to the UrlFormatterTest +* [#868](https://github.com/magento/magento2-functional-testing-framework/pull/868) -- PHP 8 support - fix code related to changes in CURL +* [#869](https://github.com/magento/magento2-functional-testing-framework/pull/869) -- The squizlabs/php_codesniffer composer dependency has been updated to version 3.6.0 +* [#870](https://github.com/magento/magento2-functional-testing-framework/pull/870) -- Removing the csharpru/vault-php-guzzle6-transport not needed dependency +* [#871](https://github.com/magento/magento2-functional-testing-framework/pull/871) -- Changed loose comparisons into strict +* [#872](https://github.com/magento/magento2-functional-testing-framework/pull/872) -- Fix broken MFTF tests + + 3.6.1 --------- ### Enhancements diff --git a/composer.json b/composer.json index ae040423f..1550c0298 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": "3.6.1", + "version": "3.7.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index b6065e228..575d863a7 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": "edfa5cf6f951445f14be6d5deb535db3", + "content-hash": "b1921bd26a93634cba6000ef524db2c9", "packages": [ { "name": "allure-framework/allure-codeception", @@ -5317,6 +5317,7 @@ "type": "github" } ], + "abandoned": true, "time": "2020-09-28T06:45:17+00:00" }, { @@ -8288,5 +8289,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.0.0" } From 829a82534551adec7279dfbbfa3091f480e04c4f Mon Sep 17 00:00:00 2001 From: Karyna Date: Fri, 1 Oct 2021 12:19:16 +0300 Subject: [PATCH 084/674] add check for isBuiltin method --- .../FunctionalTestingFramework/Code/Reader/ClassReader.php | 6 ++++-- .../FunctionalTestingFramework/System/Code/ClassReader.php | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Code/Reader/ClassReader.php b/src/Magento/FunctionalTestingFramework/Code/Reader/ClassReader.php index 3d359a5f2..f3e67e35b 100644 --- a/src/Magento/FunctionalTestingFramework/Code/Reader/ClassReader.php +++ b/src/Magento/FunctionalTestingFramework/Code/Reader/ClassReader.php @@ -13,6 +13,7 @@ class ClassReader implements ClassReaderInterface * @param string $className * @return array|null * @throws \ReflectionException + * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function getConstructor($className) { @@ -24,8 +25,9 @@ public function getConstructor($className) /** @var $parameter \ReflectionParameter */ foreach ($constructor->getParameters() as $parameter) { try { - $name = $parameter->getType() && !$parameter->getType()->isBuiltin() - ? new \ReflectionClass($parameter->getType()->getName()) + $paramType = $parameter->getType(); + $name = ($paramType && method_exists($paramType, 'isBuiltin') && !$paramType->isBuiltin()) + ? new \ReflectionClass($paramType->getName()) : null; $result[] = [ $parameter->getName(), diff --git a/src/Magento/FunctionalTestingFramework/System/Code/ClassReader.php b/src/Magento/FunctionalTestingFramework/System/Code/ClassReader.php index 1ccb28cc6..8408f361b 100644 --- a/src/Magento/FunctionalTestingFramework/System/Code/ClassReader.php +++ b/src/Magento/FunctionalTestingFramework/System/Code/ClassReader.php @@ -20,6 +20,7 @@ class ClassReader * @param string $method * @return array|null * @throws \ReflectionException + * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function getParameters($className, $method) { @@ -31,8 +32,9 @@ public function getParameters($className, $method) /** @var $parameter \ReflectionParameter */ foreach ($method->getParameters() as $parameter) { try { - $name = $parameter->getType() && !$parameter->getType()->isBuiltin() - ? new \ReflectionClass($parameter->getType()->getName()) + $paramType = $parameter->getType(); + $name = ($paramType && method_exists($paramType, 'isBuiltin') && !$paramType->isBuiltin()) + ? new \ReflectionClass($paramType->getName()) : null; $result[$parameter->getName()] = [ $parameter->getName(), From d691ce4a4813a057cef9127b087a3cb99b8ac2ee Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 14 Oct 2021 13:19:38 -0500 Subject: [PATCH 085/674] MQE-2978: [MFTF] Investigate removal of hoa/console --- .github/workflows/main.yml | 8 +- composer.json | 1 - composer.lock | 1118 +++++------------ .../Console/Codecept/CodeceptCommandUtil.php | 2 + .../Util/Iterator/AbstractIterator.php | 14 +- .../Util/Iterator/File.php | 2 +- 6 files changed, 322 insertions(+), 823 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cc7811a75..03bdbff75 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', '7.4', '8.0'] + php-versions: ['7.3', '7.4', '8.0', '8.1'] steps: - uses: actions/checkout@v2 @@ -54,7 +54,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3', '7.4', '8.0'] + php-versions: ['7.3', '7.4', '8.0', '8.1'] steps: - uses: actions/checkout@v2 @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3', '7.4', '8.0'] + php-versions: ['7.3', '7.4', '8.0', '8.1'] steps: - uses: actions/checkout@v2 @@ -118,7 +118,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3', '7.4', '8.0'] + php-versions: ['7.3', '7.4', '8.0', '8.1'] services: chrome: diff --git a/composer.json b/composer.json index 1550c0298..a7502b067 100755 --- a/composer.json +++ b/composer.json @@ -24,7 +24,6 @@ "composer/composer": "^1.9||^2.0", "csharpru/vault-php": "^4.2.1", "guzzlehttp/guzzle": "^7.3.0", - "hoa/console": "~3.0", "monolog/monolog": "^2.3", "mustache/mustache": "~2.5", "nikic/php-parser": "^4.4", diff --git a/composer.lock b/composer.lock index 575d863a7..061c9d862 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": "b1921bd26a93634cba6000ef524db2c9", + "content-hash": "8dc05529156aa036fdfe184d1b174c49", "packages": [ { "name": "allure-framework/allure-codeception", @@ -125,21 +125,72 @@ }, "time": "2021-03-26T14:32:27+00:00" }, + { + "name": "aws/aws-crt-php", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/awslabs/aws-crt-php.git", + "reference": "3942776a8c99209908ee0b287746263725685732" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/3942776a8c99209908ee0b287746263725685732", + "reference": "3942776a8c99209908ee0b287746263725685732", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|^5.4.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "AWS SDK Common Runtime Team", + "email": "aws-sdk-common-runtime@amazon.com" + } + ], + "description": "AWS Common Runtime for PHP", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "crt", + "sdk" + ], + "support": { + "issues": "https://github.com/awslabs/aws-crt-php/issues", + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.0.2" + }, + "time": "2021-09-03T22:57:30+00:00" + }, { "name": "aws/aws-sdk-php", - "version": "3.191.5", + "version": "3.198.4", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "c003e59f8976f6fe045c27f6afc5d5004317f39b" + "reference": "b0b95cf0fa287e5b5db73ceafaf836950ede76ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c003e59f8976f6fe045c27f6afc5d5004317f39b", - "reference": "c003e59f8976f6fe045c27f6afc5d5004317f39b", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b0b95cf0fa287e5b5db73ceafaf836950ede76ff", + "reference": "b0b95cf0fa287e5b5db73ceafaf836950ede76ff", "shasum": "" }, "require": { + "aws/aws-crt-php": "^1.0.2", "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", @@ -211,9 +262,9 @@ "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.191.5" + "source": "https://github.com/aws/aws-sdk-php/tree/3.198.4" }, - "time": "2021-08-26T18:16:35+00:00" + "time": "2021-10-13T18:16:14+00:00" }, { "name": "beberlei/assert", @@ -284,25 +335,24 @@ }, { "name": "behat/gherkin", - "version": "v4.8.0", + "version": "v4.9.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "2391482cd003dfdc36b679b27e9f5326bd656acd" + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/2391482cd003dfdc36b679b27e9f5326bd656acd", - "reference": "2391482cd003dfdc36b679b27e9f5326bd656acd", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/0bc8d1e30e96183e4f36db9dc79caead300beff4", + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4", "shasum": "" }, "require": { "php": "~7.2|~8.0" }, "require-dev": { - "cucumber/cucumber": "dev-gherkin-16.0.0", + "cucumber/cucumber": "dev-gherkin-22.0.0", "phpunit/phpunit": "~8|~9", - "symfony/phpunit-bridge": "~3|~4|~5", "symfony/yaml": "~3|~4|~5" }, "suggest": { @@ -311,7 +361,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-master": "4.x-dev" } }, "autoload": { @@ -342,9 +392,9 @@ ], "support": { "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.8.0" + "source": "https://github.com/Behat/Gherkin/tree/v4.9.0" }, - "time": "2021-02-04T12:44:21+00:00" + "time": "2021-10-12T13:05:09+00:00" }, { "name": "brick/math", @@ -658,16 +708,16 @@ }, { "name": "codeception/module-webdriver", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/Codeception/module-webdriver.git", - "reference": "0b043cedebdb62d6706d9823f1c17bd0f26d831d" + "reference": "baa18b7bf70aa024012f967b5ce5021e1faa9151" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/0b043cedebdb62d6706d9823f1c17bd0f26d831d", - "reference": "0b043cedebdb62d6706d9823f1c17bd0f26d831d", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/baa18b7bf70aa024012f967b5ce5021e1faa9151", + "reference": "baa18b7bf70aa024012f967b5ce5021e1faa9151", "shasum": "" }, "require": { @@ -708,9 +758,9 @@ ], "support": { "issues": "https://github.com/Codeception/module-webdriver/issues", - "source": "https://github.com/Codeception/module-webdriver/tree/1.3.0" + "source": "https://github.com/Codeception/module-webdriver/tree/1.4.0" }, - "time": "2021-08-22T07:21:13+00:00" + "time": "2021-09-02T12:01:02+00:00" }, { "name": "codeception/phpunit-wrapper", @@ -797,16 +847,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.2.10", + "version": "1.2.11", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8" + "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/9fdb22c2e97a614657716178093cd1da90a64aa8", - "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", + "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", "shasum": "" }, "require": { @@ -818,7 +868,7 @@ "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" + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" }, "type": "library", "extra": { @@ -853,7 +903,7 @@ "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.10" + "source": "https://github.com/composer/ca-bundle/tree/1.2.11" }, "funding": [ { @@ -869,20 +919,20 @@ "type": "tidelift" } ], - "time": "2021-06-07T13:58:28+00:00" + "time": "2021-09-25T20:32:43+00:00" }, { "name": "composer/composer", - "version": "2.1.6", + "version": "2.1.9", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "e5cac5f9d2354d08b67f1d21c664ae70d748c603" + "reference": "e558c88f28d102d497adec4852802c0dc14c7077" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/e5cac5f9d2354d08b67f1d21c664ae70d748c603", - "reference": "e5cac5f9d2354d08b67f1d21c664ae70d748c603", + "url": "https://api.github.com/repos/composer/composer/zipball/e558c88f28d102d497adec4852802c0dc14c7077", + "reference": "e558c88f28d102d497adec4852802c0dc14c7077", "shasum": "" }, "require": { @@ -951,7 +1001,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.1.6" + "source": "https://github.com/composer/composer/tree/2.1.9" }, "funding": [ { @@ -967,7 +1017,7 @@ "type": "tidelift" } ], - "time": "2021-08-19T15:11:08+00:00" + "time": "2021-10-05T07:47:38+00:00" }, { "name": "composer/metadata-minifier", @@ -1651,16 +1701,16 @@ }, { "name": "guzzlehttp/promises", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" + "reference": "136a635e2b4a49b9d79e9c8fee267ffb257fdba0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", - "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", + "url": "https://api.github.com/repos/guzzle/promises/zipball/136a635e2b4a49b9d79e9c8fee267ffb257fdba0", + "reference": "136a635e2b4a49b9d79e9c8fee267ffb257fdba0", "shasum": "" }, "require": { @@ -1672,7 +1722,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.5-dev" } }, "autoload": { @@ -1688,10 +1738,25 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], "description": "Guzzle promises library", @@ -1700,22 +1765,36 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.4.1" + "source": "https://github.com/guzzle/promises/tree/1.5.0" }, - "time": "2021-03-07T09:25:29+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2021-10-07T13:05:22+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.8.2", + "version": "1.8.3", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "dc960a912984efb74d0a90222870c72c87f10c91" + "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", - "reference": "dc960a912984efb74d0a90222870c72c87f10c91", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/1afdd860a2566ed3c2b0b4a3de6e23434a79ec85", + "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85", "shasum": "" }, "require": { @@ -1752,13 +1831,34 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, { "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" } ], @@ -1775,630 +1875,23 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.2" - }, - "time": "2021-04-26T09:17:50+00:00" - }, - { - "name": "hoa/consistency", - "version": "1.17.05.02", - "source": { - "type": "git", - "url": "https://github.com/hoaproject/Consistency.git", - "reference": "fd7d0adc82410507f332516faf655b6ed22e4c2f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hoaproject/Consistency/zipball/fd7d0adc82410507f332516faf655b6ed22e4c2f", - "reference": "fd7d0adc82410507f332516faf655b6ed22e4c2f", - "shasum": "" - }, - "require": { - "hoa/exception": "~1.0", - "php": ">=5.5.0" - }, - "require-dev": { - "hoa/stream": "~1.0", - "hoa/test": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Hoa\\Consistency\\": "." - }, - "files": [ - "Prelude.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Ivan Enderlin", - "email": "ivan.enderlin@hoa-project.net" - }, - { - "name": "Hoa community", - "homepage": "https://hoa-project.net/" - } - ], - "description": "The Hoa\\Consistency library.", - "homepage": "https://hoa-project.net/", - "keywords": [ - "autoloader", - "callable", - "consistency", - "entity", - "flex", - "keyword", - "library" - ], - "support": { - "docs": "https://central.hoa-project.net/Documentation/Library/Consistency", - "email": "support@hoa-project.net", - "forum": "https://users.hoa-project.net/", - "irc": "irc://chat.freenode.net/hoaproject", - "issues": "https://github.com/hoaproject/Consistency/issues", - "source": "https://central.hoa-project.net/Resource/Library/Consistency" - }, - "time": "2017-05-02T12:18:12+00:00" - }, - { - "name": "hoa/console", - "version": "3.17.05.02", - "source": { - "type": "git", - "url": "https://github.com/hoaproject/Console.git", - "reference": "e231fd3ea70e6d773576ae78de0bdc1daf331a66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hoaproject/Console/zipball/e231fd3ea70e6d773576ae78de0bdc1daf331a66", - "reference": "e231fd3ea70e6d773576ae78de0bdc1daf331a66", - "shasum": "" - }, - "require": { - "hoa/consistency": "~1.0", - "hoa/event": "~1.0", - "hoa/exception": "~1.0", - "hoa/file": "~1.0", - "hoa/protocol": "~1.0", - "hoa/stream": "~1.0", - "hoa/ustring": "~4.0" - }, - "require-dev": { - "hoa/test": "~2.0" - }, - "suggest": { - "ext-pcntl": "To enable hoa://Event/Console/Window:resize.", - "hoa/dispatcher": "To use the console kit.", - "hoa/router": "To use the console kit." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Hoa\\Console\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Ivan Enderlin", - "email": "ivan.enderlin@hoa-project.net" - }, - { - "name": "Hoa community", - "homepage": "https://hoa-project.net/" - } - ], - "description": "The Hoa\\Console library.", - "homepage": "https://hoa-project.net/", - "keywords": [ - "autocompletion", - "chrome", - "cli", - "console", - "cursor", - "getoption", - "library", - "option", - "parser", - "processus", - "readline", - "terminfo", - "tput", - "window" - ], - "support": { - "docs": "https://central.hoa-project.net/Documentation/Library/Console", - "email": "support@hoa-project.net", - "forum": "https://users.hoa-project.net/", - "irc": "irc://chat.freenode.net/hoaproject", - "issues": "https://github.com/hoaproject/Console/issues", - "source": "https://central.hoa-project.net/Resource/Library/Console" - }, - "time": "2017-05-02T12:26:19+00:00" - }, - { - "name": "hoa/event", - "version": "1.17.01.13", - "source": { - "type": "git", - "url": "https://github.com/hoaproject/Event.git", - "reference": "6c0060dced212ffa3af0e34bb46624f990b29c54" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hoaproject/Event/zipball/6c0060dced212ffa3af0e34bb46624f990b29c54", - "reference": "6c0060dced212ffa3af0e34bb46624f990b29c54", - "shasum": "" + "source": "https://github.com/guzzle/psr7/tree/1.8.3" }, - "require": { - "hoa/consistency": "~1.0", - "hoa/exception": "~1.0" - }, - "require-dev": { - "hoa/test": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Hoa\\Event\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Ivan Enderlin", - "email": "ivan.enderlin@hoa-project.net" - }, - { - "name": "Hoa community", - "homepage": "https://hoa-project.net/" - } - ], - "description": "The Hoa\\Event library.", - "homepage": "https://hoa-project.net/", - "keywords": [ - "event", - "library", - "listener", - "observer" - ], - "support": { - "docs": "https://central.hoa-project.net/Documentation/Library/Event", - "email": "support@hoa-project.net", - "forum": "https://users.hoa-project.net/", - "irc": "irc://chat.freenode.net/hoaproject", - "issues": "https://github.com/hoaproject/Event/issues", - "source": "https://central.hoa-project.net/Resource/Library/Event" - }, - "time": "2017-01-13T15:30:50+00:00" - }, - { - "name": "hoa/exception", - "version": "1.17.01.16", - "source": { - "type": "git", - "url": "https://github.com/hoaproject/Exception.git", - "reference": "091727d46420a3d7468ef0595651488bfc3a458f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hoaproject/Exception/zipball/091727d46420a3d7468ef0595651488bfc3a458f", - "reference": "091727d46420a3d7468ef0595651488bfc3a458f", - "shasum": "" - }, - "require": { - "hoa/consistency": "~1.0", - "hoa/event": "~1.0" - }, - "require-dev": { - "hoa/test": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Hoa\\Exception\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Ivan Enderlin", - "email": "ivan.enderlin@hoa-project.net" - }, - { - "name": "Hoa community", - "homepage": "https://hoa-project.net/" - } - ], - "description": "The Hoa\\Exception library.", - "homepage": "https://hoa-project.net/", - "keywords": [ - "exception", - "library" - ], - "support": { - "docs": "https://central.hoa-project.net/Documentation/Library/Exception", - "email": "support@hoa-project.net", - "forum": "https://users.hoa-project.net/", - "irc": "irc://chat.freenode.net/hoaproject", - "issues": "https://github.com/hoaproject/Exception/issues", - "source": "https://central.hoa-project.net/Resource/Library/Exception" - }, - "time": "2017-01-16T07:53:27+00:00" - }, - { - "name": "hoa/file", - "version": "1.17.07.11", - "source": { - "type": "git", - "url": "https://github.com/hoaproject/File.git", - "reference": "35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hoaproject/File/zipball/35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca", - "reference": "35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca", - "shasum": "" - }, - "require": { - "hoa/consistency": "~1.0", - "hoa/event": "~1.0", - "hoa/exception": "~1.0", - "hoa/iterator": "~2.0", - "hoa/stream": "~1.0" - }, - "require-dev": { - "hoa/test": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Hoa\\File\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Ivan Enderlin", - "email": "ivan.enderlin@hoa-project.net" - }, - { - "name": "Hoa community", - "homepage": "https://hoa-project.net/" - } - ], - "description": "The Hoa\\File library.", - "homepage": "https://hoa-project.net/", - "keywords": [ - "Socket", - "directory", - "file", - "finder", - "library", - "link", - "temporary" - ], - "support": { - "docs": "https://central.hoa-project.net/Documentation/Library/File", - "email": "support@hoa-project.net", - "forum": "https://users.hoa-project.net/", - "irc": "irc://chat.freenode.net/hoaproject", - "issues": "https://github.com/hoaproject/File/issues", - "source": "https://central.hoa-project.net/Resource/Library/File" - }, - "time": "2017-07-11T07:42:15+00:00" - }, - { - "name": "hoa/iterator", - "version": "2.17.01.10", - "source": { - "type": "git", - "url": "https://github.com/hoaproject/Iterator.git", - "reference": "d1120ba09cb4ccd049c86d10058ab94af245f0cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hoaproject/Iterator/zipball/d1120ba09cb4ccd049c86d10058ab94af245f0cc", - "reference": "d1120ba09cb4ccd049c86d10058ab94af245f0cc", - "shasum": "" - }, - "require": { - "hoa/consistency": "~1.0", - "hoa/exception": "~1.0" - }, - "require-dev": { - "hoa/test": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Hoa\\Iterator\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Ivan Enderlin", - "email": "ivan.enderlin@hoa-project.net" - }, - { - "name": "Hoa community", - "homepage": "https://hoa-project.net/" - } - ], - "description": "The Hoa\\Iterator library.", - "homepage": "https://hoa-project.net/", - "keywords": [ - "iterator", - "library" - ], - "support": { - "docs": "https://central.hoa-project.net/Documentation/Library/Iterator", - "email": "support@hoa-project.net", - "forum": "https://users.hoa-project.net/", - "irc": "irc://chat.freenode.net/hoaproject", - "issues": "https://github.com/hoaproject/Iterator/issues", - "source": "https://central.hoa-project.net/Resource/Library/Iterator" - }, - "time": "2017-01-10T10:34:47+00:00" - }, - { - "name": "hoa/protocol", - "version": "1.17.01.14", - "source": { - "type": "git", - "url": "https://github.com/hoaproject/Protocol.git", - "reference": "5c2cf972151c45f373230da170ea015deecf19e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hoaproject/Protocol/zipball/5c2cf972151c45f373230da170ea015deecf19e2", - "reference": "5c2cf972151c45f373230da170ea015deecf19e2", - "shasum": "" - }, - "require": { - "hoa/consistency": "~1.0", - "hoa/exception": "~1.0" - }, - "require-dev": { - "hoa/test": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Hoa\\Protocol\\": "." - }, - "files": [ - "Wrapper.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Ivan Enderlin", - "email": "ivan.enderlin@hoa-project.net" - }, - { - "name": "Hoa community", - "homepage": "https://hoa-project.net/" - } - ], - "description": "The Hoa\\Protocol library.", - "homepage": "https://hoa-project.net/", - "keywords": [ - "library", - "protocol", - "resource", - "stream", - "wrapper" - ], - "support": { - "docs": "https://central.hoa-project.net/Documentation/Library/Protocol", - "email": "support@hoa-project.net", - "forum": "https://users.hoa-project.net/", - "irc": "irc://chat.freenode.net/hoaproject", - "issues": "https://github.com/hoaproject/Protocol/issues", - "source": "https://central.hoa-project.net/Resource/Library/Protocol" - }, - "time": "2017-01-14T12:26:10+00:00" - }, - { - "name": "hoa/stream", - "version": "1.17.02.21", - "source": { - "type": "git", - "url": "https://github.com/hoaproject/Stream.git", - "reference": "3293cfffca2de10525df51436adf88a559151d82" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hoaproject/Stream/zipball/3293cfffca2de10525df51436adf88a559151d82", - "reference": "3293cfffca2de10525df51436adf88a559151d82", - "shasum": "" - }, - "require": { - "hoa/consistency": "~1.0", - "hoa/event": "~1.0", - "hoa/exception": "~1.0", - "hoa/protocol": "~1.0" - }, - "require-dev": { - "hoa/test": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Hoa\\Stream\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ + "funding": [ { - "name": "Ivan Enderlin", - "email": "ivan.enderlin@hoa-project.net" + "url": "https://github.com/GrahamCampbell", + "type": "github" }, { - "name": "Hoa community", - "homepage": "https://hoa-project.net/" - } - ], - "description": "The Hoa\\Stream library.", - "homepage": "https://hoa-project.net/", - "keywords": [ - "Context", - "bucket", - "composite", - "filter", - "in", - "library", - "out", - "protocol", - "stream", - "wrapper" - ], - "support": { - "docs": "https://central.hoa-project.net/Documentation/Library/Stream", - "email": "support@hoa-project.net", - "forum": "https://users.hoa-project.net/", - "irc": "irc://chat.freenode.net/hoaproject", - "issues": "https://github.com/hoaproject/Stream/issues", - "source": "https://central.hoa-project.net/Resource/Library/Stream" - }, - "time": "2017-02-21T16:01:06+00:00" - }, - { - "name": "hoa/ustring", - "version": "4.17.01.16", - "source": { - "type": "git", - "url": "https://github.com/hoaproject/Ustring.git", - "reference": "e6326e2739178799b1fe3fdd92029f9517fa17a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hoaproject/Ustring/zipball/e6326e2739178799b1fe3fdd92029f9517fa17a0", - "reference": "e6326e2739178799b1fe3fdd92029f9517fa17a0", - "shasum": "" - }, - "require": { - "hoa/consistency": "~1.0", - "hoa/exception": "~1.0" - }, - "require-dev": { - "hoa/test": "~2.0" - }, - "suggest": { - "ext-iconv": "ext/iconv must be present (or a third implementation) to use Hoa\\Ustring::transcode().", - "ext-intl": "To get a better Hoa\\Ustring::toAscii() and Hoa\\Ustring::compareTo()." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, - "autoload": { - "psr-4": { - "Hoa\\Ustring\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Ivan Enderlin", - "email": "ivan.enderlin@hoa-project.net" + "url": "https://github.com/Nyholm", + "type": "github" }, { - "name": "Hoa community", - "homepage": "https://hoa-project.net/" + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" } ], - "description": "The Hoa\\Ustring library.", - "homepage": "https://hoa-project.net/", - "keywords": [ - "library", - "search", - "string", - "unicode" - ], - "support": { - "docs": "https://central.hoa-project.net/Documentation/Library/Ustring", - "email": "support@hoa-project.net", - "forum": "https://users.hoa-project.net/", - "irc": "irc://chat.freenode.net/hoaproject", - "issues": "https://github.com/hoaproject/Ustring/issues", - "source": "https://central.hoa-project.net/Resource/Library/Ustring" - }, - "time": "2017-01-16T07:08:25+00:00" + "time": "2021-10-05T13:56:00+00:00" }, { "name": "jms/metadata", @@ -2629,24 +2122,24 @@ }, { "name": "monolog/monolog", - "version": "2.3.2", + "version": "2.3.5", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "71312564759a7db5b789296369c1a264efc43aad" + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/71312564759a7db5b789296369c1a264efc43aad", - "reference": "71312564759a7db5b789296369c1a264efc43aad", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", "shasum": "" }, "require": { "php": ">=7.2", - "psr/log": "^1.0.1" + "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0" + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" }, "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", @@ -2654,14 +2147,14 @@ "elasticsearch/elasticsearch": "^7", "graylog2/gelf-php": "^1.4.2", "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4", + "php-amqplib/php-amqplib": "~2.4 || ^3", "php-console/php-console": "^3.1.3", "phpspec/prophecy": "^1.6.1", "phpstan/phpstan": "^0.12.91", "phpunit/phpunit": "^8.5", "predis/predis": "^1.1", "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90 <7.0.1", + "ruflin/elastica": ">=0.90@dev", "swiftmailer/swiftmailer": "^5.3|^6.0" }, "suggest": { @@ -2669,8 +2162,11 @@ "doctrine/couchdb": "Allow sending log messages to a CouchDB server", "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", "ext-mbstring": "Allow to work properly with unicode symbols", "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", @@ -2709,7 +2205,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.3.2" + "source": "https://github.com/Seldaek/monolog/tree/2.3.5" }, "funding": [ { @@ -2721,7 +2217,7 @@ "type": "tidelift" } ], - "time": "2021-07-23T07:42:52+00:00" + "time": "2021-10-01T21:08:31+00:00" }, { "name": "mtdowling/jmespath.php", @@ -2894,16 +2390,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.12.0", + "version": "v4.13.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6608f01670c3cc5079e18c1dab1104e002579143" + "reference": "50953a2691a922aa1769461637869a0a2faa3f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6608f01670c3cc5079e18c1dab1104e002579143", - "reference": "6608f01670c3cc5079e18c1dab1104e002579143", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53", + "reference": "50953a2691a922aa1769461637869a0a2faa3f53", "shasum": "" }, "require": { @@ -2944,9 +2440,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.12.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0" }, - "time": "2021-07-21T10:44:31+00:00" + "time": "2021-09-20T12:20:58+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -3128,16 +2624,16 @@ }, { "name": "php-webdriver/webdriver", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "da16e39968f8dd5cfb7d07eef91dc2b731c69880" + "reference": "99d4856ed7dffcdf6a52eccd6551e83d8d557ceb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/da16e39968f8dd5cfb7d07eef91dc2b731c69880", - "reference": "da16e39968f8dd5cfb7d07eef91dc2b731c69880", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/99d4856ed7dffcdf6a52eccd6551e83d8d557ceb", + "reference": "99d4856ed7dffcdf6a52eccd6551e83d8d557ceb", "shasum": "" }, "require": { @@ -3146,20 +2642,19 @@ "ext-zip": "*", "php": "^5.6 || ~7.0 || ^8.0", "symfony/polyfill-mbstring": "^1.12", - "symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0" + "symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0 || ^6.0" }, "replace": { "facebook/webdriver": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.0", "ondram/ci-detector": "^2.1 || ^3.5 || ^4.0", "php-coveralls/php-coveralls": "^2.4", "php-mock/php-mock-phpunit": "^1.1 || ^2.0", "php-parallel-lint/php-parallel-lint": "^1.2", "phpunit/phpunit": "^5.7 || ^7 || ^8 || ^9", "squizlabs/php_codesniffer": "^3.5", - "symfony/var-dumper": "^3.3 || ^4.0 || ^5.0" + "symfony/var-dumper": "^3.3 || ^4.0 || ^5.0 || ^6.0" }, "suggest": { "ext-SimpleXML": "For Firefox profile creation" @@ -3188,9 +2683,9 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.11.1" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.12.0" }, - "time": "2021-05-21T15:12:49+00:00" + "time": "2021-10-14T09:30:02+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -3303,16 +2798,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.4.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", "shasum": "" }, "require": { @@ -3320,7 +2815,8 @@ "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "*" + "ext-tokenizer": "*", + "psalm/phar": "^4.8" }, "type": "library", "extra": { @@ -3346,39 +2842,39 @@ "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" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" }, - "time": "2020-09-17T18:55:26+00:00" + "time": "2021-10-02T14:08:47+00:00" }, { "name": "phpspec/prophecy", - "version": "1.13.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", + "php": "^7.2 || ~8.0, <8.2", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0", "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { - "phpspec/phpspec": "^6.0", + "phpspec/phpspec": "^6.0 || ^7.0", "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { @@ -3413,22 +2909,22 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.13.0" + "source": "https://github.com/phpspec/prophecy/tree/1.14.0" }, - "time": "2021-03-17T13:42:18+00:00" + "time": "2021-09-10T09:02:12+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "0.5.5", + "version": "0.5.7", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "ea0b17460ec38e20d7eb64e7ec49b5d44af5d28c" + "reference": "816e826ce0b7fb32098d8cb6de62511ce6021cea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/ea0b17460ec38e20d7eb64e7ec49b5d44af5d28c", - "reference": "ea0b17460ec38e20d7eb64e7ec49b5d44af5d28c", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/816e826ce0b7fb32098d8cb6de62511ce6021cea", + "reference": "816e826ce0b7fb32098d8cb6de62511ce6021cea", "shasum": "" }, "require": { @@ -3462,29 +2958,29 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/0.5.5" + "source": "https://github.com/phpstan/phpdoc-parser/tree/0.5.7" }, - "time": "2021-06-11T13:24:46+00:00" + "time": "2021-09-12T11:52:00+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.6", + "version": "9.2.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f6293e1b30a2354e8428e004689671b83871edde" + "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde", - "reference": "f6293e1b30a2354e8428e004689671b83871edde", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d4c798ed8d51506800b441f7a13ecb0f76f12218", + "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.10.2", + "nikic/php-parser": "^4.12.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -3533,7 +3029,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.7" }, "funding": [ { @@ -3541,7 +3037,7 @@ "type": "github" } ], - "time": "2021-03-28T07:26:59+00:00" + "time": "2021-09-17T05:39:03+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3786,16 +3282,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.8", + "version": "9.5.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "191768ccd5c85513b4068bdbe99bb6390c7d54fb" + "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/191768ccd5c85513b4068bdbe99bb6390c7d54fb", - "reference": "191768ccd5c85513b4068bdbe99bb6390c7d54fb", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", "shasum": "" }, "require": { @@ -3811,7 +3307,7 @@ "phar-io/version": "^3.0.2", "php": ">=7.3", "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.3", + "phpunit/php-code-coverage": "^9.2.7", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", @@ -3873,7 +3369,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.8" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10" }, "funding": [ { @@ -3885,7 +3381,7 @@ "type": "github" } ], - "time": "2021-07-31T15:17:34+00:00" + "time": "2021-09-25T07:38:51+00:00" }, { "name": "psr/cache", @@ -4240,16 +3736,16 @@ }, { "name": "ramsey/collection", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "eaca1dc1054ddd10cbd83c1461907bee6fb528fa" + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/eaca1dc1054ddd10cbd83c1461907bee6fb528fa", - "reference": "eaca1dc1054ddd10cbd83c1461907bee6fb528fa", + "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", "shasum": "" }, "require": { @@ -4303,7 +3799,7 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.2.1" + "source": "https://github.com/ramsey/collection/tree/1.2.2" }, "funding": [ { @@ -4315,28 +3811,29 @@ "type": "tidelift" } ], - "time": "2021-08-06T03:41:06+00:00" + "time": "2021-10-10T03:01:02+00:00" }, { "name": "ramsey/uuid", - "version": "4.2.1", + "version": "4.2.3", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "fe665a03df4f056aa65af552a96e1976df8c8dae" + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/fe665a03df4f056aa65af552a96e1976df8c8dae", - "reference": "fe665a03df4f056aa65af552a96e1976df8c8dae", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", "shasum": "" }, "require": { "brick/math": "^0.8 || ^0.9", "ext-json": "*", - "php": "^7.2 || ^8", + "php": "^7.2 || ^8.0", "ramsey/collection": "^1.0", - "symfony/polyfill-ctype": "^1.8" + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php80": "^1.14" }, "replace": { "rhumsaa/uuid": "self.version" @@ -4400,7 +3897,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.2.1" + "source": "https://github.com/ramsey/uuid/tree/4.2.3" }, "funding": [ { @@ -4412,7 +3909,7 @@ "type": "tidelift" } ], - "time": "2021-08-11T01:06:55+00:00" + "time": "2021-09-25T23:10:38+00:00" }, { "name": "react/promise", @@ -5317,7 +4814,6 @@ "type": "github" } ], - "abandoned": true, "time": "2020-09-28T06:45:17+00:00" }, { @@ -5617,16 +5113,16 @@ }, { "name": "symfony/console", - "version": "v4.4.29", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "8baf0bbcfddfde7d7225ae8e04705cfd1081cd7b" + "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8baf0bbcfddfde7d7225ae8e04705cfd1081cd7b", - "reference": "8baf0bbcfddfde7d7225ae8e04705cfd1081cd7b", + "url": "https://api.github.com/repos/symfony/console/zipball/a3f7189a0665ee33b50e9e228c46f50f5acbed22", + "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22", "shasum": "" }, "require": { @@ -5687,7 +5183,7 @@ "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.29" + "source": "https://github.com/symfony/console/tree/v4.4.30" }, "funding": [ { @@ -5703,7 +5199,7 @@ "type": "tidelift" } ], - "time": "2021-07-27T19:04:53+00:00" + "time": "2021-08-25T19:27:26+00:00" }, { "name": "symfony/css-selector", @@ -5840,16 +5336,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v4.4.27", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "958a128b184fcf0ba45ec90c0e88554c9327c2e9" + "reference": "2fe81680070043c4c80e7cedceb797e34f377bac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/958a128b184fcf0ba45ec90c0e88554c9327c2e9", - "reference": "958a128b184fcf0ba45ec90c0e88554c9327c2e9", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2fe81680070043c4c80e7cedceb797e34f377bac", + "reference": "2fe81680070043c4c80e7cedceb797e34f377bac", "shasum": "" }, "require": { @@ -5904,7 +5400,7 @@ "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.27" + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.30" }, "funding": [ { @@ -5920,7 +5416,7 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:41:52+00:00" + "time": "2021-08-04T20:31:23+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -6066,16 +5562,16 @@ }, { "name": "symfony/finder", - "version": "v5.3.4", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "17f50e06018baec41551a71a15731287dbaab186" + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/17f50e06018baec41551a71a15731287dbaab186", - "reference": "17f50e06018baec41551a71a15731287dbaab186", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", "shasum": "" }, "require": { @@ -6108,7 +5604,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.4" + "source": "https://github.com/symfony/finder/tree/v5.3.7" }, "funding": [ { @@ -6124,20 +5620,20 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:54:19+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.3.6", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "a8388f7b7054a7401997008ce9cd8c6b0ab7ac75" + "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a8388f7b7054a7401997008ce9cd8c6b0ab7ac75", - "reference": "a8388f7b7054a7401997008ce9cd8c6b0ab7ac75", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", + "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", "shasum": "" }, "require": { @@ -6181,7 +5677,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.3.6" + "source": "https://github.com/symfony/http-foundation/tree/v5.3.7" }, "funding": [ { @@ -6197,20 +5693,20 @@ "type": "tidelift" } ], - "time": "2021-07-27T17:08:17+00:00" + "time": "2021-08-27T11:20:35+00:00" }, { "name": "symfony/mime", - "version": "v5.3.4", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "633e4e8afe9e529e5599d71238849a4218dd497b" + "reference": "a756033d0a7e53db389618653ae991eba5a19a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/633e4e8afe9e529e5599d71238849a4218dd497b", - "reference": "633e4e8afe9e529e5599d71238849a4218dd497b", + "url": "https://api.github.com/repos/symfony/mime/zipball/a756033d0a7e53db389618653ae991eba5a19a11", + "reference": "a756033d0a7e53db389618653ae991eba5a19a11", "shasum": "" }, "require": { @@ -6264,7 +5760,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.3.4" + "source": "https://github.com/symfony/mime/tree/v5.3.8" }, "funding": [ { @@ -6280,7 +5776,7 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2021-09-10T12:30:38+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6931,16 +6427,16 @@ }, { "name": "symfony/process", - "version": "v4.4.27", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "0b7dc5599ac4aa6d7b936c8f7d10abae64f6cf7f" + "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0b7dc5599ac4aa6d7b936c8f7d10abae64f6cf7f", - "reference": "0b7dc5599ac4aa6d7b936c8f7d10abae64f6cf7f", + "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", + "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", "shasum": "" }, "require": { @@ -6973,7 +6469,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v4.4.27" + "source": "https://github.com/symfony/process/tree/v4.4.30" }, "funding": [ { @@ -6989,7 +6485,7 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:41:52+00:00" + "time": "2021-08-04T20:31:23+00:00" }, { "name": "symfony/service-contracts", @@ -7336,16 +6832,16 @@ }, { "name": "vlucas/phpdotenv", - "version": "v2.6.7", + "version": "v2.6.8", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "b786088918a884258c9e3e27405c6a4cf2ee246e" + "reference": "f1e2a35e53abe9322f0ab9ada689967e30055d40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/b786088918a884258c9e3e27405c6a4cf2ee246e", - "reference": "b786088918a884258c9e3e27405c6a4cf2ee246e", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/f1e2a35e53abe9322f0ab9ada689967e30055d40", + "reference": "f1e2a35e53abe9322f0ab9ada689967e30055d40", "shasum": "" }, "require": { @@ -7355,7 +6851,7 @@ "require-dev": { "ext-filter": "*", "ext-pcre": "*", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20" + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.21" }, "suggest": { "ext-filter": "Required to use the boolean validator.", @@ -7379,13 +6875,11 @@ "authors": [ { "name": "Graham Campbell", - "email": "graham@alt-three.com", - "homepage": "https://gjcampbell.co.uk/" + "email": "hello@gjcampbell.co.uk" }, { "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "https://vancelucas.com/" + "email": "vance@vancelucas.com" } ], "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", @@ -7396,7 +6890,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v2.6.7" + "source": "https://github.com/vlucas/phpdotenv/tree/v2.6.8" }, "funding": [ { @@ -7408,7 +6902,7 @@ "type": "tidelift" } ], - "time": "2021-01-20T14:39:13+00:00" + "time": "2021-10-02T19:02:17+00:00" }, { "name": "webmozart/assert", @@ -7637,27 +7131,27 @@ }, { "name": "gitonomy/gitlib", - "version": "v1.2.3", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/gitonomy/gitlib.git", - "reference": "d22f212b97fdb631ac73dfae65c194dc4cb0d227" + "reference": "e73e439590b194b0b250b516b22a68c7116e2f21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/d22f212b97fdb631ac73dfae65c194dc4cb0d227", - "reference": "d22f212b97fdb631ac73dfae65c194dc4cb0d227", + "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/e73e439590b194b0b250b516b22a68c7116e2f21", + "reference": "e73e439590b194b0b250b516b22a68c7116e2f21", "shasum": "" }, "require": { "ext-pcre": "*", "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.4 || ^5.0 || ^6.0" }, "require-dev": { "ext-fileinfo": "*", - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0", + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.20 || ^9.5.9", "psr/log": "^1.0" }, "suggest": { @@ -7677,7 +7171,7 @@ "authors": [ { "name": "Graham Campbell", - "email": "graham@alt-three.com" + "email": "hello@gjcampbell.co.uk" }, { "name": "Julien Didier", @@ -7695,7 +7189,7 @@ "description": "Library for accessing git", "support": { "issues": "https://github.com/gitonomy/gitlib/issues", - "source": "https://github.com/gitonomy/gitlib/tree/v1.2.3" + "source": "https://github.com/gitonomy/gitlib/tree/v1.3.2" }, "funding": [ { @@ -7703,20 +7197,20 @@ "type": "tidelift" } ], - "time": "2020-12-29T16:48:45+00:00" + "time": "2021-09-06T20:30:10+00:00" }, { "name": "pdepend/pdepend", - "version": "2.10.0", + "version": "2.10.1", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "1fd30f4352b630ad53fec3fd5e8b8ba760f85596" + "reference": "30452fdabb3dfca89f4bf977abc44adc5391e062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/1fd30f4352b630ad53fec3fd5e8b8ba760f85596", - "reference": "1fd30f4352b630ad53fec3fd5e8b8ba760f85596", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/30452fdabb3dfca89f4bf977abc44adc5391e062", + "reference": "30452fdabb3dfca89f4bf977abc44adc5391e062", "shasum": "" }, "require": { @@ -7752,7 +7246,7 @@ "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/2.10.0" + "source": "https://github.com/pdepend/pdepend/tree/2.10.1" }, "funding": [ { @@ -7760,7 +7254,7 @@ "type": "tidelift" } ], - "time": "2021-07-20T09:56:09+00:00" + "time": "2021-10-11T12:15:18+00:00" }, { "name": "php-coveralls/php-coveralls", @@ -7991,16 +7485,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.6.0", + "version": "3.6.1", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" + "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/f268ca40d54617c6e06757f83f699775c9b3ff2e", + "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e", "shasum": "" }, "require": { @@ -8043,7 +7537,7 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2021-04-09T00:54:41+00:00" + "time": "2021-10-11T04:00:11+00:00" }, { "name": "symfony/config", @@ -8126,16 +7620,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v5.3.4", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "5a825e4b386066167a8b55487091cb62beec74c2" + "reference": "e39c344e06a3ceab531ebeb6c077e6652c4a0829" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5a825e4b386066167a8b55487091cb62beec74c2", - "reference": "5a825e4b386066167a8b55487091cb62beec74c2", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e39c344e06a3ceab531ebeb6c077e6652c4a0829", + "reference": "e39c344e06a3ceab531ebeb6c077e6652c4a0829", "shasum": "" }, "require": { @@ -8194,7 +7688,7 @@ "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/v5.3.4" + "source": "https://github.com/symfony/dependency-injection/tree/v5.3.8" }, "funding": [ { @@ -8210,7 +7704,7 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:55:36+00:00" + "time": "2021-09-21T20:52:44+00:00" }, { "name": "symfony/stopwatch", @@ -8289,5 +7783,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } diff --git a/src/Magento/FunctionalTestingFramework/Console/Codecept/CodeceptCommandUtil.php b/src/Magento/FunctionalTestingFramework/Console/Codecept/CodeceptCommandUtil.php index 3992aa677..1a469b179 100644 --- a/src/Magento/FunctionalTestingFramework/Console/Codecept/CodeceptCommandUtil.php +++ b/src/Magento/FunctionalTestingFramework/Console/Codecept/CodeceptCommandUtil.php @@ -23,6 +23,7 @@ class CodeceptCommandUtil */ private $cwd = null; + // @codingStandardsIgnoreStart /** * Setup Codeception * @@ -39,6 +40,7 @@ public function setup(InputInterface $input) return $input->setTokens($tokens); }, null, ArgvInput::class); } + // @codingStandardsIgnoreEnd /** * Save Codeception working directory diff --git a/src/Magento/FunctionalTestingFramework/Util/Iterator/AbstractIterator.php b/src/Magento/FunctionalTestingFramework/Util/Iterator/AbstractIterator.php index 69e2527aa..85b5dd411 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Iterator/AbstractIterator.php +++ b/src/Magento/FunctionalTestingFramework/Util/Iterator/AbstractIterator.php @@ -33,6 +33,7 @@ abstract class AbstractIterator implements \Iterator, \Countable * * @return mixed */ + #[\ReturnTypeWillChange] abstract public function current(); // @codingStandardsIgnoreEnd @@ -48,14 +49,14 @@ abstract public function current(); * * @return boolean */ - abstract protected function isValid(); + abstract protected function isValid() : bool; /** * Initialize Data Array * * @return void */ - public function rewind() + public function rewind() : void { reset($this->data); if (!$this->isValid()) { @@ -68,7 +69,7 @@ public function rewind() * * @return void */ - public function next() + public function next() : void { $this->current = next($this->data); @@ -86,7 +87,7 @@ public function next() * * @return boolean */ - public function valid() + public function valid() : bool { $current = current($this->data); if ($current === false || $current === null) { @@ -96,22 +97,25 @@ public function valid() } } + // @codingStandardsIgnoreStart /** * Get data key of the current data element * * @return integer|string */ + #[\ReturnTypeWillChange] public function key() { return key($this->data); } + // @codingStandardsIgnoreEnd /** * To make iterator countable * * @return integer */ - public function count() + public function count() : int { return count($this->data); } diff --git a/src/Magento/FunctionalTestingFramework/Util/Iterator/File.php b/src/Magento/FunctionalTestingFramework/Util/Iterator/File.php index 0186acd11..aafc4e288 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Iterator/File.php +++ b/src/Magento/FunctionalTestingFramework/Util/Iterator/File.php @@ -58,7 +58,7 @@ public function current() * * @return boolean */ - protected function isValid() + protected function isValid() : bool { return true; } From 5ba240026fb01034d64ae268ee2276ad304e7aae Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 18 Oct 2021 10:32:44 -0500 Subject: [PATCH 086/674] MQE-2978: [MFTF] Investigate removal of hoa/console - moving `hoa/console` to suggest section --- composer.json | 3 + composer.lock | 120 +++++++++++------- .../tests/MFTF/DevDocs/Test/DevDocsTest.xml | 1 + docs/interactive-pause.md | 7 +- .../Module/MagentoWebDriver.php | 6 + 5 files changed, 86 insertions(+), 51 deletions(-) diff --git a/composer.json b/composer.json index a7502b067..551bcfb5a 100755 --- a/composer.json +++ b/composer.json @@ -46,6 +46,9 @@ "sebastian/phpcpd": "~6.0.0", "squizlabs/php_codesniffer": "~3.6.0" }, + "suggest": { + "hoa/console": "Enables action and interactive console functionality" + }, "autoload": { "files": ["src/Magento/FunctionalTestingFramework/_bootstrap.php"], "psr-4": { diff --git a/composer.lock b/composer.lock index 061c9d862..6042807bb 100644 --- a/composer.lock +++ b/composer.lock @@ -177,16 +177,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.198.4", + "version": "3.198.6", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "b0b95cf0fa287e5b5db73ceafaf836950ede76ff" + "reference": "821b8db50dd39be8ec94f286050a500b5f8a0142" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b0b95cf0fa287e5b5db73ceafaf836950ede76ff", - "reference": "b0b95cf0fa287e5b5db73ceafaf836950ede76ff", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/821b8db50dd39be8ec94f286050a500b5f8a0142", + "reference": "821b8db50dd39be8ec94f286050a500b5f8a0142", "shasum": "" }, "require": { @@ -262,9 +262,9 @@ "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.198.4" + "source": "https://github.com/aws/aws-sdk-php/tree/3.198.6" }, - "time": "2021-10-13T18:16:14+00:00" + "time": "2021-10-15T18:38:53+00:00" }, { "name": "beberlei/assert", @@ -1598,24 +1598,25 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.3.0", + "version": "7.4.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "7008573787b430c1c1f650e3722d9bba59967628" + "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7008573787b430c1c1f650e3722d9bba59967628", - "reference": "7008573787b430c1c1f650e3722d9bba59967628", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/868b3571a039f0ebc11ac8f344f4080babe2cb94", + "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.4", - "guzzlehttp/psr7": "^1.7 || ^2.0", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.8.3 || ^2.1", "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0" + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2" }, "provide": { "psr/http-client-implementation": "1.0" @@ -1625,7 +1626,7 @@ "ext-curl": "*", "php-http/client-integration-tests": "^3.0", "phpunit/phpunit": "^8.5.5 || ^9.3.5", - "psr/log": "^1.1" + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { "ext-curl": "Required for CURL handler support", @@ -1635,7 +1636,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "7.3-dev" + "dev-master": "7.4-dev" } }, "autoload": { @@ -1651,19 +1652,43 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, { "name": "Márk Sági-Kazár", "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", "keywords": [ "client", "curl", @@ -1677,7 +1702,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.3.0" + "source": "https://github.com/guzzle/guzzle/tree/7.4.0" }, "funding": [ { @@ -1689,15 +1714,11 @@ "type": "github" }, { - "url": "https://github.com/alexeyshockov", - "type": "github" - }, - { - "url": "https://github.com/gmponos", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" } ], - "time": "2021-03-23T11:33:13+00:00" + "time": "2021-10-18T09:52:00+00:00" }, { "name": "guzzlehttp/promises", @@ -1959,16 +1980,16 @@ }, { "name": "jms/serializer", - "version": "3.14.0", + "version": "3.15.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "bf371f55d8137fec4ff096bd45ff19e2db02ac4c" + "reference": "9d6d9b81889904603383722ca0cd7f7999baeebc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/bf371f55d8137fec4ff096bd45ff19e2db02ac4c", - "reference": "bf371f55d8137fec4ff096bd45ff19e2db02ac4c", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/9d6d9b81889904603383722ca0cd7f7999baeebc", + "reference": "9d6d9b81889904603383722ca0cd7f7999baeebc", "shasum": "" }, "require": { @@ -1977,7 +1998,7 @@ "doctrine/lexer": "^1.1", "jms/metadata": "^2.0", "php": "^7.2||^8.0", - "phpstan/phpdoc-parser": "^0.4 || ^0.5" + "phpstan/phpdoc-parser": "^0.4 || ^0.5 || ^1.0" }, "require-dev": { "doctrine/coding-standard": "^8.1", @@ -1990,13 +2011,13 @@ "phpstan/phpstan": "^0.12.65", "phpunit/phpunit": "^8.0||^9.0", "psr/container": "^1.0", - "symfony/dependency-injection": "^3.0|^4.0|^5.0", - "symfony/expression-language": "^3.0|^4.0|^5.0", - "symfony/filesystem": "^3.0|^4.0|^5.0", - "symfony/form": "^3.0|^4.0|^5.0", - "symfony/translation": "^3.0|^4.0|^5.0", - "symfony/validator": "^3.1.9|^4.0|^5.0", - "symfony/yaml": "^3.3|^4.0|^5.0", + "symfony/dependency-injection": "^3.0|^4.0|^5.0|^6.0", + "symfony/expression-language": "^3.0|^4.0|^5.0|^6.0", + "symfony/filesystem": "^3.0|^4.0|^5.0|^6.0", + "symfony/form": "^3.0|^4.0|^5.0|^6.0", + "symfony/translation": "^3.0|^4.0|^5.0|^6.0", + "symfony/validator": "^3.1.9|^4.0|^5.0|^6.0", + "symfony/yaml": "^3.3|^4.0|^5.0|^6.0", "twig/twig": "~1.34|~2.4|^3.0" }, "suggest": { @@ -2007,7 +2028,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.14-dev" + "dev-master": "3.x-dev" } }, "autoload": { @@ -2040,7 +2061,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/3.14.0" + "source": "https://github.com/schmittjoh/serializer/tree/3.15.0" }, "funding": [ { @@ -2048,7 +2069,7 @@ "type": "github" } ], - "time": "2021-08-06T12:10:02+00:00" + "time": "2021-10-14T20:02:48+00:00" }, { "name": "justinrainbow/json-schema", @@ -2915,16 +2936,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "0.5.7", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "816e826ce0b7fb32098d8cb6de62511ce6021cea" + "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/816e826ce0b7fb32098d8cb6de62511ce6021cea", - "reference": "816e826ce0b7fb32098d8cb6de62511ce6021cea", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/dbc093d7af60eff5cd575d2ed761b15ed40bd08e", + "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e", "shasum": "" }, "require": { @@ -2933,15 +2954,15 @@ "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.87", - "phpstan/phpstan-strict-rules": "^0.12.5", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^9.5", "symfony/process": "^5.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "0.5-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -2958,9 +2979,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/0.5.7" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.2.0" }, - "time": "2021-09-12T11:52:00+00:00" + "time": "2021-09-16T20:46:02+00:00" }, { "name": "phpunit/php-code-coverage", @@ -4814,6 +4835,7 @@ "type": "github" } ], + "abandoned": true, "time": "2020-09-28T06:45:17+00:00" }, { diff --git a/dev/tests/functional/tests/MFTF/DevDocs/Test/DevDocsTest.xml b/dev/tests/functional/tests/MFTF/DevDocs/Test/DevDocsTest.xml index bda1cfb57..bf074d516 100644 --- a/dev/tests/functional/tests/MFTF/DevDocs/Test/DevDocsTest.xml +++ b/dev/tests/functional/tests/MFTF/DevDocs/Test/DevDocsTest.xml @@ -51,5 +51,6 @@ {{ExtendedMessageData.numbers}} ["Something New", "0", "1", "2", "3", "TESTING CASE"] + diff --git a/docs/interactive-pause.md b/docs/interactive-pause.md index 250f19936..5914c6339 100644 --- a/docs/interactive-pause.md +++ b/docs/interactive-pause.md @@ -10,9 +10,12 @@ Check [pause on codeception.com][] for documentation and a video to see `Interac In short, when a test gets to `$I->pause()` step, it stops and shows a console where you can try all available commands with auto-completion, stash commands, save screenshots, etc. -## MFTF Run Commands +## How to Configure Interactive Pause + +To be able to use Interactive console you need to install `hoa/console` library by running `composer require hoa/console` command in your project. This will allow `` action to work. +MFTF supports `Interactive Pause` when `ENABLE_PAUSE` is set to `true` in `/dev/tests/acceptance/.env` file. -The following MFTF run commands support `Interactive Pause` when `ENABLE_PAUSE` is set to `true`. +## MFTF Run Commands ```bash vendor/bin/mftf run:group diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 328eb4842..7f5c5908f 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -1040,6 +1040,12 @@ public function switchToIFrame($locator = null) */ public function pause($pauseOnFail = false) { + if (\Composer\InstalledVersions::isInstalled('hoa/console') === false) { + $message = " action is unavailable." . PHP_EOL; + $message .= "Please install `hoa/console` via \"composer require hoa/console\"" . PHP_EOL; + print($message); + return; + } if (!\Codeception\Util\Debug::isEnabled()) { return; } From 4227efe8894a3bdf8d3b5ac8c5b5ecb0a3ff6775 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Tue, 19 Oct 2021 12:08:50 -0500 Subject: [PATCH 087/674] MQE-2979: [MFTF] Update vlucas/phpdotenv to the latest versions --- composer.json | 2 +- composer.lock | 158 +++++++++--------- dev/tests/functional/standalone_bootstrap.php | 27 +-- .../FunctionalTestingFramework/_bootstrap.php | 28 ++-- 4 files changed, 111 insertions(+), 104 deletions(-) diff --git a/composer.json b/composer.json index 551bcfb5a..a0dc719ad 100755 --- a/composer.json +++ b/composer.json @@ -30,11 +30,11 @@ "php-webdriver/webdriver": "^1.9.0", "spomky-labs/otphp": "^10.0", "symfony/console": "^4.4", + "symfony/dotenv": "^5.3", "symfony/finder": "^5.0", "symfony/http-foundation": "^5.0", "symfony/mime": "^5.0", "symfony/process": "^4.4", - "vlucas/phpdotenv": "^2.4", "weew/helpers-array": "^1.3" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 6042807bb..ca3820871 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": "8dc05529156aa036fdfe184d1b174c49", + "content-hash": "eeaac3e027dffc09c8cf5229e9924faa", "packages": [ { "name": "allure-framework/allure-codeception", @@ -177,16 +177,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.198.6", + "version": "3.198.7", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "821b8db50dd39be8ec94f286050a500b5f8a0142" + "reference": "40197a954c9f49557a1b0d49e2a9bd6f7bf6adfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/821b8db50dd39be8ec94f286050a500b5f8a0142", - "reference": "821b8db50dd39be8ec94f286050a500b5f8a0142", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/40197a954c9f49557a1b0d49e2a9bd6f7bf6adfc", + "reference": "40197a954c9f49557a1b0d49e2a9bd6f7bf6adfc", "shasum": "" }, "require": { @@ -262,9 +262,9 @@ "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.198.6" + "source": "https://github.com/aws/aws-sdk-php/tree/3.198.7" }, - "time": "2021-10-15T18:38:53+00:00" + "time": "2021-10-18T18:17:12+00:00" }, { "name": "beberlei/assert", @@ -5356,6 +5356,76 @@ ], "time": "2021-03-23T23:28:01+00:00" }, + { + "name": "symfony/dotenv", + "version": "v5.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "12888c9c46ac750ec5c1381db5bf3d534e7d70cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/12888c9c46ac750ec5c1381db5bf3d534e7d70cb", + "reference": "12888c9c46ac750ec5c1381db5bf3d534e7d70cb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1" + }, + "require-dev": { + "symfony/process": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "source": "https://github.com/symfony/dotenv/tree/v5.3.8" + }, + "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-07-29T06:18:06+00:00" + }, { "name": "symfony/event-dispatcher", "version": "v4.4.30", @@ -6852,80 +6922,6 @@ ], "time": "2021-07-28T10:34:58+00:00" }, - { - "name": "vlucas/phpdotenv", - "version": "v2.6.8", - "source": { - "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "f1e2a35e53abe9322f0ab9ada689967e30055d40" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/f1e2a35e53abe9322f0ab9ada689967e30055d40", - "reference": "f1e2a35e53abe9322f0ab9ada689967e30055d40", - "shasum": "" - }, - "require": { - "php": "^5.3.9 || ^7.0 || ^8.0", - "symfony/polyfill-ctype": "^1.17" - }, - "require-dev": { - "ext-filter": "*", - "ext-pcre": "*", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.21" - }, - "suggest": { - "ext-filter": "Required to use the boolean validator.", - "ext-pcre": "Required to use most of the library." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, - "autoload": { - "psr-4": { - "Dotenv\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk" - }, - { - "name": "Vance Lucas", - "email": "vance@vancelucas.com" - } - ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "support": { - "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v2.6.8" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", - "type": "tidelift" - } - ], - "time": "2021-10-02T19:02:17+00:00" - }, { "name": "webmozart/assert", "version": "1.10.0", diff --git a/dev/tests/functional/standalone_bootstrap.php b/dev/tests/functional/standalone_bootstrap.php index 5ce6f029a..e048498c3 100755 --- a/dev/tests/functional/standalone_bootstrap.php +++ b/dev/tests/functional/standalone_bootstrap.php @@ -20,8 +20,12 @@ //Load constants from .env file if (file_exists(ENV_FILE_PATH . '.env')) { - $env = new \Dotenv\Loader(ENV_FILE_PATH . '.env'); - $env->load(); + $env = new \Symfony\Component\Dotenv\Dotenv(); + if (function_exists('putenv')) { + $env->usePutenv(); + } + $env->populate($env->parse(file_get_contents(ENV_FILE_PATH . '.env'), ENV_FILE_PATH . '.env'), true); + foreach ($_ENV as $key => $var) { defined($key) || define($key, $var); @@ -42,19 +46,20 @@ 'MAGENTO_CLI_COMMAND_PATH', 'dev/tests/acceptance/utils/command.php' ); - $env->setEnvironmentVariable('MAGENTO_CLI_COMMAND_PATH', MAGENTO_CLI_COMMAND_PATH); - defined('MAGENTO_CLI_COMMAND_PARAMETER') || define('MAGENTO_CLI_COMMAND_PARAMETER', 'command'); - $env->setEnvironmentVariable('MAGENTO_CLI_COMMAND_PARAMETER', MAGENTO_CLI_COMMAND_PARAMETER); - defined('DEFAULT_TIMEZONE') || define('DEFAULT_TIMEZONE', 'America/Los_Angeles'); - $env->setEnvironmentVariable('DEFAULT_TIMEZONE', DEFAULT_TIMEZONE); - defined('WAIT_TIMEOUT') || define('WAIT_TIMEOUT', 30); - $env->setEnvironmentVariable('WAIT_TIMEOUT', WAIT_TIMEOUT); - defined('VERBOSE_ARTIFACTS') || define('VERBOSE_ARTIFACTS', false); - $env->setEnvironmentVariable('VERBOSE_ARTIFACTS', VERBOSE_ARTIFACTS); + $env->populate( + [ + 'MAGENTO_CLI_COMMAND_PATH' => MAGENTO_CLI_COMMAND_PATH, + 'MAGENTO_CLI_COMMAND_PARAMETER' => MAGENTO_CLI_COMMAND_PARAMETER, + 'DEFAULT_TIMEZONE' => DEFAULT_TIMEZONE, + 'WAIT_TIMEOUT' => WAIT_TIMEOUT, + 'VERBOSE_ARTIFACTS' => VERBOSE_ARTIFACTS, + ], + true + ); try { new DateTimeZone(DEFAULT_TIMEZONE); diff --git a/src/Magento/FunctionalTestingFramework/_bootstrap.php b/src/Magento/FunctionalTestingFramework/_bootstrap.php index 9c13eaa54..9b7f7a821 100644 --- a/src/Magento/FunctionalTestingFramework/_bootstrap.php +++ b/src/Magento/FunctionalTestingFramework/_bootstrap.php @@ -6,6 +6,8 @@ */ // define framework basepath for schema pathing +use Symfony\Component\Dotenv\Exception\PathException; + defined('FW_BP') || define('FW_BP', realpath(__DIR__ . '/../../../')); // get the root path of the project $projectRootPath = substr(FW_BP, 0, strpos(FW_BP, DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR)); @@ -21,8 +23,11 @@ //Load constants from .env file if (file_exists(ENV_FILE_PATH . '.env')) { - $env = new \Dotenv\Loader(ENV_FILE_PATH . '.env'); - $env->load(); + $env = new \Symfony\Component\Dotenv\Dotenv(); + if (function_exists('putenv')) { + $env->usePutenv(); + } + $env->populate($env->parse(file_get_contents(ENV_FILE_PATH . '.env'), ENV_FILE_PATH . '.env'), true); if (array_key_exists('TESTS_MODULE_PATH', $_ENV) xor array_key_exists('TESTS_BP', $_ENV)) { throw new Exception( @@ -42,19 +47,20 @@ 'MAGENTO_CLI_COMMAND_PATH', 'dev/tests/acceptance/utils/command.php' ); - $env->setEnvironmentVariable('MAGENTO_CLI_COMMAND_PATH', MAGENTO_CLI_COMMAND_PATH); - defined('MAGENTO_CLI_COMMAND_PARAMETER') || define('MAGENTO_CLI_COMMAND_PARAMETER', 'command'); - $env->setEnvironmentVariable('MAGENTO_CLI_COMMAND_PARAMETER', MAGENTO_CLI_COMMAND_PARAMETER); - defined('DEFAULT_TIMEZONE') || define('DEFAULT_TIMEZONE', 'America/Los_Angeles'); - $env->setEnvironmentVariable('DEFAULT_TIMEZONE', DEFAULT_TIMEZONE); - defined('WAIT_TIMEOUT') || define('WAIT_TIMEOUT', 30); - $env->setEnvironmentVariable('WAIT_TIMEOUT', WAIT_TIMEOUT); - defined('VERBOSE_ARTIFACTS') || define('VERBOSE_ARTIFACTS', false); - $env->setEnvironmentVariable('VERBOSE_ARTIFACTS', VERBOSE_ARTIFACTS); + $env->populate( + [ + 'MAGENTO_CLI_COMMAND_PATH' => MAGENTO_CLI_COMMAND_PATH, + 'MAGENTO_CLI_COMMAND_PARAMETER' => MAGENTO_CLI_COMMAND_PARAMETER, + 'DEFAULT_TIMEZONE' => DEFAULT_TIMEZONE, + 'WAIT_TIMEOUT' => WAIT_TIMEOUT, + 'VERBOSE_ARTIFACTS' => VERBOSE_ARTIFACTS, + ], + true + ); try { new DateTimeZone(DEFAULT_TIMEZONE); From b21a1e08957863ad7ccc9d4442be20c5a8d5dcee Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Wed, 27 Oct 2021 15:10:50 -0500 Subject: [PATCH 088/674] MQE-2967: Magento Quality Engineering Repo Metadata Service Onboarding: Pangolins --- .github/.metadata.json | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/.metadata.json diff --git a/.github/.metadata.json b/.github/.metadata.json new file mode 100644 index 000000000..233f2e623 --- /dev/null +++ b/.github/.metadata.json @@ -0,0 +1,32 @@ +{ + "templateVersion": "0.1", + "product": { + "name": "Magento2 Functional Testing Framework (MFTF)", + "description": "MFTF is a framework to write and execute UI Functional tests for Magento 2 projects" + }, + "contacts": { + "team": { + "name": "Magento Quality Engineering / Pangolin", + "DL": "pangolin@adobe.com", + "slackChannel": "mftf" + } + }, + "ticketTracker": { + "functionalJiraQueue": { + "projectKey": "MQE", + "component": "" + }, + "securityJiraQueue": { + "projectKey": "MAGREQ", + "component": "Test Infrastructure" + } + }, + "staticScan": { + "enable": true, + "frequency": "monthly", + "customName": "", + "branchesToScan": [ + "develop" + ] + } +} From 537fe57eb92106f83dd4e0991711fe99ade40609 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Wed, 27 Oct 2021 15:51:03 -0500 Subject: [PATCH 089/674] MQE-2967: Magento Quality Engineering Repo Metadata Service Onboarding: Pangolins --- .github/.metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/.metadata.json b/.github/.metadata.json index 233f2e623..8e9c6212c 100644 --- a/.github/.metadata.json +++ b/.github/.metadata.json @@ -14,7 +14,7 @@ "ticketTracker": { "functionalJiraQueue": { "projectKey": "MQE", - "component": "" + "component": "Framework - MFTF" }, "securityJiraQueue": { "projectKey": "MAGREQ", From 892fc1ab36422aef970881a412b581d78417e3ee Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 29 Oct 2021 14:57:48 +0530 Subject: [PATCH 090/674] encodes special character which caused test failed --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 7f5c5908f..433841c70 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -340,7 +340,7 @@ public function seeInCurrentUrl($needle) $actualUrl = $this->webDriver->getCurrentURL(); $comparison = "Expected: $needle\nActual: $actualUrl"; AllureHelper::addAttachmentToCurrentStep($comparison, 'Comparison'); - $this->assertStringContainsString($needle, $actualUrl); + $this->assertStringContainsString($needle, urldecode($actualUrl)); } /** From f6e1112d06062b6c5dfd837726b69a930220f798 Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Mon, 8 Nov 2021 09:27:17 -0600 Subject: [PATCH 091/674] MQE-3006: Repo Metadata - Remove Email/Add DL --- .github/.metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/.metadata.json b/.github/.metadata.json index 8e9c6212c..f07606072 100644 --- a/.github/.metadata.json +++ b/.github/.metadata.json @@ -7,7 +7,7 @@ "contacts": { "team": { "name": "Magento Quality Engineering / Pangolin", - "DL": "pangolin@adobe.com", + "DL": "GRP-Pangolin", "slackChannel": "mftf" } }, From 32d1b2b55f98cf06af3eaec2f07b1e1562ca282d Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 8 Nov 2021 17:25:35 -0600 Subject: [PATCH 092/674] MQE-2677: Add filter for groups --- .../Util/TestGeneratorTest.php | 132 +++++++++++++++++- .../Filter/Test/ExcludeGroup.php | 58 ++++++++ .../Filter/Test/IncludeGroup.php | 58 ++++++++ 3 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 src/Magento/FunctionalTestingFramework/Filter/Test/ExcludeGroup.php create mode 100644 src/Magento/FunctionalTestingFramework/Filter/Test/IncludeGroup.php diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 800c506f1..217cf7f09 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -162,7 +162,7 @@ public function testAllowSkipped(): void * @return void * @throws TestReferenceException */ - public function testFilter(): void + public function testSeverityFilter(): void { $mockConfig = $this->createMock(MftfApplicationConfig::class); $fileList = new FilterList(['severity' => ['CRITICAL']]); @@ -221,6 +221,136 @@ function ($filename) use (&$generatedTests) { $this->assertArrayNotHasKey('test2Cest', $generatedTests); } + /** + * Tests that TestGenerator createAllTestFiles correctly filters based on group. + * + * @return void + * @throws TestReferenceException + */ + public function testIncludeGroupFilter(): void + { + $mockConfig = $this->createMock(MftfApplicationConfig::class); + $fileList = new FilterList(['includeGroup' => ['someGroupValue']]); + $mockConfig + ->method('getFilterList') + ->willReturn($fileList); + + $property = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); + $property->setAccessible(true); + $property->setValue($mockConfig); + + $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' + ); + + // Mock createCestFile to return name of tests that testGenerator tried to create + $generatedTests = []; + $cestFileCreatorUtil = $this->createMock(CestFileCreatorUtil::class); + $cestFileCreatorUtil + ->method('create') + ->will( + $this->returnCallback( + function ($filename) use (&$generatedTests) { + $generatedTests[$filename] = true; + } + ) + ); + + $property = new ReflectionProperty(CestFileCreatorUtil::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($cestFileCreatorUtil); + + $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); + $testGeneratorObject->createAllTestFiles(); + + // 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. + * + * @return void + * @throws TestReferenceException + */ + public function testExcludeGroupFilter(): void + { + $mockConfig = $this->createMock(MftfApplicationConfig::class); + $fileList = new FilterList(['excludeGroup' => ['someGroupValue']]); + $mockConfig + ->method('getFilterList') + ->willReturn($fileList); + + $property = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); + $property->setAccessible(true); + $property->setValue($mockConfig); + + $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' + ); + + // Mock createCestFile to return name of tests that testGenerator tried to create + $generatedTests = []; + $cestFileCreatorUtil = $this->createMock(CestFileCreatorUtil::class); + $cestFileCreatorUtil + ->method('create') + ->will( + $this->returnCallback( + function ($filename) use (&$generatedTests) { + $generatedTests[$filename] = true; + } + ) + ); + + $property = new ReflectionProperty(CestFileCreatorUtil::class, 'INSTANCE'); + $property->setAccessible(true); + $property->setValue($cestFileCreatorUtil); + + $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); + $testGeneratorObject->createAllTestFiles(); + + // Ensure Test2 was Generated but not Test 1 + $this->assertArrayNotHasKey('test1Cest', $generatedTests); + $this->assertArrayHasKey('test2Cest', $generatedTests); + } + /** * @inheritDoc */ 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 a8e52a26e5b6e9acc997acaa64ea0fdc15486d9f Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Tue, 9 Nov 2021 10:02:55 -0600 Subject: [PATCH 093/674] MQE-2677: Add filter for groups --- docs/commands/mftf.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/commands/mftf.md b/docs/commands/mftf.md index 6ed472d47..6e1b2f713 100644 --- a/docs/commands/mftf.md +++ b/docs/commands/mftf.md @@ -160,7 +160,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.
Example: `generate:tests --config=parallel --time=15`
Option `--time` will be the default and the __default value__ is `10` when neither `--time` nor `--groups` is specified.
Example: `generate:tests --config=parallel`| | `-g,--groups` | Set number of groups to be split into when `--config=parallel` is used.
Example: `generate:tests --config=parallel --groups=300`
Options `--time` and `--groups` are mutually exclusive and only one should be used.| From b500d4de3e0c71543512507343684d7f04626dc2 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Wed, 10 Nov 2021 10:26:33 -0600 Subject: [PATCH 094/674] MQE-2677: Add filter for groups --- 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 6e1b2f713..4abd0dace 100644 --- a/docs/commands/mftf.md +++ b/docs/commands/mftf.md @@ -160,7 +160,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.
Example: `generate:tests --config=parallel --time=15`
Option `--time` will be the default and the __default value__ is `10` when neither `--time` nor `--groups` is specified.
Example: `generate:tests --config=parallel`| | `-g,--groups` | Set number of groups to be split into when `--config=parallel` is used.
Example: `generate:tests --config=parallel --groups=300`
Options `--time` and `--groups` are mutually exclusive and only one should be used.| diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index ed3050898..b277f9c4e 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -78,7 +78,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 4d745cca8c6702d127f5e9011f41ed314a480f63 Mon Sep 17 00:00:00 2001 From: "Shashik.K.Singh" Date: Thu, 11 Nov 2021 15:20:10 +0530 Subject: [PATCH 095/674] MQE-2669 seprated a run:failed command to generate:failed and run:failed --- .gitignore | 1 + .../Console/CommandList.php | 1 + .../Console/GenerateTestFailedCommand.php | 189 ++++++++++++++++++ .../Console/RunTestFailedCommand.php | 100 --------- 4 files changed, 191 insertions(+), 100 deletions(-) create mode 100644 src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php diff --git a/.gitignore b/.gitignore index 3166f9529..51e1b71d5 100755 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ dev/tests/docs/* dev/tests/_output dev/tests/functional.suite.yml /v2/ +dev/.credentials.example \ No newline at end of file diff --git a/src/Magento/FunctionalTestingFramework/Console/CommandList.php b/src/Magento/FunctionalTestingFramework/Console/CommandList.php index 840e7dd86..a31ebe175 100644 --- a/src/Magento/FunctionalTestingFramework/Console/CommandList.php +++ b/src/Magento/FunctionalTestingFramework/Console/CommandList.php @@ -36,6 +36,7 @@ public function __construct(array $commands = []) 'generate:tests' => new GenerateTestsCommand(), 'generate:urn-catalog' => new GenerateDevUrnCommand(), 'reset' => new CleanProjectCommand(), + 'generate:failed' => new GenerateTestFailedCommand(), 'run:failed' => new RunTestFailedCommand(), 'run:group' => new RunTestGroupCommand(), 'run:manifest' => new RunManifestCommand(), diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php new file mode 100644 index 000000000..9db7769c8 --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php @@ -0,0 +1,189 @@ +setName('generate:failed') + ->setDescription('Generate a set of tests failed'); + + parent::configure(); + } + + /** + * Executes the current command. + * + * @param InputInterface $input + * @param OutputInterface $output + * @return integer + * @throws \Exception + * + * @SuppressWarnings(PHPMD.UnusedLocalVariable) + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + protected function execute(InputInterface $input, OutputInterface $output): int + { + $this->testsFailedFile = $this->getTestsOutputDir() . self::FAILED_FILE; + $this->testsReRunFile = $this->getTestsOutputDir() . "rerun_tests"; + + $force = $input->getOption('force'); + $debug = $input->getOption('debug') ?? MftfApplicationConfig::LEVEL_DEVELOPER; // for backward compatibility + $allowSkipped = $input->getOption('allow-skipped'); + $verbose = $output->isVerbose(); + + // Create Mftf Configuration + MftfApplicationConfig::create( + $force, + MftfApplicationConfig::EXECUTION_PHASE, + $verbose, + $debug, + $allowSkipped + ); + + $testConfiguration = $this->getFailedTestList(); + + if ($testConfiguration === null) { + // no failed tests found, run is a success + return 0; + } + + $command = $this->getApplication()->find('generate:tests'); + $args = [ + '--tests' => $testConfiguration, + '--force' => $force, + '--remove' => true, + '--debug' => $debug, + '--allow-skipped' => $allowSkipped, + '-v' => $verbose + ]; + $command->run(new ArrayInput($args), $output); + $output->writeln("Test Failed Generated, now run:failed command"); + return 1; + } + + /** + * Returns a json string of tests that failed on the last run + * + * @return string + */ + private function getFailedTestList() + { + $failedTestDetails = ['tests' => [], 'suites' => []]; + + if (realpath($this->testsFailedFile)) { + $testList = $this->readFailedTestFile($this->testsFailedFile); + + foreach ($testList as $test) { + if (!empty($test)) { + $this->writeFailedTestToFile($test, $this->testsReRunFile); + $testInfo = explode(DIRECTORY_SEPARATOR, $test); + $testName = explode(":", $testInfo[count($testInfo) - 1])[1]; + $suiteName = $testInfo[count($testInfo) - 2]; + + if ($suiteName === self::DEFAULT_TEST_GROUP) { + array_push($failedTestDetails['tests'], $testName); + } else { + $suiteName = $this->sanitizeSuiteName($suiteName); + $failedTestDetails['suites'] = array_merge_recursive( + $failedTestDetails['suites'], + [$suiteName => [$testName]] + ); + } + } + } + } + if (empty($failedTestDetails['tests']) & empty($failedTestDetails['suites'])) { + return null; + } + if (empty($failedTestDetails['tests'])) { + $failedTestDetails['tests'] = null; + } + if (empty($failedTestDetails['suites'])) { + $failedTestDetails['suites'] = null; + } + $testConfigurationJson = json_encode($failedTestDetails); + 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 tests read from the failed test file in _output + * + * @param string $filePath + * @return array|boolean + */ + private function readFailedTestFile($filePath) + { + return file($filePath, FILE_IGNORE_NEW_LINES); + } + + /** + * Writes the test name to a file if it does not already exist + * + * @param string $test + * @param string $filePath + * @return void + */ + private function writeFailedTestToFile($test, $filePath) + { + if (file_exists($filePath)) { + if (strpos(file_get_contents($filePath), $test) === false) { + file_put_contents($filePath, "\n" . $test, FILE_APPEND); + } + } else { + file_put_contents($filePath, $test . "\n"); + } + } +} diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index 695be0695..d9109d8e0 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -23,11 +23,6 @@ class RunTestFailedCommand extends BaseGenerateCommand */ const DEFAULT_TEST_GROUP = 'default'; - /** - * @var string - */ - private $testsReRunFile; - /** * @var string */ @@ -64,45 +59,11 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output): int { - $this->testsFailedFile = $this->getTestsOutputDir() . self::FAILED_FILE; - $this->testsReRunFile = $this->getTestsOutputDir() . "rerun_tests"; $this->testsManifestFile= FilePathFormatter::format(TESTS_MODULE_PATH) . "_generated" . DIRECTORY_SEPARATOR . "testManifest.txt"; - $force = $input->getOption('force'); - $debug = $input->getOption('debug') ?? MftfApplicationConfig::LEVEL_DEVELOPER; // for backward compatibility - $allowSkipped = $input->getOption('allow-skipped'); - $verbose = $output->isVerbose(); - - // Create Mftf Configuration - MftfApplicationConfig::create( - $force, - MftfApplicationConfig::EXECUTION_PHASE, - $verbose, - $debug, - $allowSkipped - ); - - $testConfiguration = $this->getFailedTestList(); - - if ($testConfiguration === null) { - // no failed tests found, run is a success - return 0; - } - - $command = $this->getApplication()->find('generate:tests'); - $args = [ - '--tests' => $testConfiguration, - '--force' => $force, - '--remove' => true, - '--debug' => $debug, - '--allow-skipped' => $allowSkipped, - '-v' => $verbose - ]; - $command->run(new ArrayInput($args), $output); - $testManifestList = $this->readTestManifestFile(); $returnCode = 0; for ($i = 0; $i < count($testManifestList); $i++) { @@ -142,67 +103,6 @@ function ($type, $buffer) use ($output) { return $returnCode; } - /** - * Returns a json string of tests that failed on the last run - * - * @return string - */ - private function getFailedTestList() - { - $failedTestDetails = ['tests' => [], 'suites' => []]; - - if (realpath($this->testsFailedFile)) { - $testList = $this->readFailedTestFile($this->testsFailedFile); - - foreach ($testList as $test) { - if (!empty($test)) { - $this->writeFailedTestToFile($test, $this->testsReRunFile); - $testInfo = explode(DIRECTORY_SEPARATOR, $test); - $testName = explode(":", $testInfo[count($testInfo) - 1])[1]; - $suiteName = $testInfo[count($testInfo) - 2]; - - if ($suiteName === self::DEFAULT_TEST_GROUP) { - array_push($failedTestDetails['tests'], $testName); - } else { - $suiteName = $this->sanitizeSuiteName($suiteName); - $failedTestDetails['suites'] = array_merge_recursive( - $failedTestDetails['suites'], - [$suiteName => [$testName]] - ); - } - } - } - } - if (empty($failedTestDetails['tests']) & empty($failedTestDetails['suites'])) { - return null; - } - if (empty($failedTestDetails['tests'])) { - $failedTestDetails['tests'] = null; - } - if (empty($failedTestDetails['suites'])) { - $failedTestDetails['suites'] = null; - } - $testConfigurationJson = json_encode($failedTestDetails); - 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 * From 59fe93dd2792b0a1392868d0085e752e75cb7397 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Thu, 11 Nov 2021 15:37:52 +0530 Subject: [PATCH 096/674] MQE-2290 Deleting MagentoPwaWebDriver file and moving it to Pwa_tests repo --- .../Module/MagentoPwaWebDriver.php | 100 ------------------ 1 file changed, 100 deletions(-) delete mode 100644 src/Magento/FunctionalTestingFramework/Module/MagentoPwaWebDriver.php diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoPwaWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoPwaWebDriver.php deleted file mode 100644 index f2f818bd4..000000000 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoPwaWebDriver.php +++ /dev/null @@ -1,100 +0,0 @@ -waitForLoadingMaskToDisappear($timeout); - } - - /** - * Wait for a PWA Element to NOT be visible using JavaScript. - * Add the WAIT_TIMEOUT variable to your .env file for this action. - * - * @param string $selector - * @param integer $timeout - * @throws \Exception - * @return void - */ - public function waitForPwaElementNotVisible($selector, $timeout = null) - { - $timeout = $timeout ?? $this->_getConfig()['pageload_timeout']; - - // Determine what type of Selector is used. - // Then use the correct JavaScript to locate the Element. - if (\Codeception\Util\Locator::isCss($selector)) { - $this->waitForLoadingMaskToDisappear($timeout); - $this->waitForJS("return !document.querySelector(`$selector`);", $timeout); - } else { - $this->waitForLoadingMaskToDisappear($timeout); - $this->waitForJS("return !document.evaluate(`$selector`, document, null, - XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;", $timeout); - } - } - - /** - * Wait for a PWA Element to be visible using JavaScript. - * Add the WAIT_TIMEOUT variable to your .env file for this action. - * - * @param string $selector - * @param integer $timeout - * @throws \Exception - * @return void - */ - public function waitForPwaElementVisible($selector, $timeout = null) - { - $timeout = $timeout ?? $this->_getConfig()['pageload_timeout']; - - // Determine what type of Selector is used. - // Then use the correct JavaScript to locate the Element. - if (\Codeception\Util\Locator::isCss($selector)) { - $this->waitForLoadingMaskToDisappear($timeout); - $this->waitForJS("return !!document && !!document.querySelector(`$selector`);", $timeout); - } else { - $this->waitForLoadingMaskToDisappear($timeout); - $this->waitForJS("return !!document && !!document.evaluate(`$selector`, document, null, - XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;", $timeout); - } - } -} From ba201f11962217c1735892e38460b5f37c0f3ca1 Mon Sep 17 00:00:00 2001 From: "Shashik.K.Singh" Date: Thu, 11 Nov 2021 22:25:06 +0530 Subject: [PATCH 097/674] MQE-2669 seprated a run:failed command to generate:failed and run:failed --- .gitignore | 4 +++- .../Console/GenerateTestFailedCommand.php | 5 ----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 51e1b71d5..1ab55a2ff 100755 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,6 @@ dev/tests/docs/* dev/tests/_output dev/tests/functional.suite.yml /v2/ -dev/.credentials.example \ No newline at end of file +dev/.credentials.example +dev/tests/.phpunit.result.cache +dev/tests/verification/TestModule/Test/testFile.xml \ No newline at end of file diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php index 9db7769c8..a9308b473 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php @@ -28,11 +28,6 @@ class GenerateTestFailedCommand extends BaseGenerateCommand */ private $testsReRunFile; - /** - * @var array - */ - private $failedList = []; - /** * Configures the current command. * From 908c2e33c52fc6dc00a0d4b0388fadf0dc9e79d5 Mon Sep 17 00:00:00 2001 From: Kevin Kozan Date: Wed, 17 Nov 2021 12:54:12 -0600 Subject: [PATCH 098/674] MQE-1766 --- .github/workflows/main.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 03bdbff75..4a567c7c4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -39,14 +39,14 @@ jobs: - 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.2.0 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - clover_file: "clover.xml" - threshold_alert: 10 - threshold_warning: 20 +# - name: Monitor coverage +# if: github.event_name == 'pull_request' +# uses: slavcodev/coverage-monitor-action@1.2.0 +# with: +# github_token: ${{ secrets.GITHUB_TOKEN }} +# clover_file: "clover.xml" +# threshold_alert: 10 +# threshold_warning: 20 verification-tests: name: Verification Tests From 6e7bb98fb2cede7bb52a65910507a593613ec1f7 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Wed, 17 Nov 2021 14:22:24 -0600 Subject: [PATCH 099/674] MQE-2669: bin/mftf run:failed process used a lot of RAM during MTSv1 build --- .../Console/RunTestFailedCommand.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index d9109d8e0..7a3f9697e 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -59,6 +59,10 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output): int { + $this->testsFailedFile = $this->getTestsOutputDir() . self::FAILED_FILE; + $this->testsReRunFile = $this->getTestsOutputDir() . "rerun_tests"; + $failedTestList = $this->readFailedTestFile($this->testsFailedFile); + $this->testsManifestFile= FilePathFormatter::format(TESTS_MODULE_PATH) . "_generated" . DIRECTORY_SEPARATOR . @@ -67,6 +71,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int $testManifestList = $this->readTestManifestFile(); $returnCode = 0; for ($i = 0; $i < count($testManifestList); $i++) { + if (in_array($testManifestList[$i], $failedTestList) === false) { + continue; + } if ($this->pauseEnabled()) { $codeceptionCommand = self::CODECEPT_RUN_FUNCTIONAL . $testManifestList[$i] . ' --debug '; if ($i !== count($testManifestList) - 1) { @@ -86,6 +93,7 @@ function ($type, $buffer) use ($output) { $output->write($buffer); } )); + $process->__destruct(); } if (file_exists($this->testsFailedFile)) { @@ -121,7 +129,14 @@ private function readTestManifestFile() */ private function readFailedTestFile($filePath) { - return file($filePath, FILE_IGNORE_NEW_LINES); + $failedTests = file($filePath, FILE_IGNORE_NEW_LINES); + if ($failedTests !== false) { + foreach ($failedTests as $key => $failedTest) { + list($filePath) = explode(":", $failedTest); + $failedTests[$key] = $filePath; + } + } + return $failedTests; } /** From f5d5360489249198edda00fec1970c76eefef8f2 Mon Sep 17 00:00:00 2001 From: Kevin Kozan Date: Thu, 18 Nov 2021 10:11:48 -0600 Subject: [PATCH 100/674] MQE-1766 --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 433841c70..b7a9f1bdc 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -340,7 +340,7 @@ public function seeInCurrentUrl($needle) $actualUrl = $this->webDriver->getCurrentURL(); $comparison = "Expected: $needle\nActual: $actualUrl"; AllureHelper::addAttachmentToCurrentStep($comparison, 'Comparison'); - $this->assertStringContainsString($needle, urldecode($actualUrl)); + $this->assertStringContainsString(urldecode($needle), urldecode($actualUrl)); } /** From 6b27aae83244f9a22978423f50864db437ac4869 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 18 Nov 2021 10:52:14 -0600 Subject: [PATCH 101/674] MQE-2669: bin/mftf run:failed process used a lot of RAM during MTSv1 build --- .../Console/GenerateTestFailedCommand.php | 4 ++-- .../Console/RunTestFailedCommand.php | 18 +----------------- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php index a9308b473..162760659 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php @@ -74,7 +74,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $testConfiguration = $this->getFailedTestList(); if ($testConfiguration === null) { - // no failed tests found, run is a success + // No failed tests found, no tests generated return 0; } @@ -89,7 +89,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int ]; $command->run(new ArrayInput($args), $output); $output->writeln("Test Failed Generated, now run:failed command"); - return 1; + return 0; } /** diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index 7a3f9697e..97180908e 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -18,11 +18,6 @@ class RunTestFailedCommand extends BaseGenerateCommand { - /** - * Default Test group to signify not in suite - */ - const DEFAULT_TEST_GROUP = 'default'; - /** * @var string */ @@ -61,7 +56,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int { $this->testsFailedFile = $this->getTestsOutputDir() . self::FAILED_FILE; $this->testsReRunFile = $this->getTestsOutputDir() . "rerun_tests"; - $failedTestList = $this->readFailedTestFile($this->testsFailedFile); $this->testsManifestFile= FilePathFormatter::format(TESTS_MODULE_PATH) . "_generated" . @@ -71,9 +65,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int $testManifestList = $this->readTestManifestFile(); $returnCode = 0; for ($i = 0; $i < count($testManifestList); $i++) { - if (in_array($testManifestList[$i], $failedTestList) === false) { - continue; - } if ($this->pauseEnabled()) { $codeceptionCommand = self::CODECEPT_RUN_FUNCTIONAL . $testManifestList[$i] . ' --debug '; if ($i !== count($testManifestList) - 1) { @@ -129,14 +120,7 @@ private function readTestManifestFile() */ private function readFailedTestFile($filePath) { - $failedTests = file($filePath, FILE_IGNORE_NEW_LINES); - if ($failedTests !== false) { - foreach ($failedTests as $key => $failedTest) { - list($filePath) = explode(":", $failedTest); - $failedTests[$key] = $filePath; - } - } - return $failedTests; + return file($filePath, FILE_IGNORE_NEW_LINES); } /** From 962d1caf63e1df41a3e1a7c5ee174729acf97c82 Mon Sep 17 00:00:00 2001 From: Kevin Kozan Date: Wed, 17 Nov 2021 12:54:12 -0600 Subject: [PATCH 102/674] MQE-1766 --- .github/workflows/main.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 03bdbff75..4a567c7c4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -39,14 +39,14 @@ jobs: - 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.2.0 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - clover_file: "clover.xml" - threshold_alert: 10 - threshold_warning: 20 +# - name: Monitor coverage +# if: github.event_name == 'pull_request' +# uses: slavcodev/coverage-monitor-action@1.2.0 +# with: +# github_token: ${{ secrets.GITHUB_TOKEN }} +# clover_file: "clover.xml" +# threshold_alert: 10 +# threshold_warning: 20 verification-tests: name: Verification Tests From 22a941ae08290e1c84ca1fc52f153b54678d0085 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 18 Nov 2021 19:08:26 -0600 Subject: [PATCH 103/674] MQE-2669: bin/mftf run:failed process used a lot of RAM during MTSv1 build --- .../Console/RunTestFailedCommand.php | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index 97180908e..daf0f62e7 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -54,6 +54,11 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output): int { + $returnCode = $this->executeGenerateFailed($input, $output); + if ($returnCode !== 0) { + return $returnCode; + } + $this->testsFailedFile = $this->getTestsOutputDir() . self::FAILED_FILE; $this->testsReRunFile = $this->getTestsOutputDir() . "rerun_tests"; @@ -85,6 +90,7 @@ function ($type, $buffer) use ($output) { } )); $process->__destruct(); + unset($process); } if (file_exists($this->testsFailedFile)) { @@ -102,6 +108,35 @@ function ($type, $buffer) use ($output) { return $returnCode; } + /** + * @param OutputInterface $output + * @return mixed + */ + private function executeGenerateFailed(InputInterface $input, OutputInterface $output) + { + $returnCode = 0; + $binMftf = PROJECT_ROOT . '/vendor/bin/mftf'; + if (file_exists($binMftf) === false) { + $binMftf = PROJECT_ROOT . '/bin/mftf'; + } + $forceGenerate = $input->getOption('force') ? ' -f' : ''; + $mftfCommand = realpath($binMftf) . ' generate:failed' . $forceGenerate; + + $process = new Process($mftfCommand); + $process->setWorkingDirectory(TESTS_BP); + $process->setIdleTimeout(600); + $process->setTimeout(0); + $returnCode = max($returnCode, $process->run( + function ($type, $buffer) use ($output) { + $output->write($buffer); + } + )); + $process->__destruct(); + unset($process); + + return $returnCode; + } + /** * Returns an array of run commands read from the manifest file created post generation * From a5a73af19c5e37ddf3672379919a14c6db591283 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 18 Nov 2021 19:17:45 -0600 Subject: [PATCH 104/674] MQE-2669: bin/mftf run:failed process used a lot of RAM during MTSv1 build --- .../Console/RunTestFailedCommand.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index daf0f62e7..01d800286 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -109,8 +109,14 @@ function ($type, $buffer) use ($output) { } /** + * Execute generate failed tests command as a separate process, so that we can kill it and avoid high memory usage. + * + * @param InputInterface $input * @param OutputInterface $output - * @return mixed + * @return integer + * + * @SuppressWarnings(PHPMD.UnusedLocalVariable) + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ private function executeGenerateFailed(InputInterface $input, OutputInterface $output) { From dccf3882b819453d6229fbd0fecb535784cbf917 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Fri, 19 Nov 2021 09:40:52 -0600 Subject: [PATCH 105/674] MQE-2669: bin/mftf run:failed process used a lot of RAM during MTSv1 build --- .../Console/GenerateTestFailedCommand.php | 1 + .../Console/RunTestFailedCommand.php | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php index 162760659..8b21adefc 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php @@ -75,6 +75,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($testConfiguration === null) { // No failed tests found, no tests generated + $this->removeGeneratedDirectory($output, $verbose); return 0; } diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index 01d800286..ac850607c 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -68,6 +68,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int "testManifest.txt"; $testManifestList = $this->readTestManifestFile(); + if ($testManifestList === false) { + // If there is no test manifest file then we have nothing to execute. + return 0; + } $returnCode = 0; for ($i = 0; $i < count($testManifestList); $i++) { if ($this->pauseEnabled()) { @@ -150,7 +154,10 @@ function ($type, $buffer) use ($output) { */ private function readTestManifestFile() { - return file($this->testsManifestFile, FILE_IGNORE_NEW_LINES); + if (file_exists($this->testsManifestFile)) { + return file($this->testsManifestFile, FILE_IGNORE_NEW_LINES); + } + return false; } /** From 8a535f64a67002f117e1e418f353c335795a42e0 Mon Sep 17 00:00:00 2001 From: Kevin Kozan Date: Fri, 19 Nov 2021 11:44:06 -0600 Subject: [PATCH 106/674] MQE-2669: bin/mftf run:failed process used a lot of RAM - Added simple unit test to test configuration generator --- .../Console/GenerateTestFailedCommandTest.php | 41 +++++++++++++++++++ .../Console/GenerateTestFailedCommand.php | 29 ++++++------- 2 files changed, 54 insertions(+), 16 deletions(-) create mode 100644 dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php new file mode 100644 index 000000000..a127ea313 --- /dev/null +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php @@ -0,0 +1,41 @@ +getMockBuilder(GenerateTestFailedCommand::class) + ->onlyMethods(["readFailedTestFile", "writeFailedTestToFile"]) + ->getMock(); + // Configure the stub. + $stub + ->method('readFailedTestFile') + ->willReturn($testFileReturn); + $stub + ->method('writeFailedTestToFile') + ->willReturn(null); + + // Run the real code + $configuration = $stub->getFailedTestList("", ""); + $this->assertEquals($expectedConfiguration, $configuration); + } +} diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php index 8b21adefc..7b6208bd4 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php @@ -23,11 +23,6 @@ class GenerateTestFailedCommand extends BaseGenerateCommand */ const DEFAULT_TEST_GROUP = 'default'; - /** - * @var string - */ - private $testsReRunFile; - /** * Configures the current command. * @@ -54,9 +49,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output): int { - $this->testsFailedFile = $this->getTestsOutputDir() . self::FAILED_FILE; - $this->testsReRunFile = $this->getTestsOutputDir() . "rerun_tests"; - $force = $input->getOption('force'); $debug = $input->getOption('debug') ?? MftfApplicationConfig::LEVEL_DEVELOPER; // for backward compatibility $allowSkipped = $input->getOption('allow-skipped'); @@ -71,7 +63,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int $allowSkipped ); - $testConfiguration = $this->getFailedTestList(); + $testsFailedFile = $this->getTestsOutputDir() . self::FAILED_FILE; + $testsReRunFile = $this->getTestsOutputDir() . "rerun_tests"; + $testConfiguration = $this->getFailedTestList($testsFailedFile, $testsReRunFile); if ($testConfiguration === null) { // No failed tests found, no tests generated @@ -98,16 +92,16 @@ protected function execute(InputInterface $input, OutputInterface $output): int * * @return string */ - private function getFailedTestList() + public function getFailedTestList($testsFailedFile, $testsReRunFile) { $failedTestDetails = ['tests' => [], 'suites' => []]; - if (realpath($this->testsFailedFile)) { - $testList = $this->readFailedTestFile($this->testsFailedFile); + $testList = $this->readFailedTestFile($testsFailedFile); + if (!empty($testList)) { foreach ($testList as $test) { if (!empty($test)) { - $this->writeFailedTestToFile($test, $this->testsReRunFile); + $this->writeFailedTestToFile($test, $testsReRunFile); $testInfo = explode(DIRECTORY_SEPARATOR, $test); $testName = explode(":", $testInfo[count($testInfo) - 1])[1]; $suiteName = $testInfo[count($testInfo) - 2]; @@ -160,9 +154,12 @@ private function sanitizeSuiteName($suiteName) * @param string $filePath * @return array|boolean */ - private function readFailedTestFile($filePath) + public function readFailedTestFile($filePath) { - return file($filePath, FILE_IGNORE_NEW_LINES); + if (realpath($filePath)) { + return file($filePath, FILE_IGNORE_NEW_LINES); + } + return ""; } /** @@ -172,7 +169,7 @@ private function readFailedTestFile($filePath) * @param string $filePath * @return void */ - private function writeFailedTestToFile($test, $filePath) + public function writeFailedTestToFile($test, $filePath) { if (file_exists($filePath)) { if (strpos(file_get_contents($filePath), $test) === false) { From c8ac8bfb435a298ba5bc5f42c874b102a7eb41a2 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 22 Nov 2021 19:15:08 -0600 Subject: [PATCH 107/674] MQE-2669: Seprated a run:failed command to generate:failed and run:failed --- .../Console/RunTestFailedCommand.php | 80 +++++++------------ .../Suite/views/SuiteClass.mustache | 18 +++++ .../Util/TestGenerator.php | 10 ++- 3 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index ac850607c..16e621dfb 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -18,10 +18,12 @@ class RunTestFailedCommand extends BaseGenerateCommand { + const DEFAULT_TEST_GROUP = 'default'; + /** * @var string */ - private $testsManifestFile; + private $testsReRunFile = ""; /** * @var array @@ -54,22 +56,14 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output): int { - $returnCode = $this->executeGenerateFailed($input, $output); - if ($returnCode !== 0) { - return $returnCode; - } - $this->testsFailedFile = $this->getTestsOutputDir() . self::FAILED_FILE; $this->testsReRunFile = $this->getTestsOutputDir() . "rerun_tests"; - $this->testsManifestFile= FilePathFormatter::format(TESTS_MODULE_PATH) . - "_generated" . - DIRECTORY_SEPARATOR . - "testManifest.txt"; + $failedTests = $this->readFailedTestFile($this->testsFailedFile); + $testManifestList = $this->filterTestsForExecution($failedTests); - $testManifestList = $this->readTestManifestFile(); - if ($testManifestList === false) { - // If there is no test manifest file then we have nothing to execute. + if (empty($testManifestList)) { + // If there is no tests in manifest then we have nothing to execute. return 0; } $returnCode = 0; @@ -113,51 +107,31 @@ function ($type, $buffer) use ($output) { } /** - * Execute generate failed tests command as a separate process, so that we can kill it and avoid high memory usage. + * Returns a list of tests/suites which should have an additional run. * - * @param InputInterface $input - * @param OutputInterface $output - * @return integer - * - * @SuppressWarnings(PHPMD.UnusedLocalVariable) - * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * @param $failedTests + * @return array */ - private function executeGenerateFailed(InputInterface $input, OutputInterface $output) + private function filterTestsForExecution($failedTests): array { - $returnCode = 0; - $binMftf = PROJECT_ROOT . '/vendor/bin/mftf'; - if (file_exists($binMftf) === false) { - $binMftf = PROJECT_ROOT . '/bin/mftf'; - } - $forceGenerate = $input->getOption('force') ? ' -f' : ''; - $mftfCommand = realpath($binMftf) . ' generate:failed' . $forceGenerate; - - $process = new Process($mftfCommand); - $process->setWorkingDirectory(TESTS_BP); - $process->setIdleTimeout(600); - $process->setTimeout(0); - $returnCode = max($returnCode, $process->run( - function ($type, $buffer) use ($output) { - $output->write($buffer); + $testsOrGroupsToRerun = []; + + foreach ($failedTests as $test) { + if (!empty($test)) { + $this->writeFailedTestToFile($test, $this->testsReRunFile); + $testInfo = explode(DIRECTORY_SEPARATOR, $test); + $suiteName = $testInfo[count($testInfo) - 2]; + list($testPath) = explode(":", $test); + + if ($suiteName === self::DEFAULT_TEST_GROUP) { + $testsOrGroupsToRerun[] = $testPath; + } else { + $testsOrGroupsToRerun[] = "-g " . $suiteName; + } } - )); - $process->__destruct(); - unset($process); - - return $returnCode; - } - - /** - * Returns an array of run commands read from the manifest file created post generation - * - * @return array|boolean - */ - private function readTestManifestFile() - { - if (file_exists($this->testsManifestFile)) { - return file($this->testsManifestFile, FILE_IGNORE_NEW_LINES); } - return false; + + return $testsOrGroupsToRerun; } /** diff --git a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache index dc2fde915..1a4dde251 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache +++ b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache @@ -43,6 +43,7 @@ class {{suiteName}} extends \Codeception\GroupObject {{#before}} public function _before(\Codeception\Event\TestEvent $e) { + $this->testCount = $this->getTestCount(); $this->webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver'); $this->moduleContainer = $this->webDriver->getModuleContainer(); {{#helpers}} @@ -171,4 +172,21 @@ class {{suiteName}} extends \Codeception\GroupObject } return $module; } + + /** + * Counts how many tests in group. + * + * @return integer + */ + private function getTestCount() + { + $config = $this->getGlobalConfig(); + if (empty($config['groups']) && empty($config['groups'][self::$group])) { + return $this->testCount; + } + $pathToGroupDir = TESTS_BP . DIRECTORY_SEPARATOR . array_first($config['groups'][self::$group]); + $pathToGroupCests = $pathToGroupDir . DIRECTORY_SEPARATOR . "*Cest.php"; + + return count(glob($pathToGroupCests)); + } } diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 17c045977..b1638a548 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1801,7 +1801,8 @@ private function generateTestPhp($test) } else { $skipString .= "No issues have been specified."; } - $steps = "\t\t" . '$scenario->skip("' . $skipString . '");' . "\n"; + $steps = "\t\t" . 'unlink(__FILE__);' . "\n"; + $steps .= "\t\t" . '$scenario->skip("' . $skipString . '");' . "\n"; $dependencies .= ', \Codeception\Scenario $scenario'; } @@ -1811,6 +1812,13 @@ private function generateTestPhp($test) $testPhp .= $steps; $testPhp .= "\t}\n"; + $testPhp .= PHP_EOL; + $testPhp .= sprintf("\tpublic function _passed(%s)\n", $dependencies); + $testPhp .= "\t{\n"; + $testPhp .= "\t\t// Deleting itself so that we can rerun only failed tests." . PHP_EOL; + $testPhp .= "\t\tunlink(__FILE__);" . PHP_EOL; + $testPhp .= "\t}\n"; + return $testPhp; } From 1d57cc3a86df5f015d66bfb2a648540a613685db Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 22 Nov 2021 19:37:01 -0600 Subject: [PATCH 108/674] MQE-2669: Seprated a run:failed command to generate:failed and run:failed - update tests --- .../ActionGroupContainsStepKeyInArgText.txt | 6 ++++++ .../ActionGroupMergedViaInsertAfter.txt | 6 ++++++ .../ActionGroupMergedViaInsertBefore.txt | 6 ++++++ .../ActionGroupReturningValueTest.txt | 6 ++++++ .../Resources/ActionGroupToExtend.txt | 6 ++++++ .../Resources/ActionGroupUsingCreateData.txt | 6 ++++++ .../ActionGroupUsingNestedArgument.txt | 6 ++++++ .../ActionGroupWithDataOverrideTest.txt | 6 ++++++ .../Resources/ActionGroupWithDataTest.txt | 6 ++++++ ...thDefaultArgumentAndStringSelectorParam.txt | 6 ++++++ ...leParameterSelectorsFromDefaultArgument.txt | 6 ++++++ .../Resources/ActionGroupWithNoArguments.txt | 6 ++++++ .../Resources/ActionGroupWithNoDefaultTest.txt | 6 ++++++ ...GroupWithParameterizedElementWithHyphen.txt | 6 ++++++ ...ameterizedElementsWithStepKeyReferences.txt | 6 ++++++ ...ithPassedArgumentAndStringSelectorParam.txt | 6 ++++++ .../Resources/ActionGroupWithPersistedData.txt | 6 ++++++ ...ctionGroupWithSectionAndDataAsArguments.txt | 6 ++++++ ...pWithSimpleDataUsageFromDefaultArgument.txt | 6 ++++++ ...upWithSimpleDataUsageFromPassedArgument.txt | 6 ++++++ ...gleParameterSelectorFromDefaultArgument.txt | 6 ++++++ ...ngleParameterSelectorFromPassedArgument.txt | 6 ++++++ .../ActionGroupWithStepKeyReferences.txt | 6 ++++++ .../ActionGroupWithTopLevelPersistedData.txt | 6 ++++++ .../ActionsInDifferentModulesSuite.txt | 18 ++++++++++++++++++ .../ArgumentWithSameNameAsElement.txt | 6 ++++++ .../verification/Resources/AssertTest.txt | 6 ++++++ .../Resources/BasicActionGroupTest.txt | 6 ++++++ .../Resources/BasicFunctionalTest.txt | 6 ++++++ .../verification/Resources/BasicMergeTest.txt | 6 ++++++ .../Resources/CharacterReplacementTest.txt | 6 ++++++ .../Resources/ChildExtendedTestAddHooks.txt | 6 ++++++ .../Resources/ChildExtendedTestMerging.txt | 6 ++++++ .../Resources/ChildExtendedTestNoParent.txt | 6 ++++++ .../ChildExtendedTestRemoveAction.txt | 6 ++++++ .../ChildExtendedTestRemoveHookAction.txt | 6 ++++++ .../Resources/ChildExtendedTestReplace.txt | 6 ++++++ .../Resources/ChildExtendedTestReplaceHook.txt | 6 ++++++ .../verification/Resources/DataActionsTest.txt | 6 ++++++ .../Resources/DataReplacementTest.txt | 6 ++++++ .../Resources/DeprecatedEntitiesTest.txt | 6 ++++++ .../verification/Resources/DeprecatedTest.txt | 6 ++++++ .../Resources/ExecuteInSeleniumTest.txt | 0 .../Resources/ExecuteJsEscapingTest.txt | 6 ++++++ .../Resources/ExtendParentDataTest.txt | 6 ++++++ .../Resources/ExtendedActionGroup.txt | 6 ++++++ .../ExtendedActionGroupReturningValueTest.txt | 6 ++++++ ...endedChildActionGroupReturningValueTest.txt | 6 ++++++ .../Resources/ExtendedChildTestInSuiteCest.txt | 6 ++++++ .../Resources/ExtendedChildTestNotInSuite.txt | 6 ++++++ .../Resources/ExtendedParameterArrayTest.txt | 6 ++++++ .../Resources/ExtendedRemoveActionGroup.txt | 6 ++++++ .../Resources/ExtendingSkippedTest.txt | 6 ++++++ .../Resources/GroupSkipGenerationTest.txt | 6 ++++++ .../verification/Resources/HookActionsTest.txt | 6 ++++++ .../Resources/LocatorFunctionTest.txt | 6 ++++++ .../Resources/MergeMassViaInsertAfter.txt | 6 ++++++ .../Resources/MergeMassViaInsertBefore.txt | 6 ++++++ dev/tests/verification/Resources/MergeSkip.txt | 6 ++++++ .../MergedActionGroupReturningValueTest.txt | 6 ++++++ .../Resources/MergedActionGroupTest.txt | 6 ++++++ .../Resources/MergedReferencesTest.txt | 6 ++++++ .../Resources/MultipleActionGroupsTest.txt | 6 ++++++ .../Resources/PageReplacementTest.txt | 6 ++++++ .../Resources/ParameterArrayTest.txt | 6 ++++++ .../Resources/ParentExtendedTest.txt | 6 ++++++ .../PersistedAndXmlEntityArguments.txt | 6 ++++++ .../Resources/PersistedReplacementTest.txt | 6 ++++++ .../PersistenceActionGroupAppendingTest.txt | 6 ++++++ .../Resources/PersistenceCustomFieldsTest.txt | 6 ++++++ .../Resources/SectionReplacementTest.txt | 6 ++++++ .../verification/Resources/SkippedTest.txt | 6 ++++++ .../Resources/SkippedTestTwoIssues.txt | 6 ++++++ .../Resources/SkippedTestWithHooks.txt | 6 ++++++ .../Resources/XmlCommentedActionGroupTest.txt | 6 ++++++ .../Resources/XmlCommentedTest.txt | 6 ++++++ .../Resources/functionalSuiteHooks.txt | 18 ++++++++++++++++++ .../Resources/functionalSuiteWithComments.txt | 18 ++++++++++++++++++ .../Console/RunTestFailedCommand.php | 4 ++-- 79 files changed, 500 insertions(+), 2 deletions(-) delete mode 100644 dev/tests/verification/Resources/ExecuteInSeleniumTest.txt diff --git a/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt b/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt index d6640846f..ad906d4ea 100644 --- a/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt +++ b/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt @@ -41,4 +41,10 @@ class ActionGroupContainsStepKeyInArgTextCest $I->see("arg1", ".selector"); // stepKey: arg1ActionGroup $I->comment("Exiting Action Group [actionGroup] actionGroupContainsStepKeyInArgValue"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupMergedViaInsertAfter.txt b/dev/tests/verification/Resources/ActionGroupMergedViaInsertAfter.txt index 352af3a2b..a69b8d212 100644 --- a/dev/tests/verification/Resources/ActionGroupMergedViaInsertAfter.txt +++ b/dev/tests/verification/Resources/ActionGroupMergedViaInsertAfter.txt @@ -35,4 +35,10 @@ class ActionGroupMergedViaInsertAfterCest $I->fillField("#baz", "baz"); // stepKey: fillField3Keyone $I->comment("Exiting Action Group [keyone] FunctionalActionGroupForMassMergeAfter"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupMergedViaInsertBefore.txt b/dev/tests/verification/Resources/ActionGroupMergedViaInsertBefore.txt index 009109146..45d5188d4 100644 --- a/dev/tests/verification/Resources/ActionGroupMergedViaInsertBefore.txt +++ b/dev/tests/verification/Resources/ActionGroupMergedViaInsertBefore.txt @@ -35,4 +35,10 @@ class ActionGroupMergedViaInsertBeforeCest $I->fillField("#baz", "baz"); // stepKey: fillField3Keyone $I->comment("Exiting Action Group [keyone] FunctionalActionGroupForMassMergeBefore"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt index 08e0b44f8..2d0220e65 100644 --- a/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt @@ -72,4 +72,10 @@ class ActionGroupReturningValueTestCest $I->see($actionGroupWithReturnValue1, "#element .{$actionGroupWithReturnValue1}"); // stepKey: see1ActionGroupWithStringUsage1 $I->comment("Exiting Action Group [actionGroupWithStringUsage1] actionGroupWithStringUsage"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupToExtend.txt b/dev/tests/verification/Resources/ActionGroupToExtend.txt index bbb9efa0f..14ef8a29a 100644 --- a/dev/tests/verification/Resources/ActionGroupToExtend.txt +++ b/dev/tests/verification/Resources/ActionGroupToExtend.txt @@ -31,4 +31,10 @@ class ActionGroupToExtendCest $I->assertCount(99, $grabProductsActionGroup); // stepKey: assertCountActionGroup $I->comment("Exiting Action Group [actionGroup] ActionGroupToExtend"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt b/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt index cbddc5f4d..8afc91f6f 100644 --- a/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt +++ b/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt @@ -39,4 +39,10 @@ class ActionGroupUsingCreateDataCest public function ActionGroupUsingCreateData(AcceptanceTester $I) { } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupUsingNestedArgument.txt b/dev/tests/verification/Resources/ActionGroupUsingNestedArgument.txt index 0cfd7f84d..657046cd5 100644 --- a/dev/tests/verification/Resources/ActionGroupUsingNestedArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupUsingNestedArgument.txt @@ -31,4 +31,10 @@ class ActionGroupUsingNestedArgumentCest $I->assertCount(99, $grabProductsActionGroup); // stepKey: assertCountActionGroup $I->comment("Exiting Action Group [actionGroup] ActionGroupToExtend"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt b/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt index b60a4da5f..bf430a668 100644 --- a/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt @@ -73,4 +73,10 @@ class ActionGroupWithDataOverrideTestCest $I->comment("Exiting Action Group [actionGroupWithDataOverride1] FunctionalActionGroupWithData"); $I->click("loginButton"); // stepKey: step6 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithDataTest.txt b/dev/tests/verification/Resources/ActionGroupWithDataTest.txt index 5f19cdc37..0de660c0e 100644 --- a/dev/tests/verification/Resources/ActionGroupWithDataTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithDataTest.txt @@ -73,4 +73,10 @@ class ActionGroupWithDataTestCest $I->comment("Exiting Action Group [actionGroupWithData1] FunctionalActionGroupWithData"); $I->click("loginButton"); // stepKey: step6 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithDefaultArgumentAndStringSelectorParam.txt b/dev/tests/verification/Resources/ActionGroupWithDefaultArgumentAndStringSelectorParam.txt index 65339e970..21f54d3ed 100644 --- a/dev/tests/verification/Resources/ActionGroupWithDefaultArgumentAndStringSelectorParam.txt +++ b/dev/tests/verification/Resources/ActionGroupWithDefaultArgumentAndStringSelectorParam.txt @@ -32,4 +32,10 @@ class ActionGroupWithDefaultArgumentAndStringSelectorParamCest $I->see("John", "#element .test1"); // stepKey: seeFirstNameActionGroup $I->comment("Exiting Action Group [actionGroup] actionGroupWithDefaultArgumentAndStringSelectorParam"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt b/dev/tests/verification/Resources/ActionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt index e8cedee97..b24fac754 100644 --- a/dev/tests/verification/Resources/ActionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt @@ -32,4 +32,10 @@ class ActionGroupWithMultipleParameterSelectorsFromDefaultArgumentCest $I->see("Doe", "#John-Doe .test"); // stepKey: seeLastNameActionGroup $I->comment("Exiting Action Group [actionGroup] actionGroupWithMultipleParameterSelectorsFromArgument"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithNoArguments.txt b/dev/tests/verification/Resources/ActionGroupWithNoArguments.txt index e5b9717c2..383164241 100644 --- a/dev/tests/verification/Resources/ActionGroupWithNoArguments.txt +++ b/dev/tests/verification/Resources/ActionGroupWithNoArguments.txt @@ -32,4 +32,10 @@ class ActionGroupWithNoArgumentsCest $I->wait(1); // stepKey: waitForNothingActionGroup $I->comment("Exiting Action Group [actionGroup] actionGroupWithoutArguments"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt b/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt index c0bde006d..97a060d1c 100644 --- a/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt @@ -71,4 +71,10 @@ class ActionGroupWithNoDefaultTestCest $I->comment("Exiting Action Group [actionGroupWithDataOverride1] FunctionalActionGroupNoDefault"); $I->click("loginButton"); // stepKey: step6 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithParameterizedElementWithHyphen.txt b/dev/tests/verification/Resources/ActionGroupWithParameterizedElementWithHyphen.txt index 812285111..53657a2ae 100644 --- a/dev/tests/verification/Resources/ActionGroupWithParameterizedElementWithHyphen.txt +++ b/dev/tests/verification/Resources/ActionGroupWithParameterizedElementWithHyphen.txt @@ -30,4 +30,10 @@ class ActionGroupWithParameterizedElementWithHyphenCest $keyoneActionGroup = $I->executeJS("#element .full-width"); // stepKey: keyoneActionGroup $I->comment("Exiting Action Group [actionGroup] SectionArgumentWithParameterizedSelector"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithParameterizedElementsWithStepKeyReferences.txt b/dev/tests/verification/Resources/ActionGroupWithParameterizedElementsWithStepKeyReferences.txt index 6c0c3fd0f..47d0566eb 100644 --- a/dev/tests/verification/Resources/ActionGroupWithParameterizedElementsWithStepKeyReferences.txt +++ b/dev/tests/verification/Resources/ActionGroupWithParameterizedElementsWithStepKeyReferences.txt @@ -35,4 +35,10 @@ class ActionGroupWithParameterizedElementsWithStepKeyReferencesCest $I->seeElement("//div[@name='Tiberius'][@class={$testVariableActionGroup}][@data-element='{$testVariable2ActionGroup}'][" . $I->retrieveEntityField('createSimpleData', 'name', 'test') . "]"); // stepKey: see1ActionGroup $I->comment("Exiting Action Group [actionGroup] actionGroupWithParametrizedSelectors"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithPassedArgumentAndStringSelectorParam.txt b/dev/tests/verification/Resources/ActionGroupWithPassedArgumentAndStringSelectorParam.txt index 6614a320d..31771d938 100644 --- a/dev/tests/verification/Resources/ActionGroupWithPassedArgumentAndStringSelectorParam.txt +++ b/dev/tests/verification/Resources/ActionGroupWithPassedArgumentAndStringSelectorParam.txt @@ -32,4 +32,10 @@ class ActionGroupWithPassedArgumentAndStringSelectorParamCest $I->see("John" . msq("UniquePerson"), "#element .test1"); // stepKey: seeFirstNameActionGroup $I->comment("Exiting Action Group [actionGroup] actionGroupWithDefaultArgumentAndStringSelectorParam"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt b/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt index c1905ff39..3943f1271 100644 --- a/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt +++ b/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt @@ -72,4 +72,10 @@ class ActionGroupWithPersistedDataCest $I->see("#element ." . $I->retrieveEntityField('createPerson', 'firstname', 'test')); // stepKey: see1ActionGroupWithPersistedData1 $I->comment("Exiting Action Group [actionGroupWithPersistedData1] FunctionalActionGroupWithData"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithSectionAndDataAsArguments.txt b/dev/tests/verification/Resources/ActionGroupWithSectionAndDataAsArguments.txt index b3dcc585f..71519b234 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSectionAndDataAsArguments.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSectionAndDataAsArguments.txt @@ -30,4 +30,10 @@ class ActionGroupWithSectionAndDataAsArgumentsCest $I->waitForElementVisible("#element .John", 10); // stepKey: arg1ActionGroup $I->comment("Exiting Action Group [actionGroup] actionGroupWithSectionAndData"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromDefaultArgument.txt b/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromDefaultArgument.txt index 6d540cb95..72ade673a 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromDefaultArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromDefaultArgument.txt @@ -32,4 +32,10 @@ class ActionGroupWithSimpleDataUsageFromDefaultArgumentCest $I->see("stringLiteral", "#element .stringLiteral"); // stepKey: see1ActionGroup $I->comment("Exiting Action Group [actionGroup] actionGroupWithStringUsage"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromPassedArgument.txt b/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromPassedArgument.txt index 826671a63..b19c6b20f 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromPassedArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromPassedArgument.txt @@ -59,4 +59,10 @@ class ActionGroupWithSimpleDataUsageFromPassedArgumentCest $I->see($I->retrieveEntityField('simpleData', 'firstname[data_index]', 'test'), "#element ." . $I->retrieveEntityField('simpleData', 'firstname[data_index]', 'test')); // stepKey: see1ActionGroup7 $I->comment("Exiting Action Group [actionGroup7] actionGroupWithEntityUsage"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt b/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt index 5e64aded3..81712b6fe 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt @@ -32,4 +32,10 @@ class ActionGroupWithSingleParameterSelectorFromDefaultArgumentCest $I->see("Doe", "#element .John"); // stepKey: seeLastNameActionGroup $I->comment("Exiting Action Group [actionGroup] actionGroupWithSingleParameterSelectorFromArgument"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromPassedArgument.txt b/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromPassedArgument.txt index e71a8a716..eeb346b60 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromPassedArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromPassedArgument.txt @@ -32,4 +32,10 @@ class ActionGroupWithSingleParameterSelectorFromPassedArgumentCest $I->see("Doe", "#element .John" . msq("UniquePerson")); // stepKey: seeLastNameActionGroup $I->comment("Exiting Action Group [actionGroup] actionGroupWithSingleParameterSelectorFromArgument"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt b/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt index 7d8fae946..ef20ee94b 100644 --- a/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt +++ b/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt @@ -55,4 +55,10 @@ class ActionGroupWithStepKeyReferencesCest $action16ActionGroup = $I->grabValueFrom($action16ActionGroup); // stepKey: action16ActionGroup $I->comment("Exiting Action Group [actionGroup] FunctionActionGroupWithStepKeyReferences"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt b/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt index 18a205544..daba0ab12 100644 --- a/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt +++ b/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt @@ -71,4 +71,10 @@ class ActionGroupWithTopLevelPersistedDataCest $I->see("#element ." . $I->retrieveEntityField('createPersonParam', 'firstname', 'test')); // stepKey: see1ActionGroupWithPersistedData1 $I->comment("Exiting Action Group [actionGroupWithPersistedData1] FunctionalActionGroupWithData"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt index d4e1b6eb3..20bf7610f 100644 --- a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt +++ b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt @@ -36,6 +36,7 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject public function _before(\Codeception\Event\TestEvent $e) { + $this->testCount = $this->getTestCount(); $this->webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver'); $this->moduleContainer = $this->webDriver->getModuleContainer(); // increment test count per execution @@ -215,4 +216,21 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject } return $module; } + + /** + * Counts how many tests in group. + * + * @return integer + */ + private function getTestCount() + { + $config = $this->getGlobalConfig(); + if (empty($config['groups']) && empty($config['groups'][self::$group])) { + return $this->testCount; + } + $pathToGroupDir = TESTS_BP . DIRECTORY_SEPARATOR . array_first($config['groups'][self::$group]); + $pathToGroupCests = $pathToGroupDir . DIRECTORY_SEPARATOR . "*Cest.php"; + + return count(glob($pathToGroupCests)); + } } diff --git a/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt b/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt index 4bf9332b7..2ea282f07 100644 --- a/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt +++ b/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt @@ -68,4 +68,10 @@ class ArgumentWithSameNameAsElementCest $I->seeElement("#element .John"); // stepKey: see2ActionGroup1 $I->comment("Exiting Action Group [actionGroup1] FunctionalActionGroupWithTrickyArgument"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/AssertTest.txt b/dev/tests/verification/Resources/AssertTest.txt index c8435675b..c4fe946e4 100644 --- a/dev/tests/verification/Resources/AssertTest.txt +++ b/dev/tests/verification/Resources/AssertTest.txt @@ -160,4 +160,10 @@ class AssertTestCest $I->assertNotRegExp('/placeholder\/thumbnail\.jpg/', $getSimpleProductThumbnail); // stepKey: simpleThumbnailIsNotDefault $I->assertRegExp("#var\s+adminAnalyticsMetadata\s+=\s+{\s+(\"[\w_]+\":\s+\"[^\"]*?\",\s+)*?(\"[\w_]+\":\s+\"[^\"]*?\"\s+)};#s", $pageSource, "adminAnalyticsMetadata object is invalid"); // stepKey: validateadminAnalyticsMetadata } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/BasicActionGroupTest.txt b/dev/tests/verification/Resources/BasicActionGroupTest.txt index 95c31b813..e2bfdae7e 100644 --- a/dev/tests/verification/Resources/BasicActionGroupTest.txt +++ b/dev/tests/verification/Resources/BasicActionGroupTest.txt @@ -49,4 +49,10 @@ class BasicActionGroupTestCest $I->comment("Exiting Action Group [actionGroup1] FunctionalActionGroup"); $I->click("loginButton"); // stepKey: step6 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/BasicFunctionalTest.txt b/dev/tests/verification/Resources/BasicFunctionalTest.txt index 29cfd9baf..e6ac37f12 100644 --- a/dev/tests/verification/Resources/BasicFunctionalTest.txt +++ b/dev/tests/verification/Resources/BasicFunctionalTest.txt @@ -185,4 +185,10 @@ class BasicFunctionalTestCest $I->waitForJS("someJsFunction", 30); // stepKey: waitForJSKey1 $I->waitForText("someInput", 30, ".functionalTestSelector"); // stepKey: waitForText1 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/BasicMergeTest.txt b/dev/tests/verification/Resources/BasicMergeTest.txt index 8842d3d99..a32d6b50e 100644 --- a/dev/tests/verification/Resources/BasicMergeTest.txt +++ b/dev/tests/verification/Resources/BasicMergeTest.txt @@ -75,4 +75,10 @@ class BasicMergeTestCest $I->comment("Exiting Action Group [step8Merge] FunctionalActionGroupWithData"); $I->click("#step10MergedInResult"); // stepKey: step10 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/CharacterReplacementTest.txt b/dev/tests/verification/Resources/CharacterReplacementTest.txt index 24d8e2ab1..3cdccd7e6 100644 --- a/dev/tests/verification/Resources/CharacterReplacementTest.txt +++ b/dev/tests/verification/Resources/CharacterReplacementTest.txt @@ -35,4 +35,10 @@ class CharacterReplacementTestCest $I->click("#`~!@#$%^&*()-_=+{}[]|\;:\".,>click("#words, and, commas, and, spaces .words, and, commas, and, spaces"); // stepKey: allChars6 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt b/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt index 72e924954..782eec26f 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt @@ -58,4 +58,10 @@ class ChildExtendedTestAddHooksCest public function ChildExtendedTestAddHooks(AcceptanceTester $I) { } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestMerging.txt b/dev/tests/verification/Resources/ChildExtendedTestMerging.txt index 7900ca9a0..dd8fba438 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestMerging.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestMerging.txt @@ -64,4 +64,10 @@ class ChildExtendedTestMergingCest $I->comment("After Comment"); $I->comment("Last Comment"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt b/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt index be775aba9..99695167c 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt @@ -33,4 +33,10 @@ class ChildExtendedTestNoParentCest { $scenario->skip("This test is skipped due to the following issues:No issues have been specified."); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt b/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt index d3017e010..2a0eddf57 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt @@ -58,4 +58,10 @@ class ChildExtendedTestRemoveActionCest public function ChildExtendedTestRemoveAction(AcceptanceTester $I) { } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt b/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt index 0988e5d71..2ab9eaf11 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt @@ -58,4 +58,10 @@ class ChildExtendedTestRemoveHookActionCest { $I->comment("Parent Comment"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestReplace.txt b/dev/tests/verification/Resources/ChildExtendedTestReplace.txt index 9d0a65a3b..daf1bfe2f 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestReplace.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestReplace.txt @@ -59,4 +59,10 @@ class ChildExtendedTestReplaceCest { $I->comment("Different Input"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt b/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt index c40b46fa0..67ef1b40e 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt @@ -59,4 +59,10 @@ class ChildExtendedTestReplaceHookCest { $I->comment("Parent Comment"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/DataActionsTest.txt b/dev/tests/verification/Resources/DataActionsTest.txt index 84a94174a..2c735ed35 100644 --- a/dev/tests/verification/Resources/DataActionsTest.txt +++ b/dev/tests/verification/Resources/DataActionsTest.txt @@ -43,4 +43,10 @@ class DataActionsTestCest $I->updateEntity("createdInBefore", "test", "entity",[]); // stepKey: updatedDataOutOfScope $I->deleteEntity("createdInBefore", "test"); // stepKey: deleteDataOutOfScope } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/DataReplacementTest.txt b/dev/tests/verification/Resources/DataReplacementTest.txt index b75d93f0d..f1d405750 100644 --- a/dev/tests/verification/Resources/DataReplacementTest.txt +++ b/dev/tests/verification/Resources/DataReplacementTest.txt @@ -89,4 +89,10 @@ class DataReplacementTestCest $I->dontSeeInSource("#element"); // stepKey: htmlReplace35 $I->dontSeeInSource("StringBefore #element StringAfter"); // stepKey: htmlReplace36 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/DeprecatedEntitiesTest.txt b/dev/tests/verification/Resources/DeprecatedEntitiesTest.txt index 489cb66ea..4d0652bb3 100644 --- a/dev/tests/verification/Resources/DeprecatedEntitiesTest.txt +++ b/dev/tests/verification/Resources/DeprecatedEntitiesTest.txt @@ -31,4 +31,10 @@ class DeprecatedEntitiesTestCest $I->comment("Exiting Action Group [deprecatedActionGroup] DeprecatedActionGroup"); $I->amOnPage("/test.html"); // stepKey: amOnPage } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/DeprecatedTest.txt b/dev/tests/verification/Resources/DeprecatedTest.txt index 845d13912..71fc1de4d 100644 --- a/dev/tests/verification/Resources/DeprecatedTest.txt +++ b/dev/tests/verification/Resources/DeprecatedTest.txt @@ -31,4 +31,10 @@ class DeprecatedTestCest $I->comment("Exiting Action Group [deprecatedActionGroup] DeprecatedActionGroup"); $I->amOnPage("/test.html"); // stepKey: amOnPage } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ExecuteInSeleniumTest.txt b/dev/tests/verification/Resources/ExecuteInSeleniumTest.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/dev/tests/verification/Resources/ExecuteJsEscapingTest.txt b/dev/tests/verification/Resources/ExecuteJsEscapingTest.txt index ad3696e00..6d4de9ad1 100644 --- a/dev/tests/verification/Resources/ExecuteJsEscapingTest.txt +++ b/dev/tests/verification/Resources/ExecuteJsEscapingTest.txt @@ -32,4 +32,10 @@ class ExecuteJsEscapingTestCest $hookPersistedDataNotEscaped = $I->executeJS("return " . $I->retrieveEntityField('persisted', 'data', 'test')); // stepKey: hookPersistedDataNotEscaped $addNewAttributeForRule = $I->executeJS("document.querySelector('entity option[value=" . $I->retrieveEntityField('productAttribute', 'attribute_code', 'test') . "]').setAttribute('selected', 'selected')"); // stepKey: addNewAttributeForRule } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ExtendParentDataTest.txt b/dev/tests/verification/Resources/ExtendParentDataTest.txt index 70cb6b70b..7e97473bd 100644 --- a/dev/tests/verification/Resources/ExtendParentDataTest.txt +++ b/dev/tests/verification/Resources/ExtendParentDataTest.txt @@ -33,4 +33,10 @@ class ExtendParentDataTestCest $I->searchAndMultiSelectOption("#selector", [msq("extendParentData") . "prename"]); // stepKey: originalPre $I->searchAndMultiSelectOption("#selector", ["postnameExtend" . msq("extendParentData")]); // stepKey: secondUniquePre } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ExtendedActionGroup.txt b/dev/tests/verification/Resources/ExtendedActionGroup.txt index 9ed588df4..71e9121fa 100644 --- a/dev/tests/verification/Resources/ExtendedActionGroup.txt +++ b/dev/tests/verification/Resources/ExtendedActionGroup.txt @@ -34,4 +34,10 @@ class ExtendedActionGroupCest $I->assertCount(8000, $grabProductsActionGroup); // stepKey: assertSecondCountActionGroup $I->comment("Exiting Action Group [actionGroup] extendTestActionGroup"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt index 2f26a6463..9b89b3825 100644 --- a/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt @@ -37,4 +37,10 @@ class ExtendedActionGroupReturningValueTestCest $I->see($actionGroupReturningValue, "#element .{$actionGroupReturningValue}"); // stepKey: see1ActionGroupWithStringUsage1 $I->comment("Exiting Action Group [actionGroupWithStringUsage1] actionGroupWithStringUsage"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ExtendedChildActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/ExtendedChildActionGroupReturningValueTest.txt index d043a5c04..e0d9e29f6 100644 --- a/dev/tests/verification/Resources/ExtendedChildActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/ExtendedChildActionGroupReturningValueTest.txt @@ -40,4 +40,10 @@ class ExtendedChildActionGroupReturningValueTestCest $I->see($extendedActionGroupReturningValue, "#element .{$extendedActionGroupReturningValue}"); // stepKey: see1ActionGroupWithStringUsage1 $I->comment("Exiting Action Group [actionGroupWithStringUsage1] actionGroupWithStringUsage"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt b/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt index d1f74abe1..2d1c91630 100644 --- a/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt +++ b/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt @@ -59,4 +59,10 @@ class ExtendedChildTestInSuiteCest { $I->comment("Different Input"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt b/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt index d9f8a72e6..30d188c9d 100644 --- a/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt +++ b/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt @@ -58,4 +58,10 @@ class ExtendedChildTestNotInSuiteCest { $I->comment("Different Input"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ExtendedParameterArrayTest.txt b/dev/tests/verification/Resources/ExtendedParameterArrayTest.txt index d09e9a0b6..306f10fee 100644 --- a/dev/tests/verification/Resources/ExtendedParameterArrayTest.txt +++ b/dev/tests/verification/Resources/ExtendedParameterArrayTest.txt @@ -32,4 +32,10 @@ class ExtendParentDataTestCest $I->searchAndMultiSelectOption("#selector", [msq("extendParentData") . "prename"]); $I->searchAndMultiSelectOption("#selector", ["postnameExtend" . msq("extendParentData")]); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt b/dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt index b593a9231..792a4ac4f 100644 --- a/dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt +++ b/dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt @@ -29,4 +29,10 @@ class ExtendedRemoveActionGroupCest $I->comment("Entering Action Group [actionGroup] extendRemoveTestActionGroup"); $I->comment("Exiting Action Group [actionGroup] extendRemoveTestActionGroup"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ExtendingSkippedTest.txt b/dev/tests/verification/Resources/ExtendingSkippedTest.txt index 0202f6d4f..5f1bfefe4 100644 --- a/dev/tests/verification/Resources/ExtendingSkippedTest.txt +++ b/dev/tests/verification/Resources/ExtendingSkippedTest.txt @@ -32,4 +32,10 @@ class ExtendingSkippedTestCest { $scenario->skip("This test is skipped due to the following issues:\nParentTestIsSkipped"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/GroupSkipGenerationTest.txt b/dev/tests/verification/Resources/GroupSkipGenerationTest.txt index 89884df82..1a6156cac 100644 --- a/dev/tests/verification/Resources/GroupSkipGenerationTest.txt +++ b/dev/tests/verification/Resources/GroupSkipGenerationTest.txt @@ -31,4 +31,10 @@ class GroupSkipGenerationTestCest public function GroupSkipGenerationTest(AcceptanceTester $I) { } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/HookActionsTest.txt b/dev/tests/verification/Resources/HookActionsTest.txt index 0b77325c1..0ffabfd9e 100644 --- a/dev/tests/verification/Resources/HookActionsTest.txt +++ b/dev/tests/verification/Resources/HookActionsTest.txt @@ -57,4 +57,10 @@ class HookActionsTestCest public function HookActionsTest(AcceptanceTester $I) { } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/LocatorFunctionTest.txt b/dev/tests/verification/Resources/LocatorFunctionTest.txt index 76c48a921..deffe887b 100644 --- a/dev/tests/verification/Resources/LocatorFunctionTest.txt +++ b/dev/tests/verification/Resources/LocatorFunctionTest.txt @@ -40,4 +40,10 @@ class LocatorFunctionTestCest $I->click(Locator::contains("string1", $I->retrieveEntityField('data', 'key1', 'test'))); // stepKey: TwoParamMix2 $I->click(Locator::contains("John", $I->retrieveEntityField('data', 'key1', 'test'))); // stepKey: TwoParamMix3 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/MergeMassViaInsertAfter.txt b/dev/tests/verification/Resources/MergeMassViaInsertAfter.txt index 1a94b90a6..250cb8b18 100644 --- a/dev/tests/verification/Resources/MergeMassViaInsertAfter.txt +++ b/dev/tests/verification/Resources/MergeMassViaInsertAfter.txt @@ -33,4 +33,10 @@ class MergeMassViaInsertAfterCest $I->click("#mergeThree"); // stepKey: clickThree $I->fillField("#baz", "baz"); // stepKey: fillField3 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/MergeMassViaInsertBefore.txt b/dev/tests/verification/Resources/MergeMassViaInsertBefore.txt index 12b073bfb..2e14981b0 100644 --- a/dev/tests/verification/Resources/MergeMassViaInsertBefore.txt +++ b/dev/tests/verification/Resources/MergeMassViaInsertBefore.txt @@ -33,4 +33,10 @@ class MergeMassViaInsertBeforeCest $I->fillField("#bar", "bar"); // stepKey: fillField2 $I->fillField("#baz", "baz"); // stepKey: fillField3 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/MergeSkip.txt b/dev/tests/verification/Resources/MergeSkip.txt index d08f52b56..122809112 100644 --- a/dev/tests/verification/Resources/MergeSkip.txt +++ b/dev/tests/verification/Resources/MergeSkip.txt @@ -28,4 +28,10 @@ class MergeSkipCest { $scenario->skip("This test is skipped due to the following issues:\nIssue5"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt index a4689779b..ef7960d21 100644 --- a/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt @@ -74,4 +74,10 @@ class MergedActionGroupReturningValueTestCest $I->see($actionGroupWithReturnValue1, "#element .{$actionGroupWithReturnValue1}"); // stepKey: see1ActionGroupWithStringUsage1 $I->comment("Exiting Action Group [actionGroupWithStringUsage1] actionGroupWithStringUsage"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/MergedActionGroupTest.txt b/dev/tests/verification/Resources/MergedActionGroupTest.txt index c8401874d..f592a9806 100644 --- a/dev/tests/verification/Resources/MergedActionGroupTest.txt +++ b/dev/tests/verification/Resources/MergedActionGroupTest.txt @@ -70,4 +70,10 @@ class MergedActionGroupTestCest $I->click(".merge .Dane"); // stepKey: myMergedClickActionGroupForMerge $I->comment("Exiting Action Group [actionGroupForMerge] FunctionalActionGroupForMerge"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/MergedReferencesTest.txt b/dev/tests/verification/Resources/MergedReferencesTest.txt index 74f780aac..678ae79fe 100644 --- a/dev/tests/verification/Resources/MergedReferencesTest.txt +++ b/dev/tests/verification/Resources/MergedReferencesTest.txt @@ -60,4 +60,10 @@ class MergedReferencesTestCest $I->fillField("#merge", "merged"); // stepKey: fillField1 $I->fillField("#newElement", "newField"); // stepKey: fillField2 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/MultipleActionGroupsTest.txt b/dev/tests/verification/Resources/MultipleActionGroupsTest.txt index 46673f473..6a387eb76 100644 --- a/dev/tests/verification/Resources/MultipleActionGroupsTest.txt +++ b/dev/tests/verification/Resources/MultipleActionGroupsTest.txt @@ -80,4 +80,10 @@ class MultipleActionGroupsTestCest $I->see("#element .John"); // stepKey: see1ActionGroupWithDataOverride2 $I->comment("Exiting Action Group [actionGroupWithDataOverride2] FunctionalActionGroupWithData"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/PageReplacementTest.txt b/dev/tests/verification/Resources/PageReplacementTest.txt index 6f75ee096..a83a8ac02 100644 --- a/dev/tests/verification/Resources/PageReplacementTest.txt +++ b/dev/tests/verification/Resources/PageReplacementTest.txt @@ -39,4 +39,10 @@ class PageReplacementTestCest $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 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ParameterArrayTest.txt b/dev/tests/verification/Resources/ParameterArrayTest.txt index 8918bb619..b6ed5ac8c 100644 --- a/dev/tests/verification/Resources/ParameterArrayTest.txt +++ b/dev/tests/verification/Resources/ParameterArrayTest.txt @@ -50,4 +50,10 @@ class ParameterArrayTestCest $I->pressKey("#selector", ['ctrl', 'a'],'new', 1, ['ctrl'], ['shift', 'ctrl', 'del'], 0, [$I->retrieveEntityField('simpleDataKey', 'name', 'test'), $I->retrieveEntityField('simpleDataKey', 'name', 'test')]); // stepKey: pressKey005 $I->pressKey("#selector", ['ctrl', 'a'],'new', 1, ['ctrl'], ['shift', 'ctrl', 'del'], [msq("simpleParamData") . "prename", "postname" . msq("simpleParamData")]); // stepKey: pressKey006 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/ParentExtendedTest.txt b/dev/tests/verification/Resources/ParentExtendedTest.txt index 5606b2ac3..3a035ede7 100644 --- a/dev/tests/verification/Resources/ParentExtendedTest.txt +++ b/dev/tests/verification/Resources/ParentExtendedTest.txt @@ -59,4 +59,10 @@ class ParentExtendedTestCest { $I->comment("Parent Comment"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/PersistedAndXmlEntityArguments.txt b/dev/tests/verification/Resources/PersistedAndXmlEntityArguments.txt index d49b99306..9e991362a 100644 --- a/dev/tests/verification/Resources/PersistedAndXmlEntityArguments.txt +++ b/dev/tests/verification/Resources/PersistedAndXmlEntityArguments.txt @@ -30,4 +30,10 @@ class PersistedAndXmlEntityArgumentsCest $I->seeInCurrentUrl("/" . $I->retrieveEntityField('persistedInTest', 'urlKey', 'test') . ".html?___store=" . msq("uniqueData") . "John"); // stepKey: checkUrlAfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroupWithXmlAndPersistedData"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/PersistedReplacementTest.txt b/dev/tests/verification/Resources/PersistedReplacementTest.txt index eb1c9995d..f0609e4a8 100644 --- a/dev/tests/verification/Resources/PersistedReplacementTest.txt +++ b/dev/tests/verification/Resources/PersistedReplacementTest.txt @@ -59,4 +59,10 @@ class PersistedReplacementTestCest $I->dontSeeInSource("StringBefore " . $I->retrieveEntityField('createData1', 'firstname', 'test') . " StringAfter"); // stepKey: htmlReplace11 $I->dontSeeInSource("#" . getenv("MAGENTO_BASE_URL") . "#" . $I->retrieveEntityField('createdData', 'firstname', 'test')); // stepKey: htmlReplace12 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt b/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt index 426003bc2..b966d7ca6 100644 --- a/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt +++ b/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt @@ -49,4 +49,10 @@ class PersistenceActionGroupAppendingTestCest $I->comment($I->retrieveEntityField('createDataACTIONGROUP', 'field', 'test')); $I->comment("Exiting Action Group [ACTIONGROUP] DataPersistenceAppendingActionGroup"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt b/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt index 41251d2fb..34409d108 100644 --- a/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt +++ b/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt @@ -61,4 +61,10 @@ class PersistenceCustomFieldsTestCest $I->createEntity("createData3AGKEY", "test", "entity3", [], $createData3AGKEYFields); // stepKey: createData3AGKEY $I->comment("Exiting Action Group [AGKEY] DataPersistenceSelfReferenceActionGroup"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/SectionReplacementTest.txt b/dev/tests/verification/Resources/SectionReplacementTest.txt index 109c198eb..8b3eadc1b 100644 --- a/dev/tests/verification/Resources/SectionReplacementTest.txt +++ b/dev/tests/verification/Resources/SectionReplacementTest.txt @@ -63,4 +63,10 @@ class SectionReplacementTestCest $I->click("(//div[@data-role='slide'])[1]/a[@data-element='link'][contains(@href,'')]"); // stepKey: selectorParamWithEmptyString $I->click("(//div[@data-role='slide'])[1]/a[@data-element='link'][contains(@href,' ')]"); // stepKey: selectorParamWithASpace } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/SkippedTest.txt b/dev/tests/verification/Resources/SkippedTest.txt index 7dd9ba280..fdeadf256 100644 --- a/dev/tests/verification/Resources/SkippedTest.txt +++ b/dev/tests/verification/Resources/SkippedTest.txt @@ -31,4 +31,10 @@ class SkippedTestCest { $scenario->skip("This test is skipped due to the following issues:\nSkippedValue"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/SkippedTestTwoIssues.txt b/dev/tests/verification/Resources/SkippedTestTwoIssues.txt index 0087ba92d..0eeebd4fd 100644 --- a/dev/tests/verification/Resources/SkippedTestTwoIssues.txt +++ b/dev/tests/verification/Resources/SkippedTestTwoIssues.txt @@ -31,4 +31,10 @@ class SkippedTestTwoIssuesCest { $scenario->skip("This test is skipped due to the following issues:\nSkippedValue\nSecondSkippedValue"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/SkippedTestWithHooks.txt b/dev/tests/verification/Resources/SkippedTestWithHooks.txt index 6b2682c49..a33f64108 100644 --- a/dev/tests/verification/Resources/SkippedTestWithHooks.txt +++ b/dev/tests/verification/Resources/SkippedTestWithHooks.txt @@ -31,4 +31,10 @@ class SkippedTestWithHooksCest { $scenario->skip("This test is skipped due to the following issues:\nSkippedValue"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt b/dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt index 0eb546335..5765aab13 100644 --- a/dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt +++ b/dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt @@ -33,4 +33,10 @@ class XmlCommentedActionGroupTestCest $I->see("John", "#element .test1"); // stepKey: seeFirstNameActionGroup $I->comment("Exiting Action Group [actionGroup] XmlCommentedActionGroup"); } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/XmlCommentedTest.txt b/dev/tests/verification/Resources/XmlCommentedTest.txt index 47d984d9e..663732493 100644 --- a/dev/tests/verification/Resources/XmlCommentedTest.txt +++ b/dev/tests/verification/Resources/XmlCommentedTest.txt @@ -70,4 +70,10 @@ class XmlCommentedTestCest $I->comment(""); $I->checkOption(".functionalTestSelector"); // stepKey: checkOptionKey1 } + + public function _passed(AcceptanceTester $I) + { + // Deleting itself so that we can rerun only failed tests. + unlink(__FILE__); + } } diff --git a/dev/tests/verification/Resources/functionalSuiteHooks.txt b/dev/tests/verification/Resources/functionalSuiteHooks.txt index 3156a59dd..416678b68 100644 --- a/dev/tests/verification/Resources/functionalSuiteHooks.txt +++ b/dev/tests/verification/Resources/functionalSuiteHooks.txt @@ -36,6 +36,7 @@ class functionalSuiteHooks extends \Codeception\GroupObject public function _before(\Codeception\Event\TestEvent $e) { + $this->testCount = $this->getTestCount(); $this->webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver'); $this->moduleContainer = $this->webDriver->getModuleContainer(); // increment test count per execution @@ -198,4 +199,21 @@ class functionalSuiteHooks extends \Codeception\GroupObject } return $module; } + + /** + * Counts how many tests in group. + * + * @return integer + */ + private function getTestCount() + { + $config = $this->getGlobalConfig(); + if (empty($config['groups']) && empty($config['groups'][self::$group])) { + return $this->testCount; + } + $pathToGroupDir = TESTS_BP . DIRECTORY_SEPARATOR . array_first($config['groups'][self::$group]); + $pathToGroupCests = $pathToGroupDir . DIRECTORY_SEPARATOR . "*Cest.php"; + + return count(glob($pathToGroupCests)); + } } diff --git a/dev/tests/verification/Resources/functionalSuiteWithComments.txt b/dev/tests/verification/Resources/functionalSuiteWithComments.txt index 02b50f092..7d5f827a4 100644 --- a/dev/tests/verification/Resources/functionalSuiteWithComments.txt +++ b/dev/tests/verification/Resources/functionalSuiteWithComments.txt @@ -36,6 +36,7 @@ class functionalSuiteWithComments extends \Codeception\GroupObject public function _before(\Codeception\Event\TestEvent $e) { + $this->testCount = $this->getTestCount(); $this->webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver'); $this->moduleContainer = $this->webDriver->getModuleContainer(); // increment test count per execution @@ -178,4 +179,21 @@ class functionalSuiteWithComments extends \Codeception\GroupObject } return $module; } + + /** + * Counts how many tests in group. + * + * @return integer + */ + private function getTestCount() + { + $config = $this->getGlobalConfig(); + if (empty($config['groups']) && empty($config['groups'][self::$group])) { + return $this->testCount; + } + $pathToGroupDir = TESTS_BP . DIRECTORY_SEPARATOR . array_first($config['groups'][self::$group]); + $pathToGroupCests = $pathToGroupDir . DIRECTORY_SEPARATOR . "*Cest.php"; + + return count(glob($pathToGroupCests)); + } } diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index 16e621dfb..a8a44337d 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -109,10 +109,10 @@ function ($type, $buffer) use ($output) { /** * Returns a list of tests/suites which should have an additional run. * - * @param $failedTests + * @param string $failedTests * @return array */ - private function filterTestsForExecution($failedTests): array + private function filterTestsForExecution(string $failedTests): array { $testsOrGroupsToRerun = []; From dd29a86a23220921d837570c6febfbce7d855db5 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 22 Nov 2021 19:44:57 -0600 Subject: [PATCH 109/674] MQE-2669: Seprated a run:failed command to generate:failed and run:failed - update tests --- .../Resources/ChildExtendedTestNoParent.txt | 7 +------ .../Resources/ExtendingSkippedTest.txt | 7 +------ dev/tests/verification/Resources/MergeSkip.txt | 7 +------ dev/tests/verification/Resources/SkippedTest.txt | 7 +------ .../Resources/SkippedTestTwoIssues.txt | 7 +------ .../Resources/SkippedTestWithHooks.txt | 7 +------ .../Util/TestGenerator.php | 14 ++++++++------ 7 files changed, 14 insertions(+), 42 deletions(-) diff --git a/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt b/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt index 99695167c..779f89c7e 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt @@ -31,12 +31,7 @@ class ChildExtendedTestNoParentCest */ public function ChildExtendedTestNoParent(AcceptanceTester $I, \Codeception\Scenario $scenario) { - $scenario->skip("This test is skipped due to the following issues:No issues have been specified."); - } - - public function _passed(AcceptanceTester $I) - { - // Deleting itself so that we can rerun only failed tests. unlink(__FILE__); + $scenario->skip("This test is skipped due to the following issues:No issues have been specified."); } } diff --git a/dev/tests/verification/Resources/ExtendingSkippedTest.txt b/dev/tests/verification/Resources/ExtendingSkippedTest.txt index 5f1bfefe4..45b8614e4 100644 --- a/dev/tests/verification/Resources/ExtendingSkippedTest.txt +++ b/dev/tests/verification/Resources/ExtendingSkippedTest.txt @@ -30,12 +30,7 @@ class ExtendingSkippedTestCest */ public function ExtendingSkippedTest(AcceptanceTester $I, \Codeception\Scenario $scenario) { - $scenario->skip("This test is skipped due to the following issues:\nParentTestIsSkipped"); - } - - public function _passed(AcceptanceTester $I) - { - // Deleting itself so that we can rerun only failed tests. unlink(__FILE__); + $scenario->skip("This test is skipped due to the following issues:\nParentTestIsSkipped"); } } diff --git a/dev/tests/verification/Resources/MergeSkip.txt b/dev/tests/verification/Resources/MergeSkip.txt index 122809112..885d622ac 100644 --- a/dev/tests/verification/Resources/MergeSkip.txt +++ b/dev/tests/verification/Resources/MergeSkip.txt @@ -26,12 +26,7 @@ class MergeSkipCest */ public function MergeSkip(AcceptanceTester $I, \Codeception\Scenario $scenario) { - $scenario->skip("This test is skipped due to the following issues:\nIssue5"); - } - - public function _passed(AcceptanceTester $I) - { - // Deleting itself so that we can rerun only failed tests. unlink(__FILE__); + $scenario->skip("This test is skipped due to the following issues:\nIssue5"); } } diff --git a/dev/tests/verification/Resources/SkippedTest.txt b/dev/tests/verification/Resources/SkippedTest.txt index fdeadf256..b50145c0e 100644 --- a/dev/tests/verification/Resources/SkippedTest.txt +++ b/dev/tests/verification/Resources/SkippedTest.txt @@ -29,12 +29,7 @@ class SkippedTestCest */ public function SkippedTest(AcceptanceTester $I, \Codeception\Scenario $scenario) { - $scenario->skip("This test is skipped due to the following issues:\nSkippedValue"); - } - - public function _passed(AcceptanceTester $I) - { - // Deleting itself so that we can rerun only failed tests. unlink(__FILE__); + $scenario->skip("This test is skipped due to the following issues:\nSkippedValue"); } } diff --git a/dev/tests/verification/Resources/SkippedTestTwoIssues.txt b/dev/tests/verification/Resources/SkippedTestTwoIssues.txt index 0eeebd4fd..a494328ba 100644 --- a/dev/tests/verification/Resources/SkippedTestTwoIssues.txt +++ b/dev/tests/verification/Resources/SkippedTestTwoIssues.txt @@ -29,12 +29,7 @@ class SkippedTestTwoIssuesCest */ public function SkippedTestTwoIssues(AcceptanceTester $I, \Codeception\Scenario $scenario) { - $scenario->skip("This test is skipped due to the following issues:\nSkippedValue\nSecondSkippedValue"); - } - - public function _passed(AcceptanceTester $I) - { - // Deleting itself so that we can rerun only failed tests. unlink(__FILE__); + $scenario->skip("This test is skipped due to the following issues:\nSkippedValue\nSecondSkippedValue"); } } diff --git a/dev/tests/verification/Resources/SkippedTestWithHooks.txt b/dev/tests/verification/Resources/SkippedTestWithHooks.txt index a33f64108..15936c463 100644 --- a/dev/tests/verification/Resources/SkippedTestWithHooks.txt +++ b/dev/tests/verification/Resources/SkippedTestWithHooks.txt @@ -29,12 +29,7 @@ class SkippedTestWithHooksCest */ public function SkippedTestWithHooks(AcceptanceTester $I, \Codeception\Scenario $scenario) { - $scenario->skip("This test is skipped due to the following issues:\nSkippedValue"); - } - - public function _passed(AcceptanceTester $I) - { - // Deleting itself so that we can rerun only failed tests. unlink(__FILE__); + $scenario->skip("This test is skipped due to the following issues:\nSkippedValue"); } } diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index b1638a548..8ea831963 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1812,12 +1812,14 @@ private function generateTestPhp($test) $testPhp .= $steps; $testPhp .= "\t}\n"; - $testPhp .= PHP_EOL; - $testPhp .= sprintf("\tpublic function _passed(%s)\n", $dependencies); - $testPhp .= "\t{\n"; - $testPhp .= "\t\t// Deleting itself so that we can rerun only failed tests." . PHP_EOL; - $testPhp .= "\t\tunlink(__FILE__);" . PHP_EOL; - $testPhp .= "\t}\n"; + if (!isset($skipString)) { + $testPhp .= PHP_EOL; + $testPhp .= sprintf("\tpublic function _passed(%s)\n", $dependencies); + $testPhp .= "\t{\n"; + $testPhp .= "\t\t// Deleting itself so that we can rerun only failed tests." . PHP_EOL; + $testPhp .= "\t\tunlink(__FILE__);" . PHP_EOL; + $testPhp .= "\t}\n"; + } return $testPhp; } From 41c14d4596a135a63507a5d1473c8b90edc9426b Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Tue, 23 Nov 2021 12:24:11 -0600 Subject: [PATCH 110/674] MQE-2669: Seprated a run:failed command to generate:failed and run:failed - fix a bug --- .../Console/RunTestFailedCommand.php | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index a8a44337d..1614fc84c 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -109,10 +109,10 @@ function ($type, $buffer) use ($output) { /** * Returns a list of tests/suites which should have an additional run. * - * @param string $failedTests + * @param array $failedTests * @return array */ - private function filterTestsForExecution(string $failedTests): array + private function filterTestsForExecution(array $failedTests): array { $testsOrGroupsToRerun = []; @@ -126,7 +126,10 @@ private function filterTestsForExecution(string $failedTests): array if ($suiteName === self::DEFAULT_TEST_GROUP) { $testsOrGroupsToRerun[] = $testPath; } else { - $testsOrGroupsToRerun[] = "-g " . $suiteName; + $group = "-g " . $suiteName; + if (!in_array($group, $testsOrGroupsToRerun)) { + $testsOrGroupsToRerun[] = $group; + } } } } @@ -138,11 +141,16 @@ private function filterTestsForExecution(string $failedTests): array * Returns an array of tests read from the failed test file in _output * * @param string $filePath - * @return array|boolean + * @return array */ - private function readFailedTestFile($filePath) + private function readFailedTestFile(string $filePath): array { - return file($filePath, FILE_IGNORE_NEW_LINES); + $data = []; + if (file_exists($filePath)) { + $file = file($filePath, FILE_IGNORE_NEW_LINES); + $data = $file === false ? [] : $file; + } + return $data; } /** From 3e0def302cc27b0abccfef3c164103b83cbc4ec4 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Tue, 23 Nov 2021 13:22:06 -0600 Subject: [PATCH 111/674] MQE-2669: Seprated a run:failed command to generate:failed and run:failed - fix a bug --- .../Suite/views/SuiteClass.mustache | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache index 1a4dde251..83fed59d9 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache +++ b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache @@ -181,12 +181,17 @@ class {{suiteName}} extends \Codeception\GroupObject private function getTestCount() { $config = $this->getGlobalConfig(); - if (empty($config['groups']) && empty($config['groups'][self::$group])) { + if (empty($config['groups']) || empty($config['groups'][self::$group])) { return $this->testCount; } $pathToGroupDir = TESTS_BP . DIRECTORY_SEPARATOR . array_first($config['groups'][self::$group]); - $pathToGroupCests = $pathToGroupDir . DIRECTORY_SEPARATOR . "*Cest.php"; + $pathToGroupCests = $pathToGroupDir . "*Cest.php"; - return count(glob($pathToGroupCests)); + $files = glob($pathToGroupCests); + if (is_array($files)) { + return count($files); + } + + return $this->testCount; } } From 8294c568b5158e6432acc16d2a255e1c28267cda Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Tue, 23 Nov 2021 13:23:21 -0600 Subject: [PATCH 112/674] MQE-2669: Seprated a run:failed command to generate:failed and run:failed - fix a bug --- .../Resources/ActionsInDifferentModulesSuite.txt | 11 ++++++++--- .../verification/Resources/functionalSuiteHooks.txt | 11 ++++++++--- .../Resources/functionalSuiteWithComments.txt | 11 ++++++++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt index 20bf7610f..35d04d385 100644 --- a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt +++ b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt @@ -225,12 +225,17 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject private function getTestCount() { $config = $this->getGlobalConfig(); - if (empty($config['groups']) && empty($config['groups'][self::$group])) { + if (empty($config['groups']) || empty($config['groups'][self::$group])) { return $this->testCount; } $pathToGroupDir = TESTS_BP . DIRECTORY_SEPARATOR . array_first($config['groups'][self::$group]); - $pathToGroupCests = $pathToGroupDir . DIRECTORY_SEPARATOR . "*Cest.php"; + $pathToGroupCests = $pathToGroupDir . "*Cest.php"; - return count(glob($pathToGroupCests)); + $files = glob($pathToGroupCests); + if (is_array($files)) { + return count($files); + } + + return $this->testCount; } } diff --git a/dev/tests/verification/Resources/functionalSuiteHooks.txt b/dev/tests/verification/Resources/functionalSuiteHooks.txt index 416678b68..7f00b67a8 100644 --- a/dev/tests/verification/Resources/functionalSuiteHooks.txt +++ b/dev/tests/verification/Resources/functionalSuiteHooks.txt @@ -208,12 +208,17 @@ class functionalSuiteHooks extends \Codeception\GroupObject private function getTestCount() { $config = $this->getGlobalConfig(); - if (empty($config['groups']) && empty($config['groups'][self::$group])) { + if (empty($config['groups']) || empty($config['groups'][self::$group])) { return $this->testCount; } $pathToGroupDir = TESTS_BP . DIRECTORY_SEPARATOR . array_first($config['groups'][self::$group]); - $pathToGroupCests = $pathToGroupDir . DIRECTORY_SEPARATOR . "*Cest.php"; + $pathToGroupCests = $pathToGroupDir . "*Cest.php"; - return count(glob($pathToGroupCests)); + $files = glob($pathToGroupCests); + if (is_array($files)) { + return count($files); + } + + return $this->testCount; } } diff --git a/dev/tests/verification/Resources/functionalSuiteWithComments.txt b/dev/tests/verification/Resources/functionalSuiteWithComments.txt index 7d5f827a4..0af9f2bee 100644 --- a/dev/tests/verification/Resources/functionalSuiteWithComments.txt +++ b/dev/tests/verification/Resources/functionalSuiteWithComments.txt @@ -188,12 +188,17 @@ class functionalSuiteWithComments extends \Codeception\GroupObject private function getTestCount() { $config = $this->getGlobalConfig(); - if (empty($config['groups']) && empty($config['groups'][self::$group])) { + if (empty($config['groups']) || empty($config['groups'][self::$group])) { return $this->testCount; } $pathToGroupDir = TESTS_BP . DIRECTORY_SEPARATOR . array_first($config['groups'][self::$group]); - $pathToGroupCests = $pathToGroupDir . DIRECTORY_SEPARATOR . "*Cest.php"; + $pathToGroupCests = $pathToGroupDir . "*Cest.php"; - return count(glob($pathToGroupCests)); + $files = glob($pathToGroupCests); + if (is_array($files)) { + return count($files); + } + + return $this->testCount; } } From a3274a32306b172d63682f42604f02d5ac59ac1d Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Tue, 23 Nov 2021 13:37:55 -0600 Subject: [PATCH 113/674] MQE-2669: Seprated a run:failed command to generate:failed and run:failed - fix a bug --- .../Resources/ActionsInDifferentModulesSuite.txt | 7 +++++-- dev/tests/verification/Resources/functionalSuiteHooks.txt | 7 +++++-- .../verification/Resources/functionalSuiteWithComments.txt | 7 +++++-- .../Suite/views/SuiteClass.mustache | 7 +++++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt index 35d04d385..116eff358 100644 --- a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt +++ b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt @@ -36,7 +36,6 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject public function _before(\Codeception\Event\TestEvent $e) { - $this->testCount = $this->getTestCount(); $this->webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver'); $this->moduleContainer = $this->webDriver->getModuleContainer(); // increment test count per execution @@ -52,6 +51,8 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject private function executePreConditions() { if ($this->currentTestRun == 1) { + $this->testCount = $this->getTestCount(); + print sprintf(self::$HOOK_EXECUTION_INIT, "before"); try { @@ -233,7 +234,9 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject $files = glob($pathToGroupCests); if (is_array($files)) { - return count($files); + $qty = count($files); + print('In a group "' . self::$group . '" suite executor found ' . $qty . ' tests.' . PHP_EOL); + return $qty; } return $this->testCount; diff --git a/dev/tests/verification/Resources/functionalSuiteHooks.txt b/dev/tests/verification/Resources/functionalSuiteHooks.txt index 7f00b67a8..243b7fecf 100644 --- a/dev/tests/verification/Resources/functionalSuiteHooks.txt +++ b/dev/tests/verification/Resources/functionalSuiteHooks.txt @@ -36,7 +36,6 @@ class functionalSuiteHooks extends \Codeception\GroupObject public function _before(\Codeception\Event\TestEvent $e) { - $this->testCount = $this->getTestCount(); $this->webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver'); $this->moduleContainer = $this->webDriver->getModuleContainer(); // increment test count per execution @@ -52,6 +51,8 @@ class functionalSuiteHooks extends \Codeception\GroupObject private function executePreConditions() { if ($this->currentTestRun == 1) { + $this->testCount = $this->getTestCount(); + print sprintf(self::$HOOK_EXECUTION_INIT, "before"); try { @@ -216,7 +217,9 @@ class functionalSuiteHooks extends \Codeception\GroupObject $files = glob($pathToGroupCests); if (is_array($files)) { - return count($files); + $qty = count($files); + print('In a group "' . self::$group . '" suite executor found ' . $qty . ' tests.' . PHP_EOL); + return $qty; } return $this->testCount; diff --git a/dev/tests/verification/Resources/functionalSuiteWithComments.txt b/dev/tests/verification/Resources/functionalSuiteWithComments.txt index 0af9f2bee..186a2ae63 100644 --- a/dev/tests/verification/Resources/functionalSuiteWithComments.txt +++ b/dev/tests/verification/Resources/functionalSuiteWithComments.txt @@ -36,7 +36,6 @@ class functionalSuiteWithComments extends \Codeception\GroupObject public function _before(\Codeception\Event\TestEvent $e) { - $this->testCount = $this->getTestCount(); $this->webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver'); $this->moduleContainer = $this->webDriver->getModuleContainer(); // increment test count per execution @@ -52,6 +51,8 @@ class functionalSuiteWithComments extends \Codeception\GroupObject private function executePreConditions() { if ($this->currentTestRun == 1) { + $this->testCount = $this->getTestCount(); + print sprintf(self::$HOOK_EXECUTION_INIT, "before"); try { @@ -196,7 +197,9 @@ class functionalSuiteWithComments extends \Codeception\GroupObject $files = glob($pathToGroupCests); if (is_array($files)) { - return count($files); + $qty = count($files); + print('In a group "' . self::$group . '" suite executor found ' . $qty . ' tests.' . PHP_EOL); + return $qty; } return $this->testCount; diff --git a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache index 83fed59d9..cf8fdd917 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache +++ b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache @@ -43,7 +43,6 @@ class {{suiteName}} extends \Codeception\GroupObject {{#before}} public function _before(\Codeception\Event\TestEvent $e) { - $this->testCount = $this->getTestCount(); $this->webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver'); $this->moduleContainer = $this->webDriver->getModuleContainer(); {{#helpers}} @@ -66,6 +65,8 @@ class {{suiteName}} extends \Codeception\GroupObject private function executePreConditions() { if ($this->currentTestRun == 1) { + $this->testCount = $this->getTestCount(); + print sprintf(self::$HOOK_EXECUTION_INIT, "before"); try { @@ -189,7 +190,9 @@ class {{suiteName}} extends \Codeception\GroupObject $files = glob($pathToGroupCests); if (is_array($files)) { - return count($files); + $qty = count($files); + print('In a group "' . self::$group . '" suite executor found ' . $qty . ' tests.' . PHP_EOL); + return $qty; } return $this->testCount; From 68e0ee814ceda9697ab1e43d3483eb0592d85147 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Tue, 23 Nov 2021 16:46:38 -0600 Subject: [PATCH 114/674] MQE-2669: Seprated a run:failed command to generate:failed and run:failed - add a simple unit test --- .../Console/RunTestFailedCommandTest.php | 53 +++++++++++++++++++ .../Console/RunTestFailedCommand.php | 2 +- 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 dev/tests/unit/Magento/FunctionalTestFramework/Console/RunTestFailedCommandTest.php diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/RunTestFailedCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/RunTestFailedCommandTest.php new file mode 100644 index 000000000..5bba89de1 --- /dev/null +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/RunTestFailedCommandTest.php @@ -0,0 +1,53 @@ +invokePrivateMethod($runFailed, 'filterTestsForExecution', [$testFailedFile]); + $this->assertEquals($expectedResult, $filter); + } + + /** + * Invoking private method to be able to test it. + * NOTE: Bad practice don't repeat it. + * + * @param $object + * @param $methodName + * @param array $parameters + * @return mixed + * @throws \ReflectionException + */ + private function invokePrivateMethod(&$object, $methodName, array $parameters = []) + { + $reflection = new \ReflectionClass(get_class($object)); + $method = $reflection->getMethod($methodName); + $method->setAccessible(true); + return $method->invokeArgs($object, $parameters); + } +} diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index 1614fc84c..96b376247 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -23,7 +23,7 @@ class RunTestFailedCommand extends BaseGenerateCommand /** * @var string */ - private $testsReRunFile = ""; + private $testsReRunFile = "rerun_tests"; /** * @var array From ed63e22ecc8cd2a5c0d79342f82f661449edbd4b Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Tue, 30 Nov 2021 11:14:32 -0600 Subject: [PATCH 115/674] MQE-3097: Release MFTF 3.7.1 --- CHANGELOG.md | 16 ++++++++++++++++ composer.json | 2 +- composer.lock | 3 +-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25271e6e4..eaa96a63e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ Magento Functional Testing Framework Changelog ================================================ +3.7.1 +--------- + +### GitHub Pull Requests: +* [#873](https://github.com/magento/magento2-functional-testing-framework/pull/873) -- Add check for isBuiltin method (for PHP 8 compatibility) by @karyna-tsymbal-atwix + +### Updates +* Moved `hoa/console` to suggest section to avoid issues with PHP8.0 +* Update `vlucas/phpdotenv` to the latest versions +* `` encodes special character which caused test failed +* Add filter for groups, now we can generate tests with specific group annotation +* Seprated a `run:failed` command to `generate:failed` and `run:failed` + * `run:failed` command can execute failed tests without need to regenerate failed tests +* Deleting MagentoPwaWebDriver file and moving it to Pwa_tests repo + + 3.7.0 --------- diff --git a/composer.json b/composer.json index a0dc719ad..61ff7b158 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": "3.7.0", + "version": "3.7.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index ca3820871..7c4e8d9c9 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": "eeaac3e027dffc09c8cf5229e9924faa", + "content-hash": "f74783e12acad4c892369ccf2820dff5", "packages": [ { "name": "allure-framework/allure-codeception", @@ -4835,7 +4835,6 @@ "type": "github" } ], - "abandoned": true, "time": "2020-09-28T06:45:17+00:00" }, { From d0d55e6f201e298e1fbd66498209da8b112b9bbd Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Tue, 30 Nov 2021 14:49:27 -0600 Subject: [PATCH 116/674] MQE-3097: Release MFTF 3.7.1 - update docs --- docs/commands/mftf.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/commands/mftf.md b/docs/commands/mftf.md index 4abd0dace..67fc61e02 100644 --- a/docs/commands/mftf.md +++ b/docs/commands/mftf.md @@ -80,13 +80,22 @@ vendor/bin/mftf run:manifest path/to/your/testManifest.txt This command runs all tests specified in a `testManifest.txt` file. When you generate tests, a `testManifest.txt` file is also generated for you. You can pass this file directly to the `run:manifest` command and it will execute all listed tests. You can also create your own file in the same format to execute a subset of tests. Note: This command does not generate tests. -### Generate and run previously failed tests +### Generate previously failed tests + +```bash +vendor/bin/mftf generate:failed +``` + +This command cleans up the previously generated tests; generates the tests listed in `dev/tests/acceptance/tests/_output/failed`. +For more details about `failed`, refer to [Reporting][]. + +### Run previously failed tests ```bash vendor/bin/mftf run:failed ``` -This command cleans up the previously generated tests; generates and runs the tests listed in `dev/tests/acceptance/tests/_output/failed`. +This command runs the tests listed in `dev/tests/acceptance/tests/_output/failed`. For more details about `failed`, refer to [Reporting][]. ## Error tolerance during generation From 6868d79d423139d2d73f9b7edc3e66bd0dca5d4d Mon Sep 17 00:00:00 2001 From: Oleksandr Shmyheliuk Date: Mon, 6 Dec 2021 15:30:50 -0600 Subject: [PATCH 117/674] Fix encoding issue when secret key contains plus sign --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 00e295606..dcf07da78 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -571,7 +571,7 @@ public function magentoCLI($command, $timeout = null, $arguments = null) $apiURL, [ 'token' => WebApiAuth::getAdminToken(), - getenv('MAGENTO_CLI_COMMAND_PARAMETER') => $command, + getenv('MAGENTO_CLI_COMMAND_PARAMETER') => urlencode($command), 'arguments' => $arguments, 'timeout' => $timeout, ], From 95708308239091419a971866ab63d0da1c8de68f Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 6 Dec 2021 16:14:15 -0600 Subject: [PATCH 118/674] MQE-3122: Logging of failed test is not working when test fails in `after` section --- .../ActionGroupContainsStepKeyInArgText.txt | 20 +++++++++++++++++-- .../ActionGroupMergedViaInsertAfter.txt | 20 +++++++++++++++++-- .../ActionGroupMergedViaInsertBefore.txt | 20 +++++++++++++++++-- .../ActionGroupReturningValueTest.txt | 12 +++++++++-- .../Resources/ActionGroupToExtend.txt | 20 +++++++++++++++++-- .../Resources/ActionGroupUsingCreateData.txt | 20 +++++++++++++++++-- .../ActionGroupUsingNestedArgument.txt | 20 +++++++++++++++++-- .../ActionGroupWithDataOverrideTest.txt | 12 +++++++++-- .../Resources/ActionGroupWithDataTest.txt | 20 +++++++++++++++++-- ...hDefaultArgumentAndStringSelectorParam.txt | 20 +++++++++++++++++-- ...eParameterSelectorsFromDefaultArgument.txt | 20 +++++++++++++++++-- .../Resources/ActionGroupWithNoArguments.txt | 20 +++++++++++++++++-- .../ActionGroupWithNoDefaultTest.txt | 12 +++++++++-- ...roupWithParameterizedElementWithHyphen.txt | 20 +++++++++++++++++-- ...meterizedElementsWithStepKeyReferences.txt | 20 +++++++++++++++++-- ...thPassedArgumentAndStringSelectorParam.txt | 20 +++++++++++++++++-- .../ActionGroupWithPersistedData.txt | 12 +++++++++-- ...tionGroupWithSectionAndDataAsArguments.txt | 20 +++++++++++++++++-- ...WithSimpleDataUsageFromDefaultArgument.txt | 20 +++++++++++++++++-- ...pWithSimpleDataUsageFromPassedArgument.txt | 20 +++++++++++++++++-- ...leParameterSelectorFromDefaultArgument.txt | 20 +++++++++++++++++-- ...gleParameterSelectorFromPassedArgument.txt | 20 +++++++++++++++++-- .../ActionGroupWithStepKeyReferences.txt | 20 +++++++++++++++++-- .../ActionGroupWithTopLevelPersistedData.txt | 12 +++++++++-- .../ArgumentWithSameNameAsElement.txt | 12 +++++++++-- .../verification/Resources/AssertTest.txt | 20 +++++++++++++++++-- .../Resources/BasicActionGroupTest.txt | 20 +++++++++++++++++-- .../Resources/BasicFunctionalTest.txt | 12 +++++++++-- .../verification/Resources/BasicMergeTest.txt | 12 +++++++++-- .../Resources/CharacterReplacementTest.txt | 20 +++++++++++++++++-- .../Resources/ChildExtendedTestAddHooks.txt | 12 +++++++++-- .../Resources/ChildExtendedTestMerging.txt | 12 +++++++++-- .../Resources/ChildExtendedTestNoParent.txt | 16 +++++++++++++++ .../ChildExtendedTestRemoveAction.txt | 12 +++++++++-- .../ChildExtendedTestRemoveHookAction.txt | 12 +++++++++-- .../Resources/ChildExtendedTestReplace.txt | 12 +++++++++-- .../ChildExtendedTestReplaceHook.txt | 12 +++++++++-- .../Resources/DataActionsTest.txt | 20 +++++++++++++++++-- .../Resources/DataReplacementTest.txt | 20 +++++++++++++++++-- .../Resources/DeprecatedEntitiesTest.txt | 20 +++++++++++++++++-- .../verification/Resources/DeprecatedTest.txt | 20 +++++++++++++++++-- .../Resources/ExecuteJsEscapingTest.txt | 20 +++++++++++++++++-- .../Resources/ExtendParentDataTest.txt | 20 +++++++++++++++++-- .../Resources/ExtendedActionGroup.txt | 20 +++++++++++++++++-- .../ExtendedActionGroupReturningValueTest.txt | 9 +++++++-- ...ndedChildActionGroupReturningValueTest.txt | 20 +++++++++++++++++-- .../ExtendedChildTestInSuiteCest.txt | 12 +++++++++-- .../Resources/ExtendedChildTestNotInSuite.txt | 12 +++++++++-- .../Resources/ExtendedParameterArrayTest.txt | 20 +++++++++++++++++-- .../Resources/ExtendedRemoveActionGroup.txt | 20 +++++++++++++++++-- .../Resources/ExtendingSkippedTest.txt | 16 +++++++++++++++ .../Resources/GroupSkipGenerationTest.txt | 20 +++++++++++++++++-- .../Resources/HookActionsTest.txt | 12 +++++++++-- .../Resources/LocatorFunctionTest.txt | 20 +++++++++++++++++-- .../Resources/MergeMassViaInsertAfter.txt | 20 +++++++++++++++++-- .../Resources/MergeMassViaInsertBefore.txt | 20 +++++++++++++++++-- .../verification/Resources/MergeSkip.txt | 16 +++++++++++++++ .../MergedActionGroupReturningValueTest.txt | 12 +++++++++-- .../Resources/MergedActionGroupTest.txt | 12 +++++++++-- .../Resources/MergedReferencesTest.txt | 12 +++++++++-- .../Resources/MultipleActionGroupsTest.txt | 12 +++++++++-- .../Resources/PageReplacementTest.txt | 20 +++++++++++++++++-- .../Resources/ParameterArrayTest.txt | 20 +++++++++++++++++-- .../Resources/ParentExtendedTest.txt | 12 +++++++++-- .../PersistedAndXmlEntityArguments.txt | 20 +++++++++++++++++-- .../Resources/PersistedReplacementTest.txt | 20 +++++++++++++++++-- .../PersistenceActionGroupAppendingTest.txt | 20 +++++++++++++++++-- .../Resources/PersistenceCustomFieldsTest.txt | 20 +++++++++++++++++-- .../Resources/SectionReplacementTest.txt | 20 +++++++++++++++++-- .../verification/Resources/SkippedTest.txt | 16 +++++++++++++++ .../Resources/SkippedTestTwoIssues.txt | 16 +++++++++++++++ .../Resources/SkippedTestWithHooks.txt | 16 +++++++++++++++ .../Resources/XmlCommentedActionGroupTest.txt | 20 +++++++++++++++++-- .../Resources/XmlCommentedTest.txt | 12 +++++++++-- .../Util/TestGenerator.php | 17 ++++++++++++++-- 75 files changed, 1140 insertions(+), 138 deletions(-) diff --git a/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt b/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt index ad906d4ea..710612750 100644 --- a/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt +++ b/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt @@ -17,6 +17,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupContainsStepKeyInArgTextCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -28,6 +33,17 @@ class ActionGroupContainsStepKeyInArgTextCest $I->comment("Exiting Action Group [actionGroup] actionGroupContainsStepKeyInArgValue"); } + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -44,7 +60,7 @@ class ActionGroupContainsStepKeyInArgTextCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupMergedViaInsertAfter.txt b/dev/tests/verification/Resources/ActionGroupMergedViaInsertAfter.txt index a69b8d212..ab10b3b80 100644 --- a/dev/tests/verification/Resources/ActionGroupMergedViaInsertAfter.txt +++ b/dev/tests/verification/Resources/ActionGroupMergedViaInsertAfter.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupMergedViaInsertAfterCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -38,7 +54,7 @@ class ActionGroupMergedViaInsertAfterCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupMergedViaInsertBefore.txt b/dev/tests/verification/Resources/ActionGroupMergedViaInsertBefore.txt index 45d5188d4..05d82165a 100644 --- a/dev/tests/verification/Resources/ActionGroupMergedViaInsertBefore.txt +++ b/dev/tests/verification/Resources/ActionGroupMergedViaInsertBefore.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupMergedViaInsertBeforeCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -38,7 +54,7 @@ class ActionGroupMergedViaInsertBeforeCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt index 2d0220e65..1fb0726e1 100644 --- a/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupReturningValueTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -41,6 +46,9 @@ class ActionGroupReturningValueTestCest $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -75,7 +83,7 @@ class ActionGroupReturningValueTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupToExtend.txt b/dev/tests/verification/Resources/ActionGroupToExtend.txt index 14ef8a29a..5ec7f0a0e 100644 --- a/dev/tests/verification/Resources/ActionGroupToExtend.txt +++ b/dev/tests/verification/Resources/ActionGroupToExtend.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupToExtendCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -34,7 +50,7 @@ class ActionGroupToExtendCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt b/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt index 8afc91f6f..b451abc2b 100644 --- a/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt +++ b/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt @@ -17,6 +17,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupUsingCreateDataCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -29,6 +34,17 @@ class ActionGroupUsingCreateDataCest $I->comment("Exiting Action Group [Key1] actionGroupWithCreateData"); } + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -42,7 +58,7 @@ class ActionGroupUsingCreateDataCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupUsingNestedArgument.txt b/dev/tests/verification/Resources/ActionGroupUsingNestedArgument.txt index 657046cd5..ff745ba05 100644 --- a/dev/tests/verification/Resources/ActionGroupUsingNestedArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupUsingNestedArgument.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupUsingNestedArgumentCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -34,7 +50,7 @@ class ActionGroupUsingNestedArgumentCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt b/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt index bf430a668..2ecc0f729 100644 --- a/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithDataOverrideTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -41,6 +46,9 @@ class ActionGroupWithDataOverrideTestCest $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -76,7 +84,7 @@ class ActionGroupWithDataOverrideTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithDataTest.txt b/dev/tests/verification/Resources/ActionGroupWithDataTest.txt index 0de660c0e..bde1dcdd6 100644 --- a/dev/tests/verification/Resources/ActionGroupWithDataTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithDataTest.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithDataTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -31,6 +36,17 @@ class ActionGroupWithDataTestCest $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); } + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @param AcceptanceTester $I * @throws \Exception @@ -76,7 +92,7 @@ class ActionGroupWithDataTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithDefaultArgumentAndStringSelectorParam.txt b/dev/tests/verification/Resources/ActionGroupWithDefaultArgumentAndStringSelectorParam.txt index 21f54d3ed..7a68cf16a 100644 --- a/dev/tests/verification/Resources/ActionGroupWithDefaultArgumentAndStringSelectorParam.txt +++ b/dev/tests/verification/Resources/ActionGroupWithDefaultArgumentAndStringSelectorParam.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithDefaultArgumentAndStringSelectorParamCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::BLOCKER) * @Features({"TestModule"}) @@ -35,7 +51,7 @@ class ActionGroupWithDefaultArgumentAndStringSelectorParamCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt b/dev/tests/verification/Resources/ActionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt index b24fac754..6b8c738e0 100644 --- a/dev/tests/verification/Resources/ActionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithMultipleParameterSelectorsFromDefaultArgumentCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::BLOCKER) * @Features({"TestModule"}) @@ -35,7 +51,7 @@ class ActionGroupWithMultipleParameterSelectorsFromDefaultArgumentCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithNoArguments.txt b/dev/tests/verification/Resources/ActionGroupWithNoArguments.txt index 383164241..2371d86dd 100644 --- a/dev/tests/verification/Resources/ActionGroupWithNoArguments.txt +++ b/dev/tests/verification/Resources/ActionGroupWithNoArguments.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithNoArgumentsCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::BLOCKER) * @Features({"TestModule"}) @@ -35,7 +51,7 @@ class ActionGroupWithNoArgumentsCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt b/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt index 97a060d1c..19f3de5ad 100644 --- a/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithNoDefaultTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -41,6 +46,9 @@ class ActionGroupWithNoDefaultTestCest $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -74,7 +82,7 @@ class ActionGroupWithNoDefaultTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithParameterizedElementWithHyphen.txt b/dev/tests/verification/Resources/ActionGroupWithParameterizedElementWithHyphen.txt index 53657a2ae..17a9d766b 100644 --- a/dev/tests/verification/Resources/ActionGroupWithParameterizedElementWithHyphen.txt +++ b/dev/tests/verification/Resources/ActionGroupWithParameterizedElementWithHyphen.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithParameterizedElementWithHyphenCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -33,7 +49,7 @@ class ActionGroupWithParameterizedElementWithHyphenCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithParameterizedElementsWithStepKeyReferences.txt b/dev/tests/verification/Resources/ActionGroupWithParameterizedElementsWithStepKeyReferences.txt index 47d0566eb..2f31d0686 100644 --- a/dev/tests/verification/Resources/ActionGroupWithParameterizedElementsWithStepKeyReferences.txt +++ b/dev/tests/verification/Resources/ActionGroupWithParameterizedElementsWithStepKeyReferences.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithParameterizedElementsWithStepKeyReferencesCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -38,7 +54,7 @@ class ActionGroupWithParameterizedElementsWithStepKeyReferencesCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithPassedArgumentAndStringSelectorParam.txt b/dev/tests/verification/Resources/ActionGroupWithPassedArgumentAndStringSelectorParam.txt index 31771d938..e58d8c5a5 100644 --- a/dev/tests/verification/Resources/ActionGroupWithPassedArgumentAndStringSelectorParam.txt +++ b/dev/tests/verification/Resources/ActionGroupWithPassedArgumentAndStringSelectorParam.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithPassedArgumentAndStringSelectorParamCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::BLOCKER) * @Features({"TestModule"}) @@ -35,7 +51,7 @@ class ActionGroupWithPassedArgumentAndStringSelectorParamCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt b/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt index 3943f1271..782e27a8e 100644 --- a/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt +++ b/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithPersistedDataCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -41,6 +46,9 @@ class ActionGroupWithPersistedDataCest $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -75,7 +83,7 @@ class ActionGroupWithPersistedDataCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithSectionAndDataAsArguments.txt b/dev/tests/verification/Resources/ActionGroupWithSectionAndDataAsArguments.txt index 71519b234..d07a32cd0 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSectionAndDataAsArguments.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSectionAndDataAsArguments.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithSectionAndDataAsArgumentsCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -33,7 +49,7 @@ class ActionGroupWithSectionAndDataAsArgumentsCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromDefaultArgument.txt b/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromDefaultArgument.txt index 72ade673a..ab5465ca0 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromDefaultArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromDefaultArgument.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithSimpleDataUsageFromDefaultArgumentCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) @@ -35,7 +51,7 @@ class ActionGroupWithSimpleDataUsageFromDefaultArgumentCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromPassedArgument.txt b/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromPassedArgument.txt index b19c6b20f..c86e9dc4f 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromPassedArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromPassedArgument.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithSimpleDataUsageFromPassedArgumentCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) @@ -62,7 +78,7 @@ class ActionGroupWithSimpleDataUsageFromPassedArgumentCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt b/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt index 81712b6fe..34ba535f8 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithSingleParameterSelectorFromDefaultArgumentCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::BLOCKER) * @Features({"TestModule"}) @@ -35,7 +51,7 @@ class ActionGroupWithSingleParameterSelectorFromDefaultArgumentCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromPassedArgument.txt b/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromPassedArgument.txt index eeb346b60..45f72a95b 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromPassedArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromPassedArgument.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithSingleParameterSelectorFromPassedArgumentCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::BLOCKER) * @Features({"TestModule"}) @@ -35,7 +51,7 @@ class ActionGroupWithSingleParameterSelectorFromPassedArgumentCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt b/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt index ef20ee94b..532c70868 100644 --- a/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt +++ b/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithStepKeyReferencesCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -58,7 +74,7 @@ class ActionGroupWithStepKeyReferencesCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt b/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt index daba0ab12..285e66370 100644 --- a/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt +++ b/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ActionGroupWithTopLevelPersistedDataCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -41,6 +46,9 @@ class ActionGroupWithTopLevelPersistedDataCest $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -74,7 +82,7 @@ class ActionGroupWithTopLevelPersistedDataCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt b/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt index 2ea282f07..b643eb759 100644 --- a/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt +++ b/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ArgumentWithSameNameAsElementCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -41,6 +46,9 @@ class ArgumentWithSameNameAsElementCest $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -71,7 +79,7 @@ class ArgumentWithSameNameAsElementCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/AssertTest.txt b/dev/tests/verification/Resources/AssertTest.txt index c4fe946e4..6c30b7273 100644 --- a/dev/tests/verification/Resources/AssertTest.txt +++ b/dev/tests/verification/Resources/AssertTest.txt @@ -17,6 +17,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class AssertTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -26,6 +31,17 @@ class AssertTestCest $I->createEntity("createData1", "hook", "ReplacementPerson", [], []); // stepKey: createData1 } + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -163,7 +179,7 @@ class AssertTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/BasicActionGroupTest.txt b/dev/tests/verification/Resources/BasicActionGroupTest.txt index e2bfdae7e..45cac4937 100644 --- a/dev/tests/verification/Resources/BasicActionGroupTest.txt +++ b/dev/tests/verification/Resources/BasicActionGroupTest.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class BasicActionGroupTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -31,6 +36,17 @@ class BasicActionGroupTestCest $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); } + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) @@ -52,7 +68,7 @@ class BasicActionGroupTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/BasicFunctionalTest.txt b/dev/tests/verification/Resources/BasicFunctionalTest.txt index e6ac37f12..c5ce0305c 100644 --- a/dev/tests/verification/Resources/BasicFunctionalTest.txt +++ b/dev/tests/verification/Resources/BasicFunctionalTest.txt @@ -19,6 +19,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class BasicFunctionalTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -35,6 +40,9 @@ class BasicFunctionalTestCest public function _after(AcceptanceTester $I) { $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -188,7 +196,7 @@ class BasicFunctionalTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/BasicMergeTest.txt b/dev/tests/verification/Resources/BasicMergeTest.txt index a32d6b50e..0ccd3e898 100644 --- a/dev/tests/verification/Resources/BasicMergeTest.txt +++ b/dev/tests/verification/Resources/BasicMergeTest.txt @@ -20,6 +20,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class BasicMergeTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -37,6 +42,9 @@ class BasicMergeTestCest public function _after(AcceptanceTester $I) { $I->amOnPage("/afterUrl1"); // stepKey: after1 + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -78,7 +86,7 @@ class BasicMergeTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/CharacterReplacementTest.txt b/dev/tests/verification/Resources/CharacterReplacementTest.txt index 3cdccd7e6..b87c36a40 100644 --- a/dev/tests/verification/Resources/CharacterReplacementTest.txt +++ b/dev/tests/verification/Resources/CharacterReplacementTest.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class CharacterReplacementTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -38,7 +54,7 @@ class CharacterReplacementTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt b/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt index 782eec26f..2e949082a 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt @@ -19,6 +19,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ChildExtendedTestAddHooksCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -35,6 +40,9 @@ class ChildExtendedTestAddHooksCest public function _after(AcceptanceTester $I) { $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -61,7 +69,7 @@ class ChildExtendedTestAddHooksCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestMerging.txt b/dev/tests/verification/Resources/ChildExtendedTestMerging.txt index dd8fba438..9e892e290 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestMerging.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestMerging.txt @@ -19,6 +19,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ChildExtendedTestMergingCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -37,6 +42,9 @@ class ChildExtendedTestMergingCest public function _after(AcceptanceTester $I) { $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -67,7 +75,7 @@ class ChildExtendedTestMergingCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt b/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt index 779f89c7e..12094a518 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt @@ -20,6 +20,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ChildExtendedTestNoParentCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) diff --git a/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt b/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt index 2a0eddf57..28b4ec7fd 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt @@ -19,6 +19,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ChildExtendedTestRemoveActionCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -35,6 +40,9 @@ class ChildExtendedTestRemoveActionCest public function _after(AcceptanceTester $I) { $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -61,7 +69,7 @@ class ChildExtendedTestRemoveActionCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt b/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt index 2ab9eaf11..3649c85fe 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt @@ -19,6 +19,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ChildExtendedTestRemoveHookActionCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -34,6 +39,9 @@ class ChildExtendedTestRemoveHookActionCest public function _after(AcceptanceTester $I) { $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -61,7 +69,7 @@ class ChildExtendedTestRemoveHookActionCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestReplace.txt b/dev/tests/verification/Resources/ChildExtendedTestReplace.txt index daf1bfe2f..a3cfdd2aa 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestReplace.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestReplace.txt @@ -19,6 +19,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ChildExtendedTestReplaceCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -35,6 +40,9 @@ class ChildExtendedTestReplaceCest public function _after(AcceptanceTester $I) { $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -62,7 +70,7 @@ class ChildExtendedTestReplaceCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt b/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt index 67ef1b40e..abe55a071 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt @@ -19,6 +19,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ChildExtendedTestReplaceHookCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -35,6 +40,9 @@ class ChildExtendedTestReplaceHookCest public function _after(AcceptanceTester $I) { $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -62,7 +70,7 @@ class ChildExtendedTestReplaceHookCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/DataActionsTest.txt b/dev/tests/verification/Resources/DataActionsTest.txt index 2c735ed35..f84f97040 100644 --- a/dev/tests/verification/Resources/DataActionsTest.txt +++ b/dev/tests/verification/Resources/DataActionsTest.txt @@ -17,6 +17,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class DataActionsTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -28,6 +33,17 @@ class DataActionsTestCest $I->deleteEntity("createdInBefore", "hook"); // stepKey: deleteInBefore } + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -46,7 +62,7 @@ class DataActionsTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/DataReplacementTest.txt b/dev/tests/verification/Resources/DataReplacementTest.txt index f1d405750..00c28b31e 100644 --- a/dev/tests/verification/Resources/DataReplacementTest.txt +++ b/dev/tests/verification/Resources/DataReplacementTest.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class DataReplacementTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -92,7 +108,7 @@ class DataReplacementTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/DeprecatedEntitiesTest.txt b/dev/tests/verification/Resources/DeprecatedEntitiesTest.txt index 4d0652bb3..9a0ec8a27 100644 --- a/dev/tests/verification/Resources/DeprecatedEntitiesTest.txt +++ b/dev/tests/verification/Resources/DeprecatedEntitiesTest.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class DeprecatedEntitiesTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -34,7 +50,7 @@ class DeprecatedEntitiesTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/DeprecatedTest.txt b/dev/tests/verification/Resources/DeprecatedTest.txt index 71fc1de4d..acdb53cc0 100644 --- a/dev/tests/verification/Resources/DeprecatedTest.txt +++ b/dev/tests/verification/Resources/DeprecatedTest.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class DeprecatedTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -34,7 +50,7 @@ class DeprecatedTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ExecuteJsEscapingTest.txt b/dev/tests/verification/Resources/ExecuteJsEscapingTest.txt index 6d4de9ad1..fc1331ef2 100644 --- a/dev/tests/verification/Resources/ExecuteJsEscapingTest.txt +++ b/dev/tests/verification/Resources/ExecuteJsEscapingTest.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ExecuteJsEscapingTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -35,7 +51,7 @@ class ExecuteJsEscapingTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ExtendParentDataTest.txt b/dev/tests/verification/Resources/ExtendParentDataTest.txt index 7e97473bd..6b96cbbda 100644 --- a/dev/tests/verification/Resources/ExtendParentDataTest.txt +++ b/dev/tests/verification/Resources/ExtendParentDataTest.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ExtendParentDataTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -36,7 +52,7 @@ class ExtendParentDataTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ExtendedActionGroup.txt b/dev/tests/verification/Resources/ExtendedActionGroup.txt index 71e9121fa..a2cc9fc74 100644 --- a/dev/tests/verification/Resources/ExtendedActionGroup.txt +++ b/dev/tests/verification/Resources/ExtendedActionGroup.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ExtendedActionGroupCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -37,7 +53,7 @@ class ExtendedActionGroupCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt index 9b89b3825..e5efd6cc9 100644 --- a/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ExtendedActionGroupReturningValueTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) @@ -40,7 +45,7 @@ class ExtendedActionGroupReturningValueTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ExtendedChildActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/ExtendedChildActionGroupReturningValueTest.txt index e0d9e29f6..c262ffd85 100644 --- a/dev/tests/verification/Resources/ExtendedChildActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/ExtendedChildActionGroupReturningValueTest.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ExtendedChildActionGroupReturningValueTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) @@ -43,7 +59,7 @@ class ExtendedChildActionGroupReturningValueTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt b/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt index 2d1c91630..2e6da3464 100644 --- a/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt +++ b/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt @@ -19,6 +19,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ExtendedChildTestInSuiteCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -35,6 +40,9 @@ class ExtendedChildTestInSuiteCest public function _after(AcceptanceTester $I) { $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -62,7 +70,7 @@ class ExtendedChildTestInSuiteCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt b/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt index 30d188c9d..a18346a77 100644 --- a/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt +++ b/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ExtendedChildTestNotInSuiteCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -34,6 +39,9 @@ class ExtendedChildTestNotInSuiteCest public function _after(AcceptanceTester $I) { $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -61,7 +69,7 @@ class ExtendedChildTestNotInSuiteCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ExtendedParameterArrayTest.txt b/dev/tests/verification/Resources/ExtendedParameterArrayTest.txt index 306f10fee..7af46fe5a 100644 --- a/dev/tests/verification/Resources/ExtendedParameterArrayTest.txt +++ b/dev/tests/verification/Resources/ExtendedParameterArrayTest.txt @@ -16,6 +16,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ExtendParentDataTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -35,7 +51,7 @@ class ExtendParentDataTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt b/dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt index 792a4ac4f..1e24e644a 100644 --- a/dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt +++ b/dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ExtendedRemoveActionGroupCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -32,7 +48,7 @@ class ExtendedRemoveActionGroupCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ExtendingSkippedTest.txt b/dev/tests/verification/Resources/ExtendingSkippedTest.txt index 45b8614e4..0b78b5136 100644 --- a/dev/tests/verification/Resources/ExtendingSkippedTest.txt +++ b/dev/tests/verification/Resources/ExtendingSkippedTest.txt @@ -19,6 +19,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ExtendingSkippedTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) diff --git a/dev/tests/verification/Resources/GroupSkipGenerationTest.txt b/dev/tests/verification/Resources/GroupSkipGenerationTest.txt index 1a6156cac..b13aa399a 100644 --- a/dev/tests/verification/Resources/GroupSkipGenerationTest.txt +++ b/dev/tests/verification/Resources/GroupSkipGenerationTest.txt @@ -19,6 +19,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class GroupSkipGenerationTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Stories({"GroupSkipGenerationTestStory"}) * @Severity(level = SeverityLevel::MINOR) @@ -34,7 +50,7 @@ class GroupSkipGenerationTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/HookActionsTest.txt b/dev/tests/verification/Resources/HookActionsTest.txt index 0ffabfd9e..a04a980a1 100644 --- a/dev/tests/verification/Resources/HookActionsTest.txt +++ b/dev/tests/verification/Resources/HookActionsTest.txt @@ -17,6 +17,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class HookActionsTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -36,6 +41,9 @@ class HookActionsTestCest { $I->createEntity("sampleCreateAfter", "hook", "sampleCreatedEntity", [], []); // stepKey: sampleCreateAfter $I->deleteEntity("sampleCreateForAfter", "hook"); // stepKey: sampleDeleteAfter + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -60,7 +68,7 @@ class HookActionsTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/LocatorFunctionTest.txt b/dev/tests/verification/Resources/LocatorFunctionTest.txt index deffe887b..86d744a2d 100644 --- a/dev/tests/verification/Resources/LocatorFunctionTest.txt +++ b/dev/tests/verification/Resources/LocatorFunctionTest.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class LocatorFunctionTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -43,7 +59,7 @@ class LocatorFunctionTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/MergeMassViaInsertAfter.txt b/dev/tests/verification/Resources/MergeMassViaInsertAfter.txt index 250cb8b18..49c246251 100644 --- a/dev/tests/verification/Resources/MergeMassViaInsertAfter.txt +++ b/dev/tests/verification/Resources/MergeMassViaInsertAfter.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class MergeMassViaInsertAfterCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -36,7 +52,7 @@ class MergeMassViaInsertAfterCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/MergeMassViaInsertBefore.txt b/dev/tests/verification/Resources/MergeMassViaInsertBefore.txt index 2e14981b0..6080a5f23 100644 --- a/dev/tests/verification/Resources/MergeMassViaInsertBefore.txt +++ b/dev/tests/verification/Resources/MergeMassViaInsertBefore.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class MergeMassViaInsertBeforeCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -36,7 +52,7 @@ class MergeMassViaInsertBeforeCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/MergeSkip.txt b/dev/tests/verification/Resources/MergeSkip.txt index 885d622ac..8ce10f3e1 100644 --- a/dev/tests/verification/Resources/MergeSkip.txt +++ b/dev/tests/verification/Resources/MergeSkip.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class MergeSkipCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") diff --git a/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt index ef7960d21..71d8ed94a 100644 --- a/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class MergedActionGroupReturningValueTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -41,6 +46,9 @@ class MergedActionGroupReturningValueTestCest $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -77,7 +85,7 @@ class MergedActionGroupReturningValueTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/MergedActionGroupTest.txt b/dev/tests/verification/Resources/MergedActionGroupTest.txt index f592a9806..e92a06f6f 100644 --- a/dev/tests/verification/Resources/MergedActionGroupTest.txt +++ b/dev/tests/verification/Resources/MergedActionGroupTest.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class MergedActionGroupTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -41,6 +46,9 @@ class MergedActionGroupTestCest $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -73,7 +81,7 @@ class MergedActionGroupTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/MergedReferencesTest.txt b/dev/tests/verification/Resources/MergedReferencesTest.txt index 678ae79fe..b1f95d56c 100644 --- a/dev/tests/verification/Resources/MergedReferencesTest.txt +++ b/dev/tests/verification/Resources/MergedReferencesTest.txt @@ -19,6 +19,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class MergedReferencesTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -35,6 +40,9 @@ class MergedReferencesTestCest public function _after(AcceptanceTester $I) { $I->amOnPage("/afterUrl"); // stepKey: after1 + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -63,7 +71,7 @@ class MergedReferencesTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/MultipleActionGroupsTest.txt b/dev/tests/verification/Resources/MultipleActionGroupsTest.txt index 6a387eb76..15659f21f 100644 --- a/dev/tests/verification/Resources/MultipleActionGroupsTest.txt +++ b/dev/tests/verification/Resources/MultipleActionGroupsTest.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class MultipleActionGroupsTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -41,6 +46,9 @@ class MultipleActionGroupsTestCest $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -83,7 +91,7 @@ class MultipleActionGroupsTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/PageReplacementTest.txt b/dev/tests/verification/Resources/PageReplacementTest.txt index a83a8ac02..af4defdb9 100644 --- a/dev/tests/verification/Resources/PageReplacementTest.txt +++ b/dev/tests/verification/Resources/PageReplacementTest.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class PageReplacementTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -42,7 +58,7 @@ class PageReplacementTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ParameterArrayTest.txt b/dev/tests/verification/Resources/ParameterArrayTest.txt index b6ed5ac8c..6488db6b0 100644 --- a/dev/tests/verification/Resources/ParameterArrayTest.txt +++ b/dev/tests/verification/Resources/ParameterArrayTest.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ParameterArrayTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -53,7 +69,7 @@ class ParameterArrayTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/ParentExtendedTest.txt b/dev/tests/verification/Resources/ParentExtendedTest.txt index 3a035ede7..73e6b7aa0 100644 --- a/dev/tests/verification/Resources/ParentExtendedTest.txt +++ b/dev/tests/verification/Resources/ParentExtendedTest.txt @@ -19,6 +19,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class ParentExtendedTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -35,6 +40,9 @@ class ParentExtendedTestCest public function _after(AcceptanceTester $I) { $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -62,7 +70,7 @@ class ParentExtendedTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/PersistedAndXmlEntityArguments.txt b/dev/tests/verification/Resources/PersistedAndXmlEntityArguments.txt index 9e991362a..f4cc8cfaa 100644 --- a/dev/tests/verification/Resources/PersistedAndXmlEntityArguments.txt +++ b/dev/tests/verification/Resources/PersistedAndXmlEntityArguments.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class PersistedAndXmlEntityArgumentsCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -33,7 +49,7 @@ class PersistedAndXmlEntityArgumentsCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/PersistedReplacementTest.txt b/dev/tests/verification/Resources/PersistedReplacementTest.txt index f0609e4a8..95706e75b 100644 --- a/dev/tests/verification/Resources/PersistedReplacementTest.txt +++ b/dev/tests/verification/Resources/PersistedReplacementTest.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class PersistedReplacementTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @param AcceptanceTester $I * @throws \Exception @@ -62,7 +78,7 @@ class PersistedReplacementTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt b/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt index b966d7ca6..d1f75ccb6 100644 --- a/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt +++ b/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt @@ -17,6 +17,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class PersistenceActionGroupAppendingTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -32,6 +37,17 @@ class PersistenceActionGroupAppendingTestCest $I->comment("Exiting Action Group [ACTIONGROUPBEFORE] DataPersistenceAppendingActionGroup"); } + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -52,7 +68,7 @@ class PersistenceActionGroupAppendingTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt b/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt index 34409d108..5bbc0b325 100644 --- a/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt +++ b/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt @@ -17,6 +17,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class PersistenceCustomFieldsTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -30,6 +35,17 @@ class PersistenceCustomFieldsTestCest $I->createEntity("createData2", "hook", "uniqueData", ["createData1"], $createData2Fields); // stepKey: createData2 } + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -64,7 +80,7 @@ class PersistenceCustomFieldsTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/SectionReplacementTest.txt b/dev/tests/verification/Resources/SectionReplacementTest.txt index 8b3eadc1b..a71d1c4ef 100644 --- a/dev/tests/verification/Resources/SectionReplacementTest.txt +++ b/dev/tests/verification/Resources/SectionReplacementTest.txt @@ -17,6 +17,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class SectionReplacementTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") @@ -66,7 +82,7 @@ class SectionReplacementTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/SkippedTest.txt b/dev/tests/verification/Resources/SkippedTest.txt index b50145c0e..99832ef9a 100644 --- a/dev/tests/verification/Resources/SkippedTest.txt +++ b/dev/tests/verification/Resources/SkippedTest.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class SkippedTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Stories({"skipped"}) * @Severity(level = SeverityLevel::MINOR) diff --git a/dev/tests/verification/Resources/SkippedTestTwoIssues.txt b/dev/tests/verification/Resources/SkippedTestTwoIssues.txt index a494328ba..951d15678 100644 --- a/dev/tests/verification/Resources/SkippedTestTwoIssues.txt +++ b/dev/tests/verification/Resources/SkippedTestTwoIssues.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class SkippedTestTwoIssuesCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Stories({"skippedMultiple"}) * @Severity(level = SeverityLevel::MINOR) diff --git a/dev/tests/verification/Resources/SkippedTestWithHooks.txt b/dev/tests/verification/Resources/SkippedTestWithHooks.txt index 15936c463..84b0203c4 100644 --- a/dev/tests/verification/Resources/SkippedTestWithHooks.txt +++ b/dev/tests/verification/Resources/SkippedTestWithHooks.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class SkippedTestWithHooksCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Stories({"skippedWithHooks"}) * @Severity(level = SeverityLevel::MINOR) diff --git a/dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt b/dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt index 5765aab13..f45e8f0b2 100644 --- a/dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt +++ b/dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt @@ -18,6 +18,22 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class XmlCommentedActionGroupTestCest { + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) @@ -36,7 +52,7 @@ class XmlCommentedActionGroupTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/dev/tests/verification/Resources/XmlCommentedTest.txt b/dev/tests/verification/Resources/XmlCommentedTest.txt index 663732493..9e7a300ee 100644 --- a/dev/tests/verification/Resources/XmlCommentedTest.txt +++ b/dev/tests/verification/Resources/XmlCommentedTest.txt @@ -18,6 +18,11 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; */ class XmlCommentedTestCest { + /** + * @var bool + */ + private $isSuccess = false; + /** * @param AcceptanceTester $I * @throws \Exception @@ -38,6 +43,9 @@ class XmlCommentedTestCest $I->comment("< > & \$abc \" abc ' /"); $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey $I->comment("< > & \$abc \" abc ' /"); + if ($this->isSuccess) { + unlink(__FILE__); + } } /** @@ -73,7 +81,7 @@ class XmlCommentedTestCest public function _passed(AcceptanceTester $I) { - // Deleting itself so that we can rerun only failed tests. - unlink(__FILE__); + // Test passed successfully. + $this->isSuccess = true; } } diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 8ea831963..c0249a32b 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -279,6 +279,10 @@ public function assembleTestPhp($testObject) $cestPhp .= $classAnnotationsPhp; $cestPhp .= sprintf("class %s\n", $className); $cestPhp .= "{\n"; + $cestPhp .= "\t/**\n"; + $cestPhp .= "\t * @var bool\n"; + $cestPhp .= "\t */\n"; + $cestPhp .= "\tprivate \$isSuccess = false;\n\n"; $cestPhp .= $this->generateInjectMethod(); $cestPhp .= $hookPhp; $cestPhp .= $testsPhp; @@ -1743,6 +1747,10 @@ private function generateHooksPhp($hookObjects) { $hooks = ""; + if (!isset($hookObjects['after'])) { + $hookObjects['after'] = new TestHookObject('after', '', []); + } + foreach ($hookObjects as $hookObject) { $type = $hookObject->getType(); $dependencies = 'AcceptanceTester $I'; @@ -1764,6 +1772,11 @@ private function generateHooksPhp($hookObjects) $hooks .= sprintf("\tpublic function _{$type}(%s)\n", $dependencies); $hooks .= "\t{\n"; $hooks .= $steps; + if ($type === 'after') { + $hooks .= "\t\t" . 'if ($this->isSuccess) {' . "\n"; + $hooks .= "\t\t\t" . 'unlink(__FILE__);' . "\n"; + $hooks .= "\t\t" . '}' . "\n"; + } $hooks .= "\t}\n\n"; } @@ -1816,8 +1829,8 @@ private function generateTestPhp($test) $testPhp .= PHP_EOL; $testPhp .= sprintf("\tpublic function _passed(%s)\n", $dependencies); $testPhp .= "\t{\n"; - $testPhp .= "\t\t// Deleting itself so that we can rerun only failed tests." . PHP_EOL; - $testPhp .= "\t\tunlink(__FILE__);" . PHP_EOL; + $testPhp .= "\t\t// Test passed successfully." . PHP_EOL; + $testPhp .= "\t\t\$this->isSuccess = true;" . PHP_EOL; $testPhp .= "\t}\n"; } From 6ac15c1ef16f0250d703e1d401b05f35f84be797 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 6 Dec 2021 16:24:43 -0600 Subject: [PATCH 119/674] MQE-3122: Logging of failed test is not working when test fails in `after` section --- .../Resources/ActionGroupWithDataTest.txt | 14 +++----------- .../ExtendedActionGroupReturningValueTest.txt | 11 +++++++++++ .../Resources/ExtendingSkippedTest.txt | 11 ----------- dev/tests/verification/Resources/MergeSkip.txt | 11 ----------- .../Resources/PersistedReplacementTest.txt | 12 ++++++------ dev/tests/verification/Resources/SkippedTest.txt | 11 ----------- .../Resources/SkippedTestTwoIssues.txt | 11 ----------- .../Resources/SkippedTestWithHooks.txt | 11 ----------- 8 files changed, 20 insertions(+), 72 deletions(-) diff --git a/dev/tests/verification/Resources/ActionGroupWithDataTest.txt b/dev/tests/verification/Resources/ActionGroupWithDataTest.txt index bde1dcdd6..1cfc77d0a 100644 --- a/dev/tests/verification/Resources/ActionGroupWithDataTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithDataTest.txt @@ -36,17 +36,6 @@ class ActionGroupWithDataTestCest $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); } - /** - * @param AcceptanceTester $I - * @throws \Exception - */ - public function _after(AcceptanceTester $I) - { - if ($this->isSuccess) { - unlink(__FILE__); - } - } - /** * @param AcceptanceTester $I * @throws \Exception @@ -57,6 +46,9 @@ class ActionGroupWithDataTestCest $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + if ($this->isSuccess) { + unlink(__FILE__); + } } /** diff --git a/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt index e5efd6cc9..5ecc0d0cd 100644 --- a/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt @@ -23,6 +23,17 @@ class ExtendedActionGroupReturningValueTestCest */ private $isSuccess = false; + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) diff --git a/dev/tests/verification/Resources/ExtendingSkippedTest.txt b/dev/tests/verification/Resources/ExtendingSkippedTest.txt index 0b78b5136..304376ebf 100644 --- a/dev/tests/verification/Resources/ExtendingSkippedTest.txt +++ b/dev/tests/verification/Resources/ExtendingSkippedTest.txt @@ -24,17 +24,6 @@ class ExtendingSkippedTestCest */ private $isSuccess = false; - /** - * @param AcceptanceTester $I - * @throws \Exception - */ - public function _after(AcceptanceTester $I) - { - if ($this->isSuccess) { - unlink(__FILE__); - } - } - /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) diff --git a/dev/tests/verification/Resources/MergeSkip.txt b/dev/tests/verification/Resources/MergeSkip.txt index 8ce10f3e1..d807f994f 100644 --- a/dev/tests/verification/Resources/MergeSkip.txt +++ b/dev/tests/verification/Resources/MergeSkip.txt @@ -22,17 +22,6 @@ class MergeSkipCest */ private $isSuccess = false; - /** - * @param AcceptanceTester $I - * @throws \Exception - */ - public function _after(AcceptanceTester $I) - { - if ($this->isSuccess) { - unlink(__FILE__); - } - } - /** * @Features({"TestModule"}) * @Parameter(name = "AcceptanceTester", value="$I") diff --git a/dev/tests/verification/Resources/PersistedReplacementTest.txt b/dev/tests/verification/Resources/PersistedReplacementTest.txt index 95706e75b..e8e249bf7 100644 --- a/dev/tests/verification/Resources/PersistedReplacementTest.txt +++ b/dev/tests/verification/Resources/PersistedReplacementTest.txt @@ -26,20 +26,20 @@ class PersistedReplacementTestCest * @param AcceptanceTester $I * @throws \Exception */ - public function _after(AcceptanceTester $I) + public function _before(AcceptanceTester $I) { - if ($this->isSuccess) { - unlink(__FILE__); - } + $I->createEntity("createData1", "hook", "ReplacementPerson", [], []); // stepKey: createData1 } /** * @param AcceptanceTester $I * @throws \Exception */ - public function _before(AcceptanceTester $I) + public function _after(AcceptanceTester $I) { - $I->createEntity("createData1", "hook", "ReplacementPerson", [], []); // stepKey: createData1 + if ($this->isSuccess) { + unlink(__FILE__); + } } /** diff --git a/dev/tests/verification/Resources/SkippedTest.txt b/dev/tests/verification/Resources/SkippedTest.txt index 99832ef9a..c261a77ad 100644 --- a/dev/tests/verification/Resources/SkippedTest.txt +++ b/dev/tests/verification/Resources/SkippedTest.txt @@ -23,17 +23,6 @@ class SkippedTestCest */ private $isSuccess = false; - /** - * @param AcceptanceTester $I - * @throws \Exception - */ - public function _after(AcceptanceTester $I) - { - if ($this->isSuccess) { - unlink(__FILE__); - } - } - /** * @Stories({"skipped"}) * @Severity(level = SeverityLevel::MINOR) diff --git a/dev/tests/verification/Resources/SkippedTestTwoIssues.txt b/dev/tests/verification/Resources/SkippedTestTwoIssues.txt index 951d15678..a2941e5f1 100644 --- a/dev/tests/verification/Resources/SkippedTestTwoIssues.txt +++ b/dev/tests/verification/Resources/SkippedTestTwoIssues.txt @@ -23,17 +23,6 @@ class SkippedTestTwoIssuesCest */ private $isSuccess = false; - /** - * @param AcceptanceTester $I - * @throws \Exception - */ - public function _after(AcceptanceTester $I) - { - if ($this->isSuccess) { - unlink(__FILE__); - } - } - /** * @Stories({"skippedMultiple"}) * @Severity(level = SeverityLevel::MINOR) diff --git a/dev/tests/verification/Resources/SkippedTestWithHooks.txt b/dev/tests/verification/Resources/SkippedTestWithHooks.txt index 84b0203c4..fdc56c5e1 100644 --- a/dev/tests/verification/Resources/SkippedTestWithHooks.txt +++ b/dev/tests/verification/Resources/SkippedTestWithHooks.txt @@ -23,17 +23,6 @@ class SkippedTestWithHooksCest */ private $isSuccess = false; - /** - * @param AcceptanceTester $I - * @throws \Exception - */ - public function _after(AcceptanceTester $I) - { - if ($this->isSuccess) { - unlink(__FILE__); - } - } - /** * @Stories({"skippedWithHooks"}) * @Severity(level = SeverityLevel::MINOR) From fe20f1bb70525e8c6cc94bdeae2d1db68f998b4b Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Tue, 7 Dec 2021 10:35:03 -0600 Subject: [PATCH 120/674] MQE-3122: Logging of failed test is not working when test fails in `after` section - preparing everything for release --- CHANGELOG.md | 7 +++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eaa96a63e..52fa211e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ Magento Functional Testing Framework Changelog ================================================ +3.7.2 +--------- + +### Bug fix: +* Failed tests weren't logged correctly to `failed` file which caused a failure during run:failed command execution + + 3.7.1 --------- diff --git a/composer.json b/composer.json index 61ff7b158..48c35e618 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": "3.7.1", + "version": "3.7.2", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 7c4e8d9c9..3a589c395 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": "f74783e12acad4c892369ccf2820dff5", + "content-hash": "b91a4e8102c543f132c120747714e9ab", "packages": [ { "name": "allure-framework/allure-codeception", From f3164918ae5e7f73d4b18e471afd0c6731322637 Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Tue, 7 Dec 2021 16:04:47 -0600 Subject: [PATCH 121/674] MQE-3124: fix unbalanced parallel groups --- .../Test/Objects/TestObject.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php index 8341fc7b1..f49c8f3c4 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php @@ -21,12 +21,20 @@ class TestObject const TEST_ACTION_WEIGHT = [ 'waitForPageLoad' => 1500, - 'amOnPage' => 1000, + 'amOnPage' => 1500, 'waitForLoadingMaskToDisappear' => 500, 'wait' => self::WAIT_TIME_ATTRIBUTE, + 'waitForAjaxLoad' => 500, + 'waitForJS' => 500, 'comment' => 5, 'assertCount' => 5, - 'closeAdminNotification' => 10 + 'closeAdminNotification' => 10, + 'magentoCLI' => 1000, + 'magentoCron' => 3000, + 'createData' => 500, + 'deleteData' => 100, + 'updateData' => 100, + 'getOTP' => 200, ]; /** From 75b00c5f82f52858d78c34d95fb5cd08197e8f48 Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Thu, 9 Dec 2021 10:09:47 -0600 Subject: [PATCH 122/674] MQE-3124: fix unbalanced parallel groups --- .../FunctionalTestingFramework/Test/Objects/TestObject.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php index f49c8f3c4..bce0f70a9 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php @@ -32,9 +32,9 @@ class TestObject 'magentoCLI' => 1000, 'magentoCron' => 3000, 'createData' => 500, - 'deleteData' => 100, - 'updateData' => 100, - 'getOTP' => 200, + 'deleteData' => 200, + 'updateData' => 200, + 'getOTP' => 1000, ]; /** From 76c0d7c9ba051066125a2f94a248e6cb4b1c853c Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Tue, 14 Dec 2021 11:14:24 -0600 Subject: [PATCH 123/674] MQE-3124: fix unbalanced parallel groups --- .../Test/Objects/TestObject.php | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php index bce0f70a9..be162cb51 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php @@ -37,6 +37,15 @@ class TestObject 'getOTP' => 1000, ]; + const WEBAPI_AUTH_TEST_ACTIONS = [ + 'createData', + 'deleteData', + 'updateData', + 'getData', + ]; + + const WEBAPI_AUTH_TEST_ACTION_WEIGHT = 6000; + /** * Name of the test * @@ -93,6 +102,11 @@ class TestObject */ private $deprecated; + /** + * Indicates if a test contains an action that requires Web API authentication. + */ + private bool $hasWebApiAuthAction; + /** * TestObject constructor. * @@ -120,6 +134,7 @@ public function __construct( $this->filename = $filename; $this->parentTest = $parentTest; $this->deprecated = $deprecated; + $this->hasWebApiAuthAction = false; } /** @@ -230,7 +245,11 @@ public function getEstimatedDuration() $testTime = $this->calculateWeightedActionTimes($this->getOrderedActions()); - return $hookTime + $testTime; + if ($this->hasWebApiAuthAction) { + return $hookTime + $testTime + self::WEBAPI_AUTH_TEST_ACTION_WEIGHT; + } else { + return $hookTime + $testTime; + } } /** @@ -245,6 +264,11 @@ private function calculateWeightedActionTimes($actions) // search for any actions of special type foreach ($actions as $action) { /** @var ActionObject $action */ + + if (!$this->hasWebApiAuthAction && in_array($action->getType(), self::WEBAPI_AUTH_TEST_ACTIONS)) { + $this->hasWebApiAuthAction = true; + } + if (array_key_exists($action->getType(), self::TEST_ACTION_WEIGHT)) { $weight = self::TEST_ACTION_WEIGHT[$action->getType()]; if ($weight === self::WAIT_TIME_ATTRIBUTE) { From d508adbd71fdf8ad6aaeeea3fecae02edd64ec69 Mon Sep 17 00:00:00 2001 From: David Haecker Date: Tue, 14 Dec 2021 14:43:48 -0600 Subject: [PATCH 124/674] adding pagebuilder file upload spinner to loadingMaskLocators --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 708cdfb7e..238bbae48 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -72,6 +72,7 @@ class MagentoWebDriver extends WebDriver '//div[contains(@class, "admin__data-grid-loading-mask")]', '//div[contains(@class, "admin__form-loading-mask")]', '//div[@data-role="spinner"]', + '//div[@class="file-uploader-spinner"]', ]; /** From 69006336d66864975fb4196ffafa3dc1db801f2f Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Tue, 14 Dec 2021 13:18:30 -0600 Subject: [PATCH 125/674] MQE-3124: fix unbalanced parallel groups --- .../Test/Objects/TestObject.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php index be162cb51..f556947f1 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php @@ -25,6 +25,10 @@ class TestObject 'waitForLoadingMaskToDisappear' => 500, 'wait' => self::WAIT_TIME_ATTRIBUTE, 'waitForAjaxLoad' => 500, + 'waitForElementNotVisible' => 500, + 'waitForElementVisible' => 500, + 'waitForText' => 500, + 'waitForElement' => 500, 'waitForJS' => 500, 'comment' => 5, 'assertCount' => 5, @@ -104,8 +108,10 @@ class TestObject /** * Indicates if a test contains an action that requires Web API authentication. + * + * @var boolean */ - private bool $hasWebApiAuthAction; + private $hasWebApiAuthAction; /** * TestObject constructor. From cad424a79d2d13996ed84da7fcac5957411f1e9e Mon Sep 17 00:00:00 2001 From: "Shashik.K.Singh" Date: Wed, 15 Dec 2021 17:09:45 +0530 Subject: [PATCH 126/674] throw error message if key value pair is not mapped properly in .credentials file --- .../DataGenerator/Handlers/SecretStorage/FileStorage.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php index 479c608e4..1d122b9c5 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php @@ -101,6 +101,11 @@ private function encryptCredFileContents($credContents) if (substr($credValue, 0, 1) === '#' || empty($credValue)) { continue; } + elseif (is_bool(strpos($credValue, "="))){ + throw new TestFrameworkException( + $credValue." not configured correctly in .credentials file" + ); + } list($key, $value) = explode("=", $credValue, 2); if (!empty($value)) { From c22f9f96c7e4845a580d8d4c0cfc5dc1e29f8ecb Mon Sep 17 00:00:00 2001 From: David Haecker Date: Wed, 15 Dec 2021 09:42:54 -0600 Subject: [PATCH 127/674] adding more locators to loadingMaskLocators --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 238bbae48..c9203dbbb 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -72,7 +72,9 @@ class MagentoWebDriver extends WebDriver '//div[contains(@class, "admin__data-grid-loading-mask")]', '//div[contains(@class, "admin__form-loading-mask")]', '//div[@data-role="spinner"]', - '//div[@class="file-uploader-spinner"]', + '//div[contains(@class,"file-uploader-spinner")]', + '//div[contains(@class,"image-uploader-spinner")]', + '//div[contains(@class,"progressbar")]//ancestor::div[@class="file-row"]', ]; /** From feff762ab3dce36c87eb9d55fa03daa0bc310658 Mon Sep 17 00:00:00 2001 From: David Haecker Date: Wed, 15 Dec 2021 11:11:40 -0600 Subject: [PATCH 128/674] editing loadingMaskLocators --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index c9203dbbb..68d2efd4b 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -74,7 +74,7 @@ class MagentoWebDriver extends WebDriver '//div[@data-role="spinner"]', '//div[contains(@class,"file-uploader-spinner")]', '//div[contains(@class,"image-uploader-spinner")]', - '//div[contains(@class,"progressbar")]//ancestor::div[@class="file-row"]', + '//div[contains(@class,"uploader")]//div[@class="file-row"]', ]; /** From da431d64c0cb0878fc72490036338874efa02794 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Wed, 15 Dec 2021 17:58:55 -0600 Subject: [PATCH 129/674] MQE-3155: Release MFTF 3.7.3 - update composer.json and CHANGELOG.md --- CHANGELOG.md | 8 ++++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52fa211e3..2d8a662fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ Magento Functional Testing Framework Changelog ================================================ +3.7.3 +--------- + +### Updates: +* Fix encoding issue when secret key contains plus sign +* Adding pagebuilder file upload spinner to loadingMaskLocators + + 3.7.2 --------- diff --git a/composer.json b/composer.json index 48c35e618..8fedf25a8 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": "3.7.2", + "version": "3.7.3", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 3a589c395..4a1a7d2be 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": "b91a4e8102c543f132c120747714e9ab", + "content-hash": "822c40666da3ff087f25393fd4dc9371", "packages": [ { "name": "allure-framework/allure-codeception", From 34504b702ad0bbeb22921175e7b32f51b6fdb2c1 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Mon, 20 Dec 2021 12:47:30 +0530 Subject: [PATCH 130/674] MQE-1794 : Removed Parameters from allure report --- .../FunctionalTestingFramework/Util/TestGenerator.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index c0249a32b..5aaef4623 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -525,11 +525,7 @@ private function generateMethodAnnotations($annotationType = null, $annotationNa break; case null: - $annotationToAppend = sprintf( - "{$indent} * @Parameter(name = \"%s\", value=\"$%s\")\n", - "AcceptanceTester", - "I" - ); + $annotationToAppend = ""; $annotationToAppend .= sprintf("{$indent} * @param %s $%s\n", "AcceptanceTester", "I"); $annotationToAppend .= "{$indent} * @return void\n"; $annotationToAppend .= "{$indent} * @throws \Exception\n"; From 47980b2bf3c7d4fa22388ae02c3e1b85c6c1742e Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Mon, 20 Dec 2021 13:12:52 +0530 Subject: [PATCH 131/674] fixed tests --- .../Resources/ActionGroupContainsStepKeyInArgText.txt | 1 - .../verification/Resources/ActionGroupMergedViaInsertBefore.txt | 1 - .../verification/Resources/ActionGroupReturningValueTest.txt | 1 - dev/tests/verification/Resources/ActionGroupToExtend.txt | 1 - dev/tests/verification/Resources/ActionGroupUsingCreateData.txt | 1 - .../verification/Resources/ActionGroupUsingNestedArgument.txt | 1 - .../verification/Resources/ActionGroupWithDataOverrideTest.txt | 1 - dev/tests/verification/Resources/ActionGroupWithDataTest.txt | 1 - .../ActionGroupWithDefaultArgumentAndStringSelectorParam.txt | 1 - ...ionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt | 1 - dev/tests/verification/Resources/ActionGroupWithNoArguments.txt | 1 - .../verification/Resources/ActionGroupWithNoDefaultTest.txt | 1 - .../Resources/ActionGroupWithParameterizedElementWithHyphen.txt | 1 - ...ActionGroupWithParameterizedElementsWithStepKeyReferences.txt | 1 - .../ActionGroupWithPassedArgumentAndStringSelectorParam.txt | 1 - .../verification/Resources/ActionGroupWithPersistedData.txt | 1 - .../Resources/ActionGroupWithSectionAndDataAsArguments.txt | 1 - .../ActionGroupWithSimpleDataUsageFromDefaultArgument.txt | 1 - .../ActionGroupWithSimpleDataUsageFromPassedArgument.txt | 1 - ...ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt | 1 - .../ActionGroupWithSingleParameterSelectorFromPassedArgument.txt | 1 - .../verification/Resources/ActionGroupWithStepKeyReferences.txt | 1 - .../Resources/ActionGroupWithTopLevelPersistedData.txt | 1 - .../verification/Resources/ArgumentWithSameNameAsElement.txt | 1 - dev/tests/verification/Resources/AssertTest.txt | 1 - dev/tests/verification/Resources/BasicFunctionalTest.txt | 1 - dev/tests/verification/Resources/BasicMergeTest.txt | 1 - dev/tests/verification/Resources/CharacterReplacementTest.txt | 1 - dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt | 1 - dev/tests/verification/Resources/ChildExtendedTestMerging.txt | 1 - dev/tests/verification/Resources/ChildExtendedTestNoParent.txt | 1 - .../verification/Resources/ChildExtendedTestRemoveAction.txt | 1 - .../verification/Resources/ChildExtendedTestRemoveHookAction.txt | 1 - dev/tests/verification/Resources/ChildExtendedTestReplace.txt | 1 - .../verification/Resources/ChildExtendedTestReplaceHook.txt | 1 - dev/tests/verification/Resources/DataActionsTest.txt | 1 - dev/tests/verification/Resources/DataReplacementTest.txt | 1 - dev/tests/verification/Resources/DeprecatedEntitiesTest.txt | 1 - dev/tests/verification/Resources/DeprecatedTest.txt | 1 - dev/tests/verification/Resources/ExecuteJsEscapingTest.txt | 1 - dev/tests/verification/Resources/ExtendParentDataTest.txt | 1 - dev/tests/verification/Resources/ExtendedActionGroup.txt | 1 - .../Resources/ExtendedActionGroupReturningValueTest.txt | 1 - .../verification/Resources/ExtendedChildTestInSuiteCest.txt | 1 - dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt | 1 - dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt | 1 - dev/tests/verification/Resources/ExtendingSkippedTest.txt | 1 - dev/tests/verification/Resources/GroupSkipGenerationTest.txt | 1 - dev/tests/verification/Resources/HookActionsTest.txt | 1 - dev/tests/verification/Resources/LocatorFunctionTest.txt | 1 - dev/tests/verification/Resources/MergeMassViaInsertAfter.txt | 1 - dev/tests/verification/Resources/MergeMassViaInsertBefore.txt | 1 - dev/tests/verification/Resources/MergeSkip.txt | 1 - .../Resources/MergedActionGroupReturningValueTest.txt | 1 - dev/tests/verification/Resources/MergedActionGroupTest.txt | 1 - dev/tests/verification/Resources/MergedReferencesTest.txt | 1 - dev/tests/verification/Resources/MultipleActionGroupsTest.txt | 1 - dev/tests/verification/Resources/PageReplacementTest.txt | 1 - dev/tests/verification/Resources/ParameterArrayTest.txt | 1 - dev/tests/verification/Resources/ParentExtendedTest.txt | 1 - .../verification/Resources/PersistedAndXmlEntityArguments.txt | 1 - dev/tests/verification/Resources/PersistedReplacementTest.txt | 1 - .../Resources/PersistenceActionGroupAppendingTest.txt | 1 - dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt | 1 - dev/tests/verification/Resources/SectionReplacementTest.txt | 1 - dev/tests/verification/Resources/SkippedTest.txt | 1 - dev/tests/verification/Resources/SkippedTestTwoIssues.txt | 1 - dev/tests/verification/Resources/SkippedTestWithHooks.txt | 1 - dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt | 1 - dev/tests/verification/Resources/XmlCommentedTest.txt | 1 - 70 files changed, 70 deletions(-) diff --git a/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt b/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt index 710612750..f2066e1d8 100644 --- a/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt +++ b/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt @@ -46,7 +46,6 @@ class ActionGroupContainsStepKeyInArgTextCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupMergedViaInsertBefore.txt b/dev/tests/verification/Resources/ActionGroupMergedViaInsertBefore.txt index 05d82165a..1479f8d9d 100644 --- a/dev/tests/verification/Resources/ActionGroupMergedViaInsertBefore.txt +++ b/dev/tests/verification/Resources/ActionGroupMergedViaInsertBefore.txt @@ -35,7 +35,6 @@ class ActionGroupMergedViaInsertBeforeCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt index 1fb0726e1..92461bfaa 100644 --- a/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt @@ -64,7 +64,6 @@ class ActionGroupReturningValueTestCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupToExtend.txt b/dev/tests/verification/Resources/ActionGroupToExtend.txt index 5ec7f0a0e..7fd1a8f05 100644 --- a/dev/tests/verification/Resources/ActionGroupToExtend.txt +++ b/dev/tests/verification/Resources/ActionGroupToExtend.txt @@ -35,7 +35,6 @@ class ActionGroupToExtendCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt b/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt index b451abc2b..2b3c56883 100644 --- a/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt +++ b/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt @@ -47,7 +47,6 @@ class ActionGroupUsingCreateDataCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupUsingNestedArgument.txt b/dev/tests/verification/Resources/ActionGroupUsingNestedArgument.txt index ff745ba05..40254de00 100644 --- a/dev/tests/verification/Resources/ActionGroupUsingNestedArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupUsingNestedArgument.txt @@ -35,7 +35,6 @@ class ActionGroupUsingNestedArgumentCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt b/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt index 2ecc0f729..34486ead4 100644 --- a/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt @@ -64,7 +64,6 @@ class ActionGroupWithDataOverrideTestCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithDataTest.txt b/dev/tests/verification/Resources/ActionGroupWithDataTest.txt index 1cfc77d0a..542796ab6 100644 --- a/dev/tests/verification/Resources/ActionGroupWithDataTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithDataTest.txt @@ -64,7 +64,6 @@ class ActionGroupWithDataTestCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithDefaultArgumentAndStringSelectorParam.txt b/dev/tests/verification/Resources/ActionGroupWithDefaultArgumentAndStringSelectorParam.txt index 7a68cf16a..838c98e3b 100644 --- a/dev/tests/verification/Resources/ActionGroupWithDefaultArgumentAndStringSelectorParam.txt +++ b/dev/tests/verification/Resources/ActionGroupWithDefaultArgumentAndStringSelectorParam.txt @@ -37,7 +37,6 @@ class ActionGroupWithDefaultArgumentAndStringSelectorParamCest /** * @Severity(level = SeverityLevel::BLOCKER) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt b/dev/tests/verification/Resources/ActionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt index 6b8c738e0..31a77b903 100644 --- a/dev/tests/verification/Resources/ActionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithMultipleParameterSelectorsFromDefaultArgument.txt @@ -37,7 +37,6 @@ class ActionGroupWithMultipleParameterSelectorsFromDefaultArgumentCest /** * @Severity(level = SeverityLevel::BLOCKER) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithNoArguments.txt b/dev/tests/verification/Resources/ActionGroupWithNoArguments.txt index 2371d86dd..9d06b309e 100644 --- a/dev/tests/verification/Resources/ActionGroupWithNoArguments.txt +++ b/dev/tests/verification/Resources/ActionGroupWithNoArguments.txt @@ -37,7 +37,6 @@ class ActionGroupWithNoArgumentsCest /** * @Severity(level = SeverityLevel::BLOCKER) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt b/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt index 19f3de5ad..2705c5ca1 100644 --- a/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt @@ -64,7 +64,6 @@ class ActionGroupWithNoDefaultTestCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithParameterizedElementWithHyphen.txt b/dev/tests/verification/Resources/ActionGroupWithParameterizedElementWithHyphen.txt index 17a9d766b..376a6298d 100644 --- a/dev/tests/verification/Resources/ActionGroupWithParameterizedElementWithHyphen.txt +++ b/dev/tests/verification/Resources/ActionGroupWithParameterizedElementWithHyphen.txt @@ -35,7 +35,6 @@ class ActionGroupWithParameterizedElementWithHyphenCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithParameterizedElementsWithStepKeyReferences.txt b/dev/tests/verification/Resources/ActionGroupWithParameterizedElementsWithStepKeyReferences.txt index 2f31d0686..83aaecf08 100644 --- a/dev/tests/verification/Resources/ActionGroupWithParameterizedElementsWithStepKeyReferences.txt +++ b/dev/tests/verification/Resources/ActionGroupWithParameterizedElementsWithStepKeyReferences.txt @@ -35,7 +35,6 @@ class ActionGroupWithParameterizedElementsWithStepKeyReferencesCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithPassedArgumentAndStringSelectorParam.txt b/dev/tests/verification/Resources/ActionGroupWithPassedArgumentAndStringSelectorParam.txt index e58d8c5a5..1a2e886bb 100644 --- a/dev/tests/verification/Resources/ActionGroupWithPassedArgumentAndStringSelectorParam.txt +++ b/dev/tests/verification/Resources/ActionGroupWithPassedArgumentAndStringSelectorParam.txt @@ -37,7 +37,6 @@ class ActionGroupWithPassedArgumentAndStringSelectorParamCest /** * @Severity(level = SeverityLevel::BLOCKER) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt b/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt index 782e27a8e..243569e46 100644 --- a/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt +++ b/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt @@ -64,7 +64,6 @@ class ActionGroupWithPersistedDataCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithSectionAndDataAsArguments.txt b/dev/tests/verification/Resources/ActionGroupWithSectionAndDataAsArguments.txt index d07a32cd0..65d25df00 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSectionAndDataAsArguments.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSectionAndDataAsArguments.txt @@ -35,7 +35,6 @@ class ActionGroupWithSectionAndDataAsArgumentsCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromDefaultArgument.txt b/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromDefaultArgument.txt index ab5465ca0..65ce18e9f 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromDefaultArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromDefaultArgument.txt @@ -37,7 +37,6 @@ class ActionGroupWithSimpleDataUsageFromDefaultArgumentCest /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromPassedArgument.txt b/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromPassedArgument.txt index c86e9dc4f..d33a7da1e 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromPassedArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSimpleDataUsageFromPassedArgument.txt @@ -37,7 +37,6 @@ class ActionGroupWithSimpleDataUsageFromPassedArgumentCest /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt b/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt index 34ba535f8..7aa0ba5a6 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromDefaultArgument.txt @@ -37,7 +37,6 @@ class ActionGroupWithSingleParameterSelectorFromDefaultArgumentCest /** * @Severity(level = SeverityLevel::BLOCKER) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromPassedArgument.txt b/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromPassedArgument.txt index 45f72a95b..93fb74898 100644 --- a/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromPassedArgument.txt +++ b/dev/tests/verification/Resources/ActionGroupWithSingleParameterSelectorFromPassedArgument.txt @@ -37,7 +37,6 @@ class ActionGroupWithSingleParameterSelectorFromPassedArgumentCest /** * @Severity(level = SeverityLevel::BLOCKER) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt b/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt index 532c70868..e5886ab8e 100644 --- a/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt +++ b/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt @@ -35,7 +35,6 @@ class ActionGroupWithStepKeyReferencesCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt b/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt index 285e66370..7cc0ef505 100644 --- a/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt +++ b/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt @@ -64,7 +64,6 @@ class ActionGroupWithTopLevelPersistedDataCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt b/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt index b643eb759..55ea28d00 100644 --- a/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt +++ b/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt @@ -64,7 +64,6 @@ class ArgumentWithSameNameAsElementCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/AssertTest.txt b/dev/tests/verification/Resources/AssertTest.txt index 6c30b7273..381ab4818 100644 --- a/dev/tests/verification/Resources/AssertTest.txt +++ b/dev/tests/verification/Resources/AssertTest.txt @@ -44,7 +44,6 @@ class AssertTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/BasicFunctionalTest.txt b/dev/tests/verification/Resources/BasicFunctionalTest.txt index c5ce0305c..526162e3e 100644 --- a/dev/tests/verification/Resources/BasicFunctionalTest.txt +++ b/dev/tests/verification/Resources/BasicFunctionalTest.txt @@ -58,7 +58,6 @@ class BasicFunctionalTestCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-305"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/BasicMergeTest.txt b/dev/tests/verification/Resources/BasicMergeTest.txt index 0ccd3e898..27b22bd34 100644 --- a/dev/tests/verification/Resources/BasicMergeTest.txt +++ b/dev/tests/verification/Resources/BasicMergeTest.txt @@ -60,7 +60,6 @@ class BasicMergeTestCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/CharacterReplacementTest.txt b/dev/tests/verification/Resources/CharacterReplacementTest.txt index b87c36a40..bf10c94fc 100644 --- a/dev/tests/verification/Resources/CharacterReplacementTest.txt +++ b/dev/tests/verification/Resources/CharacterReplacementTest.txt @@ -35,7 +35,6 @@ class CharacterReplacementTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt b/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt index 2e949082a..63b874964 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt @@ -58,7 +58,6 @@ class ChildExtendedTestAddHooksCest * @Severity(level = SeverityLevel::MINOR) * @Features({"TestModule"}) * @Stories({"Parent"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ChildExtendedTestMerging.txt b/dev/tests/verification/Resources/ChildExtendedTestMerging.txt index 9e892e290..5f506e58c 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestMerging.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestMerging.txt @@ -60,7 +60,6 @@ class ChildExtendedTestMergingCest * @Severity(level = SeverityLevel::TRIVIAL) * @Features({"TestModule"}) * @Stories({"Child"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt b/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt index 12094a518..1bd027399 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestNoParent.txt @@ -40,7 +40,6 @@ class ChildExtendedTestNoParentCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"Child"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt b/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt index 28b4ec7fd..64ae855b8 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt @@ -58,7 +58,6 @@ class ChildExtendedTestRemoveActionCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"Child"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt b/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt index 3649c85fe..e4acdf155 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt @@ -57,7 +57,6 @@ class ChildExtendedTestRemoveHookActionCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"Child"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ChildExtendedTestReplace.txt b/dev/tests/verification/Resources/ChildExtendedTestReplace.txt index a3cfdd2aa..0b62e3762 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestReplace.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestReplace.txt @@ -58,7 +58,6 @@ class ChildExtendedTestReplaceCest * @Severity(level = SeverityLevel::TRIVIAL) * @Features({"TestModule"}) * @Stories({"Child"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt b/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt index abe55a071..1e8366351 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt @@ -58,7 +58,6 @@ class ChildExtendedTestReplaceHookCest * @Severity(level = SeverityLevel::TRIVIAL) * @Features({"TestModule"}) * @Stories({"Child"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/DataActionsTest.txt b/dev/tests/verification/Resources/DataActionsTest.txt index f84f97040..4a49db289 100644 --- a/dev/tests/verification/Resources/DataActionsTest.txt +++ b/dev/tests/verification/Resources/DataActionsTest.txt @@ -46,7 +46,6 @@ class DataActionsTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/DataReplacementTest.txt b/dev/tests/verification/Resources/DataReplacementTest.txt index 00c28b31e..940504c63 100644 --- a/dev/tests/verification/Resources/DataReplacementTest.txt +++ b/dev/tests/verification/Resources/DataReplacementTest.txt @@ -35,7 +35,6 @@ class DataReplacementTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/DeprecatedEntitiesTest.txt b/dev/tests/verification/Resources/DeprecatedEntitiesTest.txt index 9a0ec8a27..cc205c438 100644 --- a/dev/tests/verification/Resources/DeprecatedEntitiesTest.txt +++ b/dev/tests/verification/Resources/DeprecatedEntitiesTest.txt @@ -35,7 +35,6 @@ class DeprecatedEntitiesTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/DeprecatedTest.txt b/dev/tests/verification/Resources/DeprecatedTest.txt index acdb53cc0..7e34131d5 100644 --- a/dev/tests/verification/Resources/DeprecatedTest.txt +++ b/dev/tests/verification/Resources/DeprecatedTest.txt @@ -35,7 +35,6 @@ class DeprecatedTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ExecuteJsEscapingTest.txt b/dev/tests/verification/Resources/ExecuteJsEscapingTest.txt index fc1331ef2..8718d188b 100644 --- a/dev/tests/verification/Resources/ExecuteJsEscapingTest.txt +++ b/dev/tests/verification/Resources/ExecuteJsEscapingTest.txt @@ -35,7 +35,6 @@ class ExecuteJsEscapingTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ExtendParentDataTest.txt b/dev/tests/verification/Resources/ExtendParentDataTest.txt index 6b96cbbda..93ea3b754 100644 --- a/dev/tests/verification/Resources/ExtendParentDataTest.txt +++ b/dev/tests/verification/Resources/ExtendParentDataTest.txt @@ -35,7 +35,6 @@ class ExtendParentDataTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ExtendedActionGroup.txt b/dev/tests/verification/Resources/ExtendedActionGroup.txt index a2cc9fc74..2d2373c0d 100644 --- a/dev/tests/verification/Resources/ExtendedActionGroup.txt +++ b/dev/tests/verification/Resources/ExtendedActionGroup.txt @@ -35,7 +35,6 @@ class ExtendedActionGroupCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt index 5ecc0d0cd..4c19fea5e 100644 --- a/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/ExtendedActionGroupReturningValueTest.txt @@ -37,7 +37,6 @@ class ExtendedActionGroupReturningValueTestCest /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt b/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt index 2e6da3464..fae417d55 100644 --- a/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt +++ b/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt @@ -58,7 +58,6 @@ class ExtendedChildTestInSuiteCest * @Severity(level = SeverityLevel::TRIVIAL) * @Features({"TestModule"}) * @Stories({"ExtendedChildTestInSuite"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt b/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt index a18346a77..be3ffbf58 100644 --- a/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt +++ b/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt @@ -57,7 +57,6 @@ class ExtendedChildTestNotInSuiteCest * @Severity(level = SeverityLevel::TRIVIAL) * @Features({"TestModule"}) * @Stories({"ExtendedChildTestNotInSuite"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt b/dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt index 1e24e644a..809fd2874 100644 --- a/dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt +++ b/dev/tests/verification/Resources/ExtendedRemoveActionGroup.txt @@ -35,7 +35,6 @@ class ExtendedRemoveActionGroupCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ExtendingSkippedTest.txt b/dev/tests/verification/Resources/ExtendingSkippedTest.txt index 304376ebf..522ba7620 100644 --- a/dev/tests/verification/Resources/ExtendingSkippedTest.txt +++ b/dev/tests/verification/Resources/ExtendingSkippedTest.txt @@ -28,7 +28,6 @@ class ExtendingSkippedTestCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"Child"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/GroupSkipGenerationTest.txt b/dev/tests/verification/Resources/GroupSkipGenerationTest.txt index b13aa399a..034307e37 100644 --- a/dev/tests/verification/Resources/GroupSkipGenerationTest.txt +++ b/dev/tests/verification/Resources/GroupSkipGenerationTest.txt @@ -39,7 +39,6 @@ class GroupSkipGenerationTestCest * @Stories({"GroupSkipGenerationTestStory"}) * @Severity(level = SeverityLevel::MINOR) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/HookActionsTest.txt b/dev/tests/verification/Resources/HookActionsTest.txt index a04a980a1..0132cd48c 100644 --- a/dev/tests/verification/Resources/HookActionsTest.txt +++ b/dev/tests/verification/Resources/HookActionsTest.txt @@ -57,7 +57,6 @@ class HookActionsTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/LocatorFunctionTest.txt b/dev/tests/verification/Resources/LocatorFunctionTest.txt index 86d744a2d..f26f2aa4f 100644 --- a/dev/tests/verification/Resources/LocatorFunctionTest.txt +++ b/dev/tests/verification/Resources/LocatorFunctionTest.txt @@ -35,7 +35,6 @@ class LocatorFunctionTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/MergeMassViaInsertAfter.txt b/dev/tests/verification/Resources/MergeMassViaInsertAfter.txt index 49c246251..60cfdb410 100644 --- a/dev/tests/verification/Resources/MergeMassViaInsertAfter.txt +++ b/dev/tests/verification/Resources/MergeMassViaInsertAfter.txt @@ -35,7 +35,6 @@ class MergeMassViaInsertAfterCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/MergeMassViaInsertBefore.txt b/dev/tests/verification/Resources/MergeMassViaInsertBefore.txt index 6080a5f23..eb6be579b 100644 --- a/dev/tests/verification/Resources/MergeMassViaInsertBefore.txt +++ b/dev/tests/verification/Resources/MergeMassViaInsertBefore.txt @@ -35,7 +35,6 @@ class MergeMassViaInsertBeforeCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/MergeSkip.txt b/dev/tests/verification/Resources/MergeSkip.txt index d807f994f..498aa1054 100644 --- a/dev/tests/verification/Resources/MergeSkip.txt +++ b/dev/tests/verification/Resources/MergeSkip.txt @@ -24,7 +24,6 @@ class MergeSkipCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt index 71d8ed94a..cce383b6c 100644 --- a/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt @@ -64,7 +64,6 @@ class MergedActionGroupReturningValueTestCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/MergedActionGroupTest.txt b/dev/tests/verification/Resources/MergedActionGroupTest.txt index e92a06f6f..e1a67c144 100644 --- a/dev/tests/verification/Resources/MergedActionGroupTest.txt +++ b/dev/tests/verification/Resources/MergedActionGroupTest.txt @@ -64,7 +64,6 @@ class MergedActionGroupTestCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/MergedReferencesTest.txt b/dev/tests/verification/Resources/MergedReferencesTest.txt index b1f95d56c..d020c3466 100644 --- a/dev/tests/verification/Resources/MergedReferencesTest.txt +++ b/dev/tests/verification/Resources/MergedReferencesTest.txt @@ -58,7 +58,6 @@ class MergedReferencesTestCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/MultipleActionGroupsTest.txt b/dev/tests/verification/Resources/MultipleActionGroupsTest.txt index 15659f21f..bcc0f31e0 100644 --- a/dev/tests/verification/Resources/MultipleActionGroupsTest.txt +++ b/dev/tests/verification/Resources/MultipleActionGroupsTest.txt @@ -64,7 +64,6 @@ class MultipleActionGroupsTestCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/PageReplacementTest.txt b/dev/tests/verification/Resources/PageReplacementTest.txt index af4defdb9..097a8be02 100644 --- a/dev/tests/verification/Resources/PageReplacementTest.txt +++ b/dev/tests/verification/Resources/PageReplacementTest.txt @@ -35,7 +35,6 @@ class PageReplacementTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ParameterArrayTest.txt b/dev/tests/verification/Resources/ParameterArrayTest.txt index 6488db6b0..1439dacdc 100644 --- a/dev/tests/verification/Resources/ParameterArrayTest.txt +++ b/dev/tests/verification/Resources/ParameterArrayTest.txt @@ -35,7 +35,6 @@ class ParameterArrayTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ParentExtendedTest.txt b/dev/tests/verification/Resources/ParentExtendedTest.txt index 73e6b7aa0..3c24988ac 100644 --- a/dev/tests/verification/Resources/ParentExtendedTest.txt +++ b/dev/tests/verification/Resources/ParentExtendedTest.txt @@ -58,7 +58,6 @@ class ParentExtendedTestCest * @Severity(level = SeverityLevel::MINOR) * @Features({"TestModule"}) * @Stories({"Parent"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/PersistedAndXmlEntityArguments.txt b/dev/tests/verification/Resources/PersistedAndXmlEntityArguments.txt index f4cc8cfaa..35eb126cd 100644 --- a/dev/tests/verification/Resources/PersistedAndXmlEntityArguments.txt +++ b/dev/tests/verification/Resources/PersistedAndXmlEntityArguments.txt @@ -35,7 +35,6 @@ class PersistedAndXmlEntityArgumentsCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/PersistedReplacementTest.txt b/dev/tests/verification/Resources/PersistedReplacementTest.txt index e8e249bf7..2f0bde2ab 100644 --- a/dev/tests/verification/Resources/PersistedReplacementTest.txt +++ b/dev/tests/verification/Resources/PersistedReplacementTest.txt @@ -44,7 +44,6 @@ class PersistedReplacementTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt b/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt index d1f75ccb6..b3b10a38b 100644 --- a/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt +++ b/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt @@ -50,7 +50,6 @@ class PersistenceActionGroupAppendingTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt b/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt index 5bbc0b325..6558daa74 100644 --- a/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt +++ b/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt @@ -48,7 +48,6 @@ class PersistenceCustomFieldsTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/SectionReplacementTest.txt b/dev/tests/verification/Resources/SectionReplacementTest.txt index a71d1c4ef..586280197 100644 --- a/dev/tests/verification/Resources/SectionReplacementTest.txt +++ b/dev/tests/verification/Resources/SectionReplacementTest.txt @@ -35,7 +35,6 @@ class SectionReplacementTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/SkippedTest.txt b/dev/tests/verification/Resources/SkippedTest.txt index c261a77ad..2e7decf9d 100644 --- a/dev/tests/verification/Resources/SkippedTest.txt +++ b/dev/tests/verification/Resources/SkippedTest.txt @@ -27,7 +27,6 @@ class SkippedTestCest * @Stories({"skipped"}) * @Severity(level = SeverityLevel::MINOR) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/SkippedTestTwoIssues.txt b/dev/tests/verification/Resources/SkippedTestTwoIssues.txt index a2941e5f1..2deaa9beb 100644 --- a/dev/tests/verification/Resources/SkippedTestTwoIssues.txt +++ b/dev/tests/verification/Resources/SkippedTestTwoIssues.txt @@ -27,7 +27,6 @@ class SkippedTestTwoIssuesCest * @Stories({"skippedMultiple"}) * @Severity(level = SeverityLevel::MINOR) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/SkippedTestWithHooks.txt b/dev/tests/verification/Resources/SkippedTestWithHooks.txt index fdc56c5e1..0299eb67a 100644 --- a/dev/tests/verification/Resources/SkippedTestWithHooks.txt +++ b/dev/tests/verification/Resources/SkippedTestWithHooks.txt @@ -27,7 +27,6 @@ class SkippedTestWithHooksCest * @Stories({"skippedWithHooks"}) * @Severity(level = SeverityLevel::MINOR) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt b/dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt index f45e8f0b2..c406af2d5 100644 --- a/dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt +++ b/dev/tests/verification/Resources/XmlCommentedActionGroupTest.txt @@ -37,7 +37,6 @@ class XmlCommentedActionGroupTestCest /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/XmlCommentedTest.txt b/dev/tests/verification/Resources/XmlCommentedTest.txt index 9e7a300ee..d3c11d781 100644 --- a/dev/tests/verification/Resources/XmlCommentedTest.txt +++ b/dev/tests/verification/Resources/XmlCommentedTest.txt @@ -60,7 +60,6 @@ class XmlCommentedTestCest /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception From 3cc61924414bd9101e60a0bb8fdd44e6965c070b Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Mon, 20 Dec 2021 13:19:10 +0530 Subject: [PATCH 132/674] fixed tests --- .../verification/Resources/ActionGroupMergedViaInsertAfter.txt | 1 - dev/tests/verification/Resources/BasicActionGroupTest.txt | 1 - dev/tests/verification/Resources/ExtendedParameterArrayTest.txt | 1 - 3 files changed, 3 deletions(-) diff --git a/dev/tests/verification/Resources/ActionGroupMergedViaInsertAfter.txt b/dev/tests/verification/Resources/ActionGroupMergedViaInsertAfter.txt index ab10b3b80..56f80c3af 100644 --- a/dev/tests/verification/Resources/ActionGroupMergedViaInsertAfter.txt +++ b/dev/tests/verification/Resources/ActionGroupMergedViaInsertAfter.txt @@ -35,7 +35,6 @@ class ActionGroupMergedViaInsertAfterCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/BasicActionGroupTest.txt b/dev/tests/verification/Resources/BasicActionGroupTest.txt index 45cac4937..8a5da2f11 100644 --- a/dev/tests/verification/Resources/BasicActionGroupTest.txt +++ b/dev/tests/verification/Resources/BasicActionGroupTest.txt @@ -51,7 +51,6 @@ class BasicActionGroupTestCest * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) * @Stories({"MQE-433"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Resources/ExtendedParameterArrayTest.txt b/dev/tests/verification/Resources/ExtendedParameterArrayTest.txt index 7af46fe5a..21d711c28 100644 --- a/dev/tests/verification/Resources/ExtendedParameterArrayTest.txt +++ b/dev/tests/verification/Resources/ExtendedParameterArrayTest.txt @@ -34,7 +34,6 @@ class ExtendParentDataTestCest /** * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception From bba26811857472912ad31620370e489a308bc17d Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Mon, 20 Dec 2021 13:45:50 +0530 Subject: [PATCH 133/674] fixed tests --- .../Resources/ExtendedChildActionGroupReturningValueTest.txt | 1 - dev/tests/verification/Tests/SecretCredentialDataTest.php | 1 - 2 files changed, 2 deletions(-) diff --git a/dev/tests/verification/Resources/ExtendedChildActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/ExtendedChildActionGroupReturningValueTest.txt index c262ffd85..a25ba031d 100644 --- a/dev/tests/verification/Resources/ExtendedChildActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/ExtendedChildActionGroupReturningValueTest.txt @@ -37,7 +37,6 @@ class ExtendedChildActionGroupReturningValueTestCest /** * @Severity(level = SeverityLevel::CRITICAL) * @Features({"TestModule"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception diff --git a/dev/tests/verification/Tests/SecretCredentialDataTest.php b/dev/tests/verification/Tests/SecretCredentialDataTest.php index d1ef43745..351a3d800 100644 --- a/dev/tests/verification/Tests/SecretCredentialDataTest.php +++ b/dev/tests/verification/Tests/SecretCredentialDataTest.php @@ -25,7 +25,6 @@ class SecretCredentialDataTestCest { /** * @Features({"AdminNotification"}) - * @Parameter(name = "AcceptanceTester", value="$I") * @param AcceptanceTester $I * @return void * @throws \Exception From 0a6db1855f8c8200d1cdd9164d24c9a84345a76c Mon Sep 17 00:00:00 2001 From: Nadiya Syvokonenko Date: Tue, 21 Dec 2021 10:44:20 -0600 Subject: [PATCH 134/674] MQE-2575: Allow MFTF Helpers to Return Data to MFTF Test --- .../Util/TestGenerator.php | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index c0249a32b..17e645e76 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -898,7 +898,12 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $stepKey, $customActionAttributes['class'] . '::' . $customActionAttributes['method'] ); - $testSteps .= $this->wrapFunctionCall($actor, $actionObject, $arguments); + $testSteps .= $this->wrapFunctionCallWithReturnValue( + $stepKey, + $actor, + $actionObject, + $arguments + ); break; case "createData": $entity = $customActionAttributes['entity']; @@ -2016,16 +2021,7 @@ private function addDollarSign($input) */ private function wrapFunctionCall($actor, $action, ...$args) { - $isFirst = true; - $isActionHelper = $action->getType() === 'helper'; - $actionType = $action->getType(); - if ($isActionHelper) { - $actor = "this->helperContainer->get('" . $action->getCustomActionAttributes()['class'] . "')"; - $args = $args[0]; - $actionType = $action->getCustomActionAttributes()['method']; - } - - $output = sprintf("\t\t$%s->%s(", $actor, $actionType); + $output = sprintf("\t\t$%s->%s(", $actor, $action->getType()); for ($i = 0; $i < count($args); $i++) { if (null === $args[$i]) { continue; @@ -2055,8 +2051,13 @@ private function wrapFunctionCall($actor, $action, ...$args) */ private function wrapFunctionCallWithReturnValue($returnVariable, $actor, $action, ...$args) { - $isFirst = true; - $output = sprintf("\t\t$%s = $%s->%s(", $returnVariable, $actor, $action->getType()); + $actionType = $action->getType(); + if ($actionType === 'helper') { + $actor = "this->helperContainer->get('" . $action->getCustomActionAttributes()['class'] . "')"; + $args = $args[0]; + $actionType = $action->getCustomActionAttributes()['method']; + } + $output = sprintf("\t\t$%s = $%s->%s(", $returnVariable, $actor, $actionType); for ($i = 0; $i < count($args); $i++) { if (null === $args[$i]) { continue; From 8ad5910b6af9c57990317255b53b6ff0c58789c7 Mon Sep 17 00:00:00 2001 From: Nadiya Syvokonenko Date: Tue, 21 Dec 2021 11:12:12 -0600 Subject: [PATCH 135/674] MQE-2575: Allow MFTF Helpers to Return Data to MFTF Test --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 17e645e76..7a9c987be 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -2044,7 +2044,7 @@ private function wrapFunctionCall($actor, $action, ...$args) * * @param string $returnVariable * @param string $actor - * @param string $action + * @param actionObject $action * @param array ...$args * @return string * @throws \Exception From 32747f8a2647fdb2ecf1c3602bf7a7e93b8d736f Mon Sep 17 00:00:00 2001 From: Nadiya Syvokonenko Date: Tue, 21 Dec 2021 17:14:42 -0600 Subject: [PATCH 136/674] MQE-2575: Allow MFTF Helpers to Return Data to MFTF Test - fix static tests --- .../FunctionalTestingFramework/Util/TestGenerator.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 7a9c987be..9519b921b 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -2042,10 +2042,10 @@ private function wrapFunctionCall($actor, $action, ...$args) /** * Wrap parameters into a function call with a return value. * - * @param string $returnVariable - * @param string $actor + * @param string $returnVariable + * @param string $actor * @param actionObject $action - * @param array ...$args + * @param array ...$args * @return string * @throws \Exception */ From ccfcf4f8e3f5ff6e670c87e92ae8f60eec842dd3 Mon Sep 17 00:00:00 2001 From: Nadiya Syvokonenko Date: Wed, 22 Dec 2021 12:23:52 -0600 Subject: [PATCH 137/674] MQE-2575: Allow MFTF Helpers to Return Data to MFTF Test - fix static tests --- .../tests/MFTF/DevDocs/Helper/CustomHelper.php | 11 +++++++++++ .../tests/MFTF/DevDocs/Test/DevDocsTest.xml | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/dev/tests/functional/tests/MFTF/DevDocs/Helper/CustomHelper.php b/dev/tests/functional/tests/MFTF/DevDocs/Helper/CustomHelper.php index 46fba18d9..3705ec1d0 100644 --- a/dev/tests/functional/tests/MFTF/DevDocs/Helper/CustomHelper.php +++ b/dev/tests/functional/tests/MFTF/DevDocs/Helper/CustomHelper.php @@ -46,4 +46,15 @@ public function goTo( print('$bla = ' . $bla . PHP_EOL); print('array $arraysomething = [' . implode(', ', $arraysomething) . ']' . PHP_EOL); } + + /** + * Returns value of provided param $text + * + * @param string $text + * @return string + */ + public function getText(string $text): string + { + return $text; + } } diff --git a/dev/tests/functional/tests/MFTF/DevDocs/Test/DevDocsTest.xml b/dev/tests/functional/tests/MFTF/DevDocs/Test/DevDocsTest.xml index bf074d516..911bc65eb 100644 --- a/dev/tests/functional/tests/MFTF/DevDocs/Test/DevDocsTest.xml +++ b/dev/tests/functional/tests/MFTF/DevDocs/Test/DevDocsTest.xml @@ -42,6 +42,14 @@ 987 + + some text + + + some text + getText + + From e9b5b0dfb6d47c5093ecae458e30ec8855532bca Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 24 Dec 2021 12:39:25 +0530 Subject: [PATCH 138/674] MQE-1518 : Added new action WaitForElementClickable --- .../Resources/WaitForElementClickableTest.txt | 69 +++++++++++++++++++ .../Test/WaitForElementClickableTest.xml | 22 ++++++ .../Tests/WaitForElementClickableTest.php | 24 +++++++ docs/test/actions.md | 20 +++++- .../Test/etc/Actions/waitActions.xsd | 17 +++++ 5 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 dev/tests/verification/Resources/WaitForElementClickableTest.txt create mode 100644 dev/tests/verification/TestModule/Test/WaitForElementClickableTest.xml create mode 100644 dev/tests/verification/Tests/WaitForElementClickableTest.php diff --git a/dev/tests/verification/Resources/WaitForElementClickableTest.txt b/dev/tests/verification/Resources/WaitForElementClickableTest.txt new file mode 100644 index 000000000..7840bc5dd --- /dev/null +++ b/dev/tests/verification/Resources/WaitForElementClickableTest.txt @@ -0,0 +1,69 @@ +Test filesvendor/magento/module-page-builder/Test/Mftf/Test/AdminPageBuilderColumnTest/WaitForElementClickableTest.xml
") + */ +class WaitForElementClickableTest +{ + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _before(AcceptanceTester $I) + { + $I->comment("Entering Action Group [loginAsAdmin] AdminLoginActionGroup"); + $I->amOnPage((getenv("MAGENTO_BACKEND_BASE_URL") ? rtrim(getenv("MAGENTO_BACKEND_BASE_URL"), "/") : "") . "/" . getenv("MAGENTO_BACKEND_NAME") . "/admin"); // stepKey: navigateToAdminLoginAsAdmin + $I->fillField("#username", getenv("MAGENTO_ADMIN_USERNAME")); // stepKey: fillUsernameLoginAsAdmin + $I->fillField("#login", getenv("MAGENTO_ADMIN_PASSWORD")); // stepKey: fillPasswordLoginAsAdmin + $I->click(".actions .action-primary"); // stepKey: clickLoginLoginAsAdmin + $I->waitForPageLoad(30); // stepKey: clickLoginLoginAsAdminWaitForPageLoad + $I->conditionalClick(".modal-popup .action-secondary", ".modal-popup .action-secondary", true); // stepKey: clickDontAllowButtonIfVisibleLoginAsAdmin + $I->closeAdminNotification(); // stepKey: closeAdminNotificationLoginAsAdmin + $I->comment("Exiting Action Group [loginAsAdmin] AdminLoginActionGroup"); + } + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + $I->comment("Entering Action Group [logout] AdminLogoutActionGroup"); + $I->amOnPage((getenv("MAGENTO_BACKEND_BASE_URL") ? rtrim(getenv("MAGENTO_BACKEND_BASE_URL"), "/") : "") . "/" . getenv("MAGENTO_BACKEND_NAME") . "/admin/auth/logout/"); // stepKey: amOnLogoutPageLogout + $I->comment("Exiting Action Group [logout] AdminLogoutActionGroup"); + } + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _failed(AcceptanceTester $I) + { + $I->saveScreenshot(); // stepKey: saveScreenshot + } + + /** + * @Features({"PageBuilder"}) + * @param AcceptanceTester $I + * @return void + * @throws \Exception + */ + public function WaitForElementClickableTest(AcceptanceTester $I) + { + $I->moveMouseOver("(//div[@data-content-type=\"column\"])[1]"); // stepKey: moveMouseOverColumn + $I->waitForPageLoad(30); // stepKey: waitForMouseOver + $I->waitForElementClickable("(//div[contains(@class, \"pagebuilder-content-type\") and contains(@class, \"pagebuilder-column\")])[1]//div[contains(@class,\"pagebuilder-options-visible\")]"); // stepKey: waitForOptions + } +} diff --git a/dev/tests/verification/TestModule/Test/WaitForElementClickableTest.xml b/dev/tests/verification/TestModule/Test/WaitForElementClickableTest.xml new file mode 100644 index 000000000..7118751be --- /dev/null +++ b/dev/tests/verification/TestModule/Test/WaitForElementClickableTest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/dev/tests/verification/Tests/WaitForElementClickableTest.php b/dev/tests/verification/Tests/WaitForElementClickableTest.php new file mode 100644 index 000000000..2b83c4b72 --- /dev/null +++ b/dev/tests/verification/Tests/WaitForElementClickableTest.php @@ -0,0 +1,24 @@ +generateAndCompareTest('WaitForElementClickableTest'); + } + +} diff --git a/docs/test/actions.md b/docs/test/actions.md index 42ecde053..373a44ee0 100644 --- a/docs/test/actions.md +++ b/docs/test/actions.md @@ -2374,10 +2374,28 @@ Attribute|Type|Use|Description #### Example ```xml - ``` +### waitForElementClickable + +See [waitForElementClickable docs on codeception.com](http://codeception.com/docs/modules/WebDriver#waitForElementClickable). + +Attribute|Type|Use|Description +---|---|---|--- +`selector`|string|optional| The selector identifying the corresponding HTML element. +`time`|string|optional| The number of seconds to wait for the element to appear. +`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. + +#### Example + +```xml + + +``` + ### waitForJS See [waitForJS docs on codeception.com](http://codeception.com/docs/modules/WebDriver#waitForJS). diff --git a/src/Magento/FunctionalTestingFramework/Test/etc/Actions/waitActions.xsd b/src/Magento/FunctionalTestingFramework/Test/etc/Actions/waitActions.xsd index 70b8201a1..18214ba9a 100644 --- a/src/Magento/FunctionalTestingFramework/Test/etc/Actions/waitActions.xsd +++ b/src/Magento/FunctionalTestingFramework/Test/etc/Actions/waitActions.xsd @@ -23,6 +23,8 @@ + + @@ -224,4 +226,19 @@ + + + + Waits up to $timeout seconds for the given element to be clickable. + If element doesn’t become clickable, a timeout exception is thrown. + + + + + + + + + + \ No newline at end of file From 6ea8ac24fc8773cd144e53dc330a635be18a8a7d Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 24 Dec 2021 14:44:59 +0530 Subject: [PATCH 139/674] fixed psr --- dev/tests/verification/Tests/WaitForElementClickableTest.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dev/tests/verification/Tests/WaitForElementClickableTest.php b/dev/tests/verification/Tests/WaitForElementClickableTest.php index 2b83c4b72..768fc1ab0 100644 --- a/dev/tests/verification/Tests/WaitForElementClickableTest.php +++ b/dev/tests/verification/Tests/WaitForElementClickableTest.php @@ -10,7 +10,7 @@ class WaitForElementClickableTest extends MftfTestCase { /** - * WaitForElementClickable: + * BasicFunctionalTest: * Tests flat generation of a hardcoded test file with no external references. * * @throws \Exception @@ -20,5 +20,4 @@ public function testWaitForElementClickableAction() { $this->generateAndCompareTest('WaitForElementClickableTest'); } - } From c0ee4a395eec7f7ecff3e7dcdd5b5cc3a831ad57 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 24 Dec 2021 16:01:46 +0530 Subject: [PATCH 140/674] fixed verification test --- .../verification/Resources/WaitForElementClickableTest.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/verification/Resources/WaitForElementClickableTest.txt b/dev/tests/verification/Resources/WaitForElementClickableTest.txt index 7840bc5dd..05359dba9 100644 --- a/dev/tests/verification/Resources/WaitForElementClickableTest.txt +++ b/dev/tests/verification/Resources/WaitForElementClickableTest.txt @@ -15,7 +15,7 @@ use Yandex\Allure\Adapter\Annotation\TestCaseId; /** * @Description("

Test files

vendor/magento/module-page-builder/Test/Mftf/Test/AdminPageBuilderColumnTest/WaitForElementClickableTest.xml
") */ -class WaitForElementClickableTest +class WaitForElementClickableTestCest { /** * @param AcceptanceTester $I From 9eab78e92ff01075f2f6425373bb85aca3164f46 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Tue, 28 Dec 2021 12:36:25 +0530 Subject: [PATCH 141/674] fixed verification test --- .../Resources/DataActionsTest.txt | 1 + .../Resources/WaitForElementClickableTest.txt | 69 ------------------- .../TestModule/Test/DataActionsTest.xml | 3 +- .../Test/WaitForElementClickableTest.xml | 22 ------ .../Tests/WaitForElementClickableTest.php | 23 ------- 5 files changed, 3 insertions(+), 115 deletions(-) delete mode 100644 dev/tests/verification/Resources/WaitForElementClickableTest.txt delete mode 100644 dev/tests/verification/TestModule/Test/WaitForElementClickableTest.xml delete mode 100644 dev/tests/verification/Tests/WaitForElementClickableTest.php diff --git a/dev/tests/verification/Resources/DataActionsTest.txt b/dev/tests/verification/Resources/DataActionsTest.txt index f84f97040..56da03cd6 100644 --- a/dev/tests/verification/Resources/DataActionsTest.txt +++ b/dev/tests/verification/Resources/DataActionsTest.txt @@ -31,6 +31,7 @@ class DataActionsTestCest $I->createEntity("createdInBefore", "hook", "entity", [], []); // stepKey: createdInBefore $I->updateEntity("createdInBefore", "hook", "entity",[]); // stepKey: updateInBefore $I->deleteEntity("createdInBefore", "hook"); // stepKey: deleteInBefore + $I->waitForElementClickable(".functionalTestSelector"); // stepKey: waitForElementClickable } /** diff --git a/dev/tests/verification/Resources/WaitForElementClickableTest.txt b/dev/tests/verification/Resources/WaitForElementClickableTest.txt deleted file mode 100644 index 05359dba9..000000000 --- a/dev/tests/verification/Resources/WaitForElementClickableTest.txt +++ /dev/null @@ -1,69 +0,0 @@ -Test filesvendor/magento/module-page-builder/Test/Mftf/Test/AdminPageBuilderColumnTest/WaitForElementClickableTest.xml
") - */ -class WaitForElementClickableTestCest -{ - /** - * @param AcceptanceTester $I - * @throws \Exception - */ - public function _before(AcceptanceTester $I) - { - $I->comment("Entering Action Group [loginAsAdmin] AdminLoginActionGroup"); - $I->amOnPage((getenv("MAGENTO_BACKEND_BASE_URL") ? rtrim(getenv("MAGENTO_BACKEND_BASE_URL"), "/") : "") . "/" . getenv("MAGENTO_BACKEND_NAME") . "/admin"); // stepKey: navigateToAdminLoginAsAdmin - $I->fillField("#username", getenv("MAGENTO_ADMIN_USERNAME")); // stepKey: fillUsernameLoginAsAdmin - $I->fillField("#login", getenv("MAGENTO_ADMIN_PASSWORD")); // stepKey: fillPasswordLoginAsAdmin - $I->click(".actions .action-primary"); // stepKey: clickLoginLoginAsAdmin - $I->waitForPageLoad(30); // stepKey: clickLoginLoginAsAdminWaitForPageLoad - $I->conditionalClick(".modal-popup .action-secondary", ".modal-popup .action-secondary", true); // stepKey: clickDontAllowButtonIfVisibleLoginAsAdmin - $I->closeAdminNotification(); // stepKey: closeAdminNotificationLoginAsAdmin - $I->comment("Exiting Action Group [loginAsAdmin] AdminLoginActionGroup"); - } - - /** - * @param AcceptanceTester $I - * @throws \Exception - */ - public function _after(AcceptanceTester $I) - { - $I->comment("Entering Action Group [logout] AdminLogoutActionGroup"); - $I->amOnPage((getenv("MAGENTO_BACKEND_BASE_URL") ? rtrim(getenv("MAGENTO_BACKEND_BASE_URL"), "/") : "") . "/" . getenv("MAGENTO_BACKEND_NAME") . "/admin/auth/logout/"); // stepKey: amOnLogoutPageLogout - $I->comment("Exiting Action Group [logout] AdminLogoutActionGroup"); - } - - /** - * @param AcceptanceTester $I - * @throws \Exception - */ - public function _failed(AcceptanceTester $I) - { - $I->saveScreenshot(); // stepKey: saveScreenshot - } - - /** - * @Features({"PageBuilder"}) - * @param AcceptanceTester $I - * @return void - * @throws \Exception - */ - public function WaitForElementClickableTest(AcceptanceTester $I) - { - $I->moveMouseOver("(//div[@data-content-type=\"column\"])[1]"); // stepKey: moveMouseOverColumn - $I->waitForPageLoad(30); // stepKey: waitForMouseOver - $I->waitForElementClickable("(//div[contains(@class, \"pagebuilder-content-type\") and contains(@class, \"pagebuilder-column\")])[1]//div[contains(@class,\"pagebuilder-options-visible\")]"); // stepKey: waitForOptions - } -} diff --git a/dev/tests/verification/TestModule/Test/DataActionsTest.xml b/dev/tests/verification/TestModule/Test/DataActionsTest.xml index b75bc98f8..eede5e9f9 100644 --- a/dev/tests/verification/TestModule/Test/DataActionsTest.xml +++ b/dev/tests/verification/TestModule/Test/DataActionsTest.xml @@ -13,8 +13,9 @@ - + + diff --git a/dev/tests/verification/TestModule/Test/WaitForElementClickableTest.xml b/dev/tests/verification/TestModule/Test/WaitForElementClickableTest.xml deleted file mode 100644 index 7118751be..000000000 --- a/dev/tests/verification/TestModule/Test/WaitForElementClickableTest.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/dev/tests/verification/Tests/WaitForElementClickableTest.php b/dev/tests/verification/Tests/WaitForElementClickableTest.php deleted file mode 100644 index 768fc1ab0..000000000 --- a/dev/tests/verification/Tests/WaitForElementClickableTest.php +++ /dev/null @@ -1,23 +0,0 @@ -generateAndCompareTest('WaitForElementClickableTest'); - } -} From 1ca49786fc57de14d596d08050d54545c6122b57 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Tue, 28 Dec 2021 12:43:44 +0530 Subject: [PATCH 142/674] verification test for waitForElementClickable --- dev/tests/verification/Resources/DataActionsTest.txt | 2 +- dev/tests/verification/TestModule/Test/DataActionsTest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/verification/Resources/DataActionsTest.txt b/dev/tests/verification/Resources/DataActionsTest.txt index 56da03cd6..178c579da 100644 --- a/dev/tests/verification/Resources/DataActionsTest.txt +++ b/dev/tests/verification/Resources/DataActionsTest.txt @@ -31,7 +31,6 @@ class DataActionsTestCest $I->createEntity("createdInBefore", "hook", "entity", [], []); // stepKey: createdInBefore $I->updateEntity("createdInBefore", "hook", "entity",[]); // stepKey: updateInBefore $I->deleteEntity("createdInBefore", "hook"); // stepKey: deleteInBefore - $I->waitForElementClickable(".functionalTestSelector"); // stepKey: waitForElementClickable } /** @@ -54,6 +53,7 @@ class DataActionsTestCest */ public function DataActionsTest(AcceptanceTester $I) { + $I->waitForElementClickable(".functionalTestSelector"); // stepKey: waitForElementClickable $I->createEntity("createdInTest", "test", "entity", [], []); // stepKey: createdInTest $I->updateEntity("createdInTest", "test", "entity",[]); // stepKey: updateInTest $I->deleteEntity("createdInTest", "test"); // stepKey: deleteInTest diff --git a/dev/tests/verification/TestModule/Test/DataActionsTest.xml b/dev/tests/verification/TestModule/Test/DataActionsTest.xml index eede5e9f9..2575c41b0 100644 --- a/dev/tests/verification/TestModule/Test/DataActionsTest.xml +++ b/dev/tests/verification/TestModule/Test/DataActionsTest.xml @@ -13,9 +13,9 @@ - + From 4f66a1cb3a978f1416464c73bfd9781a3fb7aad4 Mon Sep 17 00:00:00 2001 From: Dmytro Shevtsov Date: Wed, 5 Jan 2022 10:40:02 -0600 Subject: [PATCH 143/674] Deleted the 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& 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 From 3b8f99c7fcc2fe9f4e749d97a19e81955a564a81 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 6 Jan 2022 09:46:01 -0600 Subject: [PATCH 144/674] MQE-3182: Release MFTF 3.8.0 --- CHANGELOG.md | 8 ++++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d8a662fe..04999e2c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ Magento Functional Testing Framework Changelog ================================================ +3.8.0 +--------- + +### Updates: +* Allow MFTF Helpers to Return Data to MFTF Test +* Improve parallel grouping and fix an issue with unbalanced groups +* Added new action WaitForElementClickable + 3.7.3 --------- diff --git a/composer.json b/composer.json index 8fedf25a8..9a7757c5d 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": "3.7.3", + "version": "3.8.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 4a1a7d2be..8000882be 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": "822c40666da3ff087f25393fd4dc9371", + "content-hash": "35ff8c71326b9f8ab0885c8b55dd59cf", "packages": [ { "name": "allure-framework/allure-codeception", From 8aa7fd2bfca4a2e36c108d7f432afc065ca0d587 Mon Sep 17 00:00:00 2001 From: "Shashik.K.Singh" Date: Wed, 12 Jan 2022 11:28:15 +0530 Subject: [PATCH 145/674] change condition as requested --- .../DataGenerator/Handlers/SecretStorage/FileStorage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php index 1d122b9c5..81d39d608 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php @@ -101,7 +101,7 @@ private function encryptCredFileContents($credContents) if (substr($credValue, 0, 1) === '#' || empty($credValue)) { continue; } - elseif (is_bool(strpos($credValue, "="))){ + elseif (strpos($credValue, "=") === false){ throw new TestFrameworkException( $credValue." not configured correctly in .credentials file" ); From c402e2e038e0280a2e82dfbc838b425a4b83173b Mon Sep 17 00:00:00 2001 From: glo00108 Date: Tue, 18 Jan 2022 13:59:57 +0530 Subject: [PATCH 146/674] unit test added --- .../SecretStorage/FileStorageTest.php | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php index be97e04ab..5a1b2195c 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php @@ -45,4 +45,37 @@ public function testBasicEncryptDecrypt(): void // assert that we are able to successfully decrypt our secret value $this->assertEquals($testValue, $actualValue); } + + /** + * Test empty value encryption/decryption functionality in FileStorage class. + */ + public function testEmptyValueEncryptDecrypt(): void + { + $testKey = 'magento/myKey'; + $testValue = ''; + $creds = ["$testKey"]; + + $fileStorage = new FileStorage(); + $reflection = new ReflectionClass(FileStorage::class); + + // Emulate initialize() function result with the test credentials + $reflectionMethod = $reflection->getMethod('encryptCredFileContents'); + $reflectionMethod->setAccessible(true); + $secretData = $reflectionMethod->invokeArgs($fileStorage, [$creds]); + + // Set encrypted test credentials to the private 'secretData' property + $reflectionProperty = $reflection->getProperty('secretData'); + $reflectionProperty->setAccessible(true); + $reflectionProperty->setValue($fileStorage, $secretData); + + $encryptedCred = $fileStorage->getEncryptedValue($testKey); + + // assert the value we've gotten is in fact not identical to our test value + $this->assertNotEquals($testValue, $encryptedCred); + + $actualValue = $fileStorage->getDecryptedValue($encryptedCred); + + // assert that we are able to successfully decrypt our secret value + $this->assertEquals($testValue, $actualValue); + } } From e67dd090366c89d02df5e1145eacc8cd82ec7158 Mon Sep 17 00:00:00 2001 From: glo00108 Date: Wed, 19 Jan 2022 18:29:23 +0530 Subject: [PATCH 147/674] add exception assert --- .../SecretStorage/FileStorageTest.php | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php index 5a1b2195c..3d5922f9e 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php @@ -8,19 +8,22 @@ namespace tests\unit\Magento\FunctionalTestFramework\DataGenerator\Handlers\SecretStorage; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\SecretStorage\FileStorage; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use ReflectionClass; +use ReflectionException; use tests\unit\Util\MagentoTestCase; class FileStorageTest extends MagentoTestCase { /** * Test basic encryption/decryption functionality in FileStorage class. + * @throws TestFrameworkException|ReflectionException */ public function testBasicEncryptDecrypt(): void { $testKey = 'magento/myKey'; $testValue = 'myValue'; - $creds = ["$testKey=$testValue"]; + $cred = ["$testKey=$testValue"]; $fileStorage = new FileStorage(); $reflection = new ReflectionClass(FileStorage::class); @@ -28,7 +31,7 @@ public function testBasicEncryptDecrypt(): void // Emulate initialize() function result with the test credentials $reflectionMethod = $reflection->getMethod('encryptCredFileContents'); $reflectionMethod->setAccessible(true); - $secretData = $reflectionMethod->invokeArgs($fileStorage, [$creds]); + $secretData = $reflectionMethod->invokeArgs($fileStorage, [$cred]); // Set encrypted test credentials to the private 'secretData' property $reflectionProperty = $reflection->getProperty('secretData'); @@ -48,34 +51,29 @@ public function testBasicEncryptDecrypt(): void /** * Test empty value encryption/decryption functionality in FileStorage class. + * @return void + * @throws TestFrameworkException|ReflectionException */ public function testEmptyValueEncryptDecrypt(): void { - $testKey = 'magento/myKey'; - $testValue = ''; - $creds = ["$testKey"]; + $this->expectException(TestFrameworkException::class); - $fileStorage = new FileStorage(); - $reflection = new ReflectionClass(FileStorage::class); - - // Emulate initialize() function result with the test credentials - $reflectionMethod = $reflection->getMethod('encryptCredFileContents'); - $reflectionMethod->setAccessible(true); - $secretData = $reflectionMethod->invokeArgs($fileStorage, [$creds]); - - // Set encrypted test credentials to the private 'secretData' property - $reflectionProperty = $reflection->getProperty('secretData'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($fileStorage, $secretData); + $testKey = 'magento/myKey'; + $cred = ["$testKey"]; - $encryptedCred = $fileStorage->getEncryptedValue($testKey); + $fileStorage = new FileStorage(); + $reflection = new ReflectionClass(FileStorage::class); - // assert the value we've gotten is in fact not identical to our test value - $this->assertNotEquals($testValue, $encryptedCred); + // Emulate initialize() function result with the test credentials + $reflectionMethod = $reflection->getMethod('encryptCredFileContents'); + $reflectionMethod->setAccessible(true); + $secretData = $reflectionMethod->invokeArgs($fileStorage, [$cred]); - $actualValue = $fileStorage->getDecryptedValue($encryptedCred); + // Set encrypted test credentials to the private 'secretData' property + $reflectionProperty = $reflection->getProperty('secretData'); + $reflectionProperty->setAccessible(true); + $reflectionProperty->setValue($fileStorage, $secretData); - // assert that we are able to successfully decrypt our secret value - $this->assertEquals($testValue, $actualValue); + $fileStorage->getEncryptedValue($testKey); } } From 41ff3f11082220ee9e508384b8205469d4469569 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Thu, 20 Jan 2022 14:13:04 +0530 Subject: [PATCH 148/674] MQE-1190 : max characters limit is increased --- .../Codeception/Subscriber/Console.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php b/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php index c6c6a4eec..4b6cb93a7 100644 --- a/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php +++ b/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php @@ -193,7 +193,7 @@ private function printStepKeys(Step $step) $stepString = str_replace( [ActionGroupObject::ACTION_GROUP_CONTEXT_START, ActionGroupObject::ACTION_GROUP_CONTEXT_END], '', - $step->toString(150) + $step->toString(10000) ); $msg->append(OutputFormatter::escape($stepString)); From 4a4667f19843d566ca7f6b69f75ac9c0a06ba8b5 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Thu, 20 Jan 2022 14:14:31 +0530 Subject: [PATCH 149/674] MQE-1190 : max characters limit is increased --- .../Codeception/Subscriber/Console.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php b/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php index 4b6cb93a7..961f68440 100644 --- a/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php +++ b/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php @@ -193,7 +193,7 @@ private function printStepKeys(Step $step) $stepString = str_replace( [ActionGroupObject::ACTION_GROUP_CONTEXT_START, ActionGroupObject::ACTION_GROUP_CONTEXT_END], '', - $step->toString(10000) + $step->toString(1000) ); $msg->append(OutputFormatter::escape($stepString)); From 19c785919b63c1dad704b88031010150dde1df38 Mon Sep 17 00:00:00 2001 From: glo00108 Date: Fri, 21 Jan 2022 13:12:38 +0530 Subject: [PATCH 150/674] fix static test error --- .../Handlers/SecretStorage/FileStorage.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php index 81d39d608..48087e890 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/FileStorage.php @@ -6,8 +6,8 @@ namespace Magento\FunctionalTestingFramework\DataGenerator\Handlers\SecretStorage; -use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; use Magento\FunctionalTestingFramework\Util\Path\FilePathFormatter; @@ -93,6 +93,7 @@ private function readInCredentialsFile() * * @param array $credContents * @return array + * @throws TestFrameworkException */ private function encryptCredFileContents($credContents) { @@ -100,11 +101,10 @@ private function encryptCredFileContents($credContents) foreach ($credContents as $credValue) { if (substr($credValue, 0, 1) === '#' || empty($credValue)) { continue; - } - elseif (strpos($credValue, "=") === false){ - throw new TestFrameworkException( - $credValue." not configured correctly in .credentials file" - ); + } elseif (strpos($credValue, "=") === false) { + throw new TestFrameworkException( + $credValue . " not configured correctly in .credentials file" + ); } list($key, $value) = explode("=", $credValue, 2); From 9970faf83dd5392c98afbb36bbaf1ca98d7d0634 Mon Sep 17 00:00:00 2001 From: "Mohit.k.Sharma" Date: Fri, 28 Jan 2022 09:39:49 +0530 Subject: [PATCH 151/674] Test before/after comments in test/allure --- .../Util/TestGenerator.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index c5368b779..06c32ea03 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1770,6 +1770,32 @@ private function generateHooksPhp($hookObjects) throw new TestReferenceException($e->getMessage() . " in Element \"" . $type . "\""); } + if ($type == 'before') { + $steps = sprintf( + "\t\t$%s->comment('[%s]');" . PHP_EOL, + 'I', + 'START BEFORE HOOK' + ) . $steps; + $steps = $steps . sprintf( + "\t\t$%s->comment('[%s]');" . PHP_EOL, + 'I', + 'END BEFORE HOOK' + ); + } + + if ($type == 'after') { + $steps = sprintf( + "\t\t$%s->comment('[%s]');" . PHP_EOL, + 'I', + 'START AFTER HOOK' + ) . $steps; + $steps = $steps . sprintf( + "\t\t$%s->comment('[%s]');" . PHP_EOL, + 'I', + 'END AFTER HOOK' + ); + } + $hooks .= sprintf("\tpublic function _{$type}(%s)\n", $dependencies); $hooks .= "\t{\n"; $hooks .= $steps; From 91c64e6144ca19fa163f83dc05e18688889ff516 Mon Sep 17 00:00:00 2001 From: glo00108 Date: Tue, 1 Feb 2022 10:42:48 +0530 Subject: [PATCH 152/674] added startMessageQueue variable in testobject file --- .../Handlers/SecretStorage/FileStorageTest.php | 8 ++++---- .../Test/Objects/TestObject.php | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php index 3d5922f9e..672de5a21 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php @@ -23,7 +23,7 @@ public function testBasicEncryptDecrypt(): void { $testKey = 'magento/myKey'; $testValue = 'myValue'; - $cred = ["$testKey=$testValue"]; + $creds = ["$testKey=$testValue"]; $fileStorage = new FileStorage(); $reflection = new ReflectionClass(FileStorage::class); @@ -31,7 +31,7 @@ public function testBasicEncryptDecrypt(): void // Emulate initialize() function result with the test credentials $reflectionMethod = $reflection->getMethod('encryptCredFileContents'); $reflectionMethod->setAccessible(true); - $secretData = $reflectionMethod->invokeArgs($fileStorage, [$cred]); + $secretData = $reflectionMethod->invokeArgs($fileStorage, [$creds]); // Set encrypted test credentials to the private 'secretData' property $reflectionProperty = $reflection->getProperty('secretData'); @@ -59,7 +59,7 @@ public function testEmptyValueEncryptDecrypt(): void $this->expectException(TestFrameworkException::class); $testKey = 'magento/myKey'; - $cred = ["$testKey"]; + $creds = ["$testKey"]; $fileStorage = new FileStorage(); $reflection = new ReflectionClass(FileStorage::class); @@ -67,7 +67,7 @@ public function testEmptyValueEncryptDecrypt(): void // Emulate initialize() function result with the test credentials $reflectionMethod = $reflection->getMethod('encryptCredFileContents'); $reflectionMethod->setAccessible(true); - $secretData = $reflectionMethod->invokeArgs($fileStorage, [$cred]); + $secretData = $reflectionMethod->invokeArgs($fileStorage, [$creds]); // Set encrypted test credentials to the private 'secretData' property $reflectionProperty = $reflection->getProperty('secretData'); diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php index f556947f1..9da9191cd 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php @@ -39,6 +39,7 @@ class TestObject 'deleteData' => 200, 'updateData' => 200, 'getOTP' => 1000, + 'startMessageQueue' => 700, ]; const WEBAPI_AUTH_TEST_ACTIONS = [ From 7aaf83be62ab1bc1fdeca4c5eec5a20e6c7c94c8 Mon Sep 17 00:00:00 2001 From: "Mohit.k.Sharma" Date: Tue, 1 Feb 2022 19:35:18 +0530 Subject: [PATCH 153/674] Fix verification checks ans static checks error --- .../ActionGroupContainsStepKeyInArgText.txt | 2 + .../ActionGroupReturningValueTest.txt | 4 ++ .../Resources/ActionGroupUsingCreateData.txt | 2 + .../ActionGroupWithDataOverrideTest.txt | 4 ++ .../Resources/ActionGroupWithDataTest.txt | 4 ++ .../ActionGroupWithNoDefaultTest.txt | 4 ++ .../ActionGroupWithPersistedData.txt | 4 ++ .../ActionGroupWithTopLevelPersistedData.txt | 4 ++ .../ArgumentWithSameNameAsElement.txt | 4 ++ .../verification/Resources/AssertTest.txt | 2 + .../Resources/BasicActionGroupTest.txt | 2 + .../Resources/BasicFunctionalTest.txt | 4 ++ .../verification/Resources/BasicMergeTest.txt | 4 ++ .../Resources/ChildExtendedTestAddHooks.txt | 4 ++ .../Resources/ChildExtendedTestMerging.txt | 4 ++ .../ChildExtendedTestRemoveAction.txt | 4 ++ .../ChildExtendedTestRemoveHookAction.txt | 2 + .../Resources/ChildExtendedTestReplace.txt | 4 ++ .../ChildExtendedTestReplaceHook.txt | 4 ++ .../Resources/DataActionsTest.txt | 2 + .../ExtendedChildTestInSuiteCest.txt | 4 ++ .../Resources/ExtendedChildTestNotInSuite.txt | 4 ++ .../Resources/HookActionsTest.txt | 4 ++ .../MergedActionGroupReturningValueTest.txt | 4 ++ .../Resources/MergedActionGroupTest.txt | 4 ++ .../Resources/MergedReferencesTest.txt | 4 ++ .../Resources/MultipleActionGroupsTest.txt | 4 ++ .../Resources/ParentExtendedTest.txt | 4 ++ .../Resources/PersistedReplacementTest.txt | 2 + .../PersistenceActionGroupAppendingTest.txt | 2 + .../Resources/PersistenceCustomFieldsTest.txt | 2 + .../Resources/XmlCommentedTest.txt | 4 ++ .../Util/TestGenerator.php | 38 +++++++++---------- 33 files changed, 129 insertions(+), 19 deletions(-) diff --git a/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt b/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt index f2066e1d8..3faa07c06 100644 --- a/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt +++ b/dev/tests/verification/Resources/ActionGroupContainsStepKeyInArgText.txt @@ -28,9 +28,11 @@ class ActionGroupContainsStepKeyInArgTextCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->comment("Entering Action Group [actionGroup] actionGroupContainsStepKeyInArgValue"); $I->see("arg1", ".selector"); // stepKey: arg1ActionGroup $I->comment("Exiting Action Group [actionGroup] actionGroupContainsStepKeyInArgValue"); + $I->comment('[END BEFORE HOOK]'); } /** diff --git a/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt index 92461bfaa..fdf05ad4b 100644 --- a/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/ActionGroupReturningValueTest.txt @@ -29,11 +29,13 @@ class ActionGroupReturningValueTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createPersonParam", "hook", "ReplacementPerson", [], []); // stepKey: createPersonParam $I->comment("Entering Action Group [beforeGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1BeforeGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2BeforeGroup $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); + $I->comment('[END BEFORE HOOK]'); } /** @@ -42,10 +44,12 @@ class ActionGroupReturningValueTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->comment("Entering Action Group [afterGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt b/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt index 2b3c56883..88f1f0183 100644 --- a/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt +++ b/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt @@ -28,10 +28,12 @@ class ActionGroupUsingCreateDataCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->comment("Entering Action Group [Key1] actionGroupWithCreateData"); $I->createEntity("createCategoryKey1", "hook", "ApiCategory", [], []); // stepKey: createCategoryKey1 $I->createEntity("createConfigProductKey1", "hook", "ApiConfigurableProduct", ["createCategoryKey1"], []); // stepKey: createConfigProductKey1 $I->comment("Exiting Action Group [Key1] actionGroupWithCreateData"); + $I->comment('[END BEFORE HOOK]'); } /** diff --git a/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt b/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt index 34486ead4..79f182e8a 100644 --- a/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt @@ -29,11 +29,13 @@ class ActionGroupWithDataOverrideTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createPersonParam", "hook", "ReplacementPerson", [], []); // stepKey: createPersonParam $I->comment("Entering Action Group [beforeGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1BeforeGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2BeforeGroup $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); + $I->comment('[END BEFORE HOOK]'); } /** @@ -42,10 +44,12 @@ class ActionGroupWithDataOverrideTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->comment("Entering Action Group [afterGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ActionGroupWithDataTest.txt b/dev/tests/verification/Resources/ActionGroupWithDataTest.txt index 542796ab6..ed8b69a77 100644 --- a/dev/tests/verification/Resources/ActionGroupWithDataTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithDataTest.txt @@ -29,11 +29,13 @@ class ActionGroupWithDataTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createPersonParam", "hook", "ReplacementPerson", [], []); // stepKey: createPersonParam $I->comment("Entering Action Group [beforeGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1BeforeGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2BeforeGroup $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); + $I->comment('[END BEFORE HOOK]'); } /** @@ -42,10 +44,12 @@ class ActionGroupWithDataTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->comment("Entering Action Group [afterGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt b/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt index 2705c5ca1..435b8a5cc 100644 --- a/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt +++ b/dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt @@ -29,11 +29,13 @@ class ActionGroupWithNoDefaultTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createPersonParam", "hook", "ReplacementPerson", [], []); // stepKey: createPersonParam $I->comment("Entering Action Group [beforeGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1BeforeGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2BeforeGroup $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); + $I->comment('[END BEFORE HOOK]'); } /** @@ -42,10 +44,12 @@ class ActionGroupWithNoDefaultTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->comment("Entering Action Group [afterGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt b/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt index 243569e46..12aae9c21 100644 --- a/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt +++ b/dev/tests/verification/Resources/ActionGroupWithPersistedData.txt @@ -29,11 +29,13 @@ class ActionGroupWithPersistedDataCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createPersonParam", "hook", "ReplacementPerson", [], []); // stepKey: createPersonParam $I->comment("Entering Action Group [beforeGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1BeforeGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2BeforeGroup $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); + $I->comment('[END BEFORE HOOK]'); } /** @@ -42,10 +44,12 @@ class ActionGroupWithPersistedDataCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->comment("Entering Action Group [afterGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt b/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt index 7cc0ef505..4db67f901 100644 --- a/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt +++ b/dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt @@ -29,11 +29,13 @@ class ActionGroupWithTopLevelPersistedDataCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createPersonParam", "hook", "ReplacementPerson", [], []); // stepKey: createPersonParam $I->comment("Entering Action Group [beforeGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1BeforeGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2BeforeGroup $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); + $I->comment('[END BEFORE HOOK]'); } /** @@ -42,10 +44,12 @@ class ActionGroupWithTopLevelPersistedDataCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->comment("Entering Action Group [afterGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt b/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt index 55ea28d00..a5e24c0a1 100644 --- a/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt +++ b/dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt @@ -29,11 +29,13 @@ class ArgumentWithSameNameAsElementCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createPersonParam", "hook", "ReplacementPerson", [], []); // stepKey: createPersonParam $I->comment("Entering Action Group [beforeGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1BeforeGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2BeforeGroup $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); + $I->comment('[END BEFORE HOOK]'); } /** @@ -42,10 +44,12 @@ class ArgumentWithSameNameAsElementCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->comment("Entering Action Group [afterGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/AssertTest.txt b/dev/tests/verification/Resources/AssertTest.txt index 381ab4818..75c5266bd 100644 --- a/dev/tests/verification/Resources/AssertTest.txt +++ b/dev/tests/verification/Resources/AssertTest.txt @@ -28,7 +28,9 @@ class AssertTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createData1", "hook", "ReplacementPerson", [], []); // stepKey: createData1 + $I->comment('[END BEFORE HOOK]'); } /** diff --git a/dev/tests/verification/Resources/BasicActionGroupTest.txt b/dev/tests/verification/Resources/BasicActionGroupTest.txt index 8a5da2f11..5412afa70 100644 --- a/dev/tests/verification/Resources/BasicActionGroupTest.txt +++ b/dev/tests/verification/Resources/BasicActionGroupTest.txt @@ -29,11 +29,13 @@ class BasicActionGroupTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createPersonParam", "hook", "ReplacementPerson", [], []); // stepKey: createPersonParam $I->comment("Entering Action Group [beforeGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1BeforeGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2BeforeGroup $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); + $I->comment('[END BEFORE HOOK]'); } /** diff --git a/dev/tests/verification/Resources/BasicFunctionalTest.txt b/dev/tests/verification/Resources/BasicFunctionalTest.txt index 526162e3e..e30f50c34 100644 --- a/dev/tests/verification/Resources/BasicFunctionalTest.txt +++ b/dev/tests/verification/Resources/BasicFunctionalTest.txt @@ -30,7 +30,9 @@ class BasicFunctionalTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->amOnPage("/beforeUrl"); // stepKey: beforeAmOnPageKey + $I->comment('[END BEFORE HOOK]'); } /** @@ -39,7 +41,9 @@ class BasicFunctionalTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/BasicMergeTest.txt b/dev/tests/verification/Resources/BasicMergeTest.txt index 27b22bd34..df625aa57 100644 --- a/dev/tests/verification/Resources/BasicMergeTest.txt +++ b/dev/tests/verification/Resources/BasicMergeTest.txt @@ -31,8 +31,10 @@ class BasicMergeTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->amOnPage("/beforeUrl"); // stepKey: before1 $I->see("#before2"); // stepKey: before2 + $I->comment('[END BEFORE HOOK]'); } /** @@ -41,7 +43,9 @@ class BasicMergeTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->amOnPage("/afterUrl1"); // stepKey: after1 + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt b/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt index 63b874964..01fa652d8 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestAddHooks.txt @@ -30,7 +30,9 @@ class ChildExtendedTestAddHooksCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->amOnPage("/beforeUrl"); // stepKey: beforeAmOnPageKey + $I->comment('[END BEFORE HOOK]'); } /** @@ -39,7 +41,9 @@ class ChildExtendedTestAddHooksCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ChildExtendedTestMerging.txt b/dev/tests/verification/Resources/ChildExtendedTestMerging.txt index 5f506e58c..8b78c5a5e 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestMerging.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestMerging.txt @@ -30,9 +30,11 @@ class ChildExtendedTestMergingCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->amOnPage("/firstUrl"); // stepKey: firstBeforeAmOnPageKey $I->amOnPage("/beforeUrl"); // stepKey: beforeAmOnPageKey $I->amOnPage("/lastUrl"); // stepKey: lastBefore + $I->comment('[END BEFORE HOOK]'); } /** @@ -41,7 +43,9 @@ class ChildExtendedTestMergingCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt b/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt index 64ae855b8..859bc8226 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestRemoveAction.txt @@ -30,7 +30,9 @@ class ChildExtendedTestRemoveActionCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->amOnPage("/beforeUrl"); // stepKey: beforeAmOnPageKey + $I->comment('[END BEFORE HOOK]'); } /** @@ -39,7 +41,9 @@ class ChildExtendedTestRemoveActionCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt b/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt index e4acdf155..d48fb9743 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestRemoveHookAction.txt @@ -38,7 +38,9 @@ class ChildExtendedTestRemoveHookActionCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ChildExtendedTestReplace.txt b/dev/tests/verification/Resources/ChildExtendedTestReplace.txt index 0b62e3762..acb8eced9 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestReplace.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestReplace.txt @@ -30,7 +30,9 @@ class ChildExtendedTestReplaceCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->amOnPage("/beforeUrl"); // stepKey: beforeAmOnPageKey + $I->comment('[END BEFORE HOOK]'); } /** @@ -39,7 +41,9 @@ class ChildExtendedTestReplaceCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt b/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt index 1e8366351..db6912e95 100644 --- a/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt +++ b/dev/tests/verification/Resources/ChildExtendedTestReplaceHook.txt @@ -30,7 +30,9 @@ class ChildExtendedTestReplaceHookCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->amOnPage("/slightlyDifferentBeforeUrl"); // stepKey: beforeAmOnPageKey + $I->comment('[END BEFORE HOOK]'); } /** @@ -39,7 +41,9 @@ class ChildExtendedTestReplaceHookCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/DataActionsTest.txt b/dev/tests/verification/Resources/DataActionsTest.txt index da89f4d59..cf4de53a3 100644 --- a/dev/tests/verification/Resources/DataActionsTest.txt +++ b/dev/tests/verification/Resources/DataActionsTest.txt @@ -28,9 +28,11 @@ class DataActionsTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createdInBefore", "hook", "entity", [], []); // stepKey: createdInBefore $I->updateEntity("createdInBefore", "hook", "entity",[]); // stepKey: updateInBefore $I->deleteEntity("createdInBefore", "hook"); // stepKey: deleteInBefore + $I->comment('[END BEFORE HOOK]'); } /** diff --git a/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt b/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt index fae417d55..c46076353 100644 --- a/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt +++ b/dev/tests/verification/Resources/ExtendedChildTestInSuiteCest.txt @@ -30,7 +30,9 @@ class ExtendedChildTestInSuiteCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->amOnPage("/beforeUrl"); // stepKey: beforeAmOnPageKey + $I->comment('[END BEFORE HOOK]'); } /** @@ -39,7 +41,9 @@ class ExtendedChildTestInSuiteCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt b/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt index be3ffbf58..38ba62faf 100644 --- a/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt +++ b/dev/tests/verification/Resources/ExtendedChildTestNotInSuite.txt @@ -29,7 +29,9 @@ class ExtendedChildTestNotInSuiteCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->amOnPage("/beforeUrl"); // stepKey: beforeAmOnPageKey + $I->comment('[END BEFORE HOOK]'); } /** @@ -38,7 +40,9 @@ class ExtendedChildTestNotInSuiteCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/HookActionsTest.txt b/dev/tests/verification/Resources/HookActionsTest.txt index 0132cd48c..01edd913d 100644 --- a/dev/tests/verification/Resources/HookActionsTest.txt +++ b/dev/tests/verification/Resources/HookActionsTest.txt @@ -28,9 +28,11 @@ class HookActionsTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("sampleCreateBefore", "hook", "sampleCreatedEntity", [], []); // stepKey: sampleCreateBefore $I->deleteEntity("sampleCreateBefore", "hook"); // stepKey: sampleDeleteBefore $I->createEntity("sampleCreateForAfter", "hook", "sampleCreatedEntity", [], []); // stepKey: sampleCreateForAfter + $I->comment('[END BEFORE HOOK]'); } /** @@ -39,8 +41,10 @@ class HookActionsTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->createEntity("sampleCreateAfter", "hook", "sampleCreatedEntity", [], []); // stepKey: sampleCreateAfter $I->deleteEntity("sampleCreateForAfter", "hook"); // stepKey: sampleDeleteAfter + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt b/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt index cce383b6c..68fec4cfa 100644 --- a/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt +++ b/dev/tests/verification/Resources/MergedActionGroupReturningValueTest.txt @@ -29,11 +29,13 @@ class MergedActionGroupReturningValueTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createPersonParam", "hook", "ReplacementPerson", [], []); // stepKey: createPersonParam $I->comment("Entering Action Group [beforeGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1BeforeGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2BeforeGroup $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); + $I->comment('[END BEFORE HOOK]'); } /** @@ -42,10 +44,12 @@ class MergedActionGroupReturningValueTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->comment("Entering Action Group [afterGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/MergedActionGroupTest.txt b/dev/tests/verification/Resources/MergedActionGroupTest.txt index e1a67c144..a4abf2820 100644 --- a/dev/tests/verification/Resources/MergedActionGroupTest.txt +++ b/dev/tests/verification/Resources/MergedActionGroupTest.txt @@ -29,11 +29,13 @@ class MergedActionGroupTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createPersonParam", "hook", "ReplacementPerson", [], []); // stepKey: createPersonParam $I->comment("Entering Action Group [beforeGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1BeforeGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2BeforeGroup $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); + $I->comment('[END BEFORE HOOK]'); } /** @@ -42,10 +44,12 @@ class MergedActionGroupTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->comment("Entering Action Group [afterGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/MergedReferencesTest.txt b/dev/tests/verification/Resources/MergedReferencesTest.txt index d020c3466..40c9b3cdb 100644 --- a/dev/tests/verification/Resources/MergedReferencesTest.txt +++ b/dev/tests/verification/Resources/MergedReferencesTest.txt @@ -30,7 +30,9 @@ class MergedReferencesTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->amOnPage("/beforeUrl"); // stepKey: before1 + $I->comment('[END BEFORE HOOK]'); } /** @@ -39,7 +41,9 @@ class MergedReferencesTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->amOnPage("/afterUrl"); // stepKey: after1 + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/MultipleActionGroupsTest.txt b/dev/tests/verification/Resources/MultipleActionGroupsTest.txt index bcc0f31e0..02ffcdf84 100644 --- a/dev/tests/verification/Resources/MultipleActionGroupsTest.txt +++ b/dev/tests/verification/Resources/MultipleActionGroupsTest.txt @@ -29,11 +29,13 @@ class MultipleActionGroupsTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createPersonParam", "hook", "ReplacementPerson", [], []); // stepKey: createPersonParam $I->comment("Entering Action Group [beforeGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1BeforeGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2BeforeGroup $I->comment("Exiting Action Group [beforeGroup] FunctionalActionGroup"); + $I->comment('[END BEFORE HOOK]'); } /** @@ -42,10 +44,12 @@ class MultipleActionGroupsTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->comment("Entering Action Group [afterGroup] FunctionalActionGroup"); $I->fillField("#foo", "myData1"); // stepKey: fillField1AfterGroup $I->fillField("#bar", "myData2"); // stepKey: fillField2AfterGroup $I->comment("Exiting Action Group [afterGroup] FunctionalActionGroup"); + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/ParentExtendedTest.txt b/dev/tests/verification/Resources/ParentExtendedTest.txt index 3c24988ac..a06efd830 100644 --- a/dev/tests/verification/Resources/ParentExtendedTest.txt +++ b/dev/tests/verification/Resources/ParentExtendedTest.txt @@ -30,7 +30,9 @@ class ParentExtendedTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->amOnPage("/beforeUrl"); // stepKey: beforeAmOnPageKey + $I->comment('[END BEFORE HOOK]'); } /** @@ -39,7 +41,9 @@ class ParentExtendedTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/dev/tests/verification/Resources/PersistedReplacementTest.txt b/dev/tests/verification/Resources/PersistedReplacementTest.txt index 2f0bde2ab..0763d5da2 100644 --- a/dev/tests/verification/Resources/PersistedReplacementTest.txt +++ b/dev/tests/verification/Resources/PersistedReplacementTest.txt @@ -28,7 +28,9 @@ class PersistedReplacementTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->createEntity("createData1", "hook", "ReplacementPerson", [], []); // stepKey: createData1 + $I->comment('[END BEFORE HOOK]'); } /** diff --git a/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt b/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt index b3b10a38b..43689fc0a 100644 --- a/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt +++ b/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt @@ -28,6 +28,7 @@ class PersistenceActionGroupAppendingTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->comment("Entering Action Group [ACTIONGROUPBEFORE] DataPersistenceAppendingActionGroup"); $I->createEntity("createDataACTIONGROUPBEFORE", "hook", "entity", [], []); // stepKey: createDataACTIONGROUPBEFORE $I->updateEntity("createDataACTIONGROUPBEFORE", "hook", "newEntity",[]); // stepKey: updateDataACTIONGROUPBEFORE @@ -35,6 +36,7 @@ class PersistenceActionGroupAppendingTestCest $I->getEntity("getDataACTIONGROUPBEFORE", "hook", "someEneity", [], null); // stepKey: getDataACTIONGROUPBEFORE $I->comment($I->retrieveEntityField('createData', 'field', 'hook')); $I->comment("Exiting Action Group [ACTIONGROUPBEFORE] DataPersistenceAppendingActionGroup"); + $I->comment('[END BEFORE HOOK]'); } /** diff --git a/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt b/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt index 6558daa74..4039b952f 100644 --- a/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt +++ b/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt @@ -28,11 +28,13 @@ class PersistenceCustomFieldsTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $createData1Fields['firstname'] = "Mac"; $createData1Fields['lastname'] = "Doe"; $I->createEntity("createData1", "hook", "DefaultPerson", [], $createData1Fields); // stepKey: createData1 $createData2Fields['firstname'] = $I->retrieveEntityField('createData1', 'firstname', 'hook'); $I->createEntity("createData2", "hook", "uniqueData", ["createData1"], $createData2Fields); // stepKey: createData2 + $I->comment('[END BEFORE HOOK]'); } /** diff --git a/dev/tests/verification/Resources/XmlCommentedTest.txt b/dev/tests/verification/Resources/XmlCommentedTest.txt index d3c11d781..26563b7f4 100644 --- a/dev/tests/verification/Resources/XmlCommentedTest.txt +++ b/dev/tests/verification/Resources/XmlCommentedTest.txt @@ -29,9 +29,11 @@ class XmlCommentedTestCest */ public function _before(AcceptanceTester $I) { + $I->comment('[START BEFORE HOOK]'); $I->comment("< > & \$abc \" abc ' /"); $I->amOnPage("/beforeUrl"); // stepKey: beforeAmOnPageKey $I->comment("< > & \$abc \" abc ' /"); + $I->comment('[END BEFORE HOOK]'); } /** @@ -40,9 +42,11 @@ class XmlCommentedTestCest */ public function _after(AcceptanceTester $I) { + $I->comment('[START AFTER HOOK]'); $I->comment("< > & \$abc \" abc ' /"); $I->amOnPage("/afterUrl"); // stepKey: afterAmOnPageKey $I->comment("< > & \$abc \" abc ' /"); + $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { unlink(__FILE__); } diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 06c32ea03..bb9dc6978 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1770,29 +1770,29 @@ private function generateHooksPhp($hookObjects) throw new TestReferenceException($e->getMessage() . " in Element \"" . $type . "\""); } - if ($type == 'before') { - $steps = sprintf( - "\t\t$%s->comment('[%s]');" . PHP_EOL, - 'I', - 'START BEFORE HOOK' - ) . $steps; - $steps = $steps . sprintf( - "\t\t$%s->comment('[%s]');" . PHP_EOL, - 'I', - 'END BEFORE HOOK' + if ($type === 'before' && $steps) { + $steps = sprintf( + "\t\t$%s->comment('[%s]');" . PHP_EOL, + 'I', + 'START BEFORE HOOK' + ) . $steps; + $steps = $steps . sprintf( + "\t\t$%s->comment('[%s]');" . PHP_EOL, + 'I', + 'END BEFORE HOOK' ); } - if ($type == 'after') { - $steps = sprintf( - "\t\t$%s->comment('[%s]');" . PHP_EOL, - 'I', - 'START AFTER HOOK' + if ($type === 'after' && $steps) { + $steps = sprintf( + "\t\t$%s->comment('[%s]');" . PHP_EOL, + 'I', + 'START AFTER HOOK' ) . $steps; - $steps = $steps . sprintf( - "\t\t$%s->comment('[%s]');" . PHP_EOL, - 'I', - 'END AFTER HOOK' + $steps = $steps . sprintf( + "\t\t$%s->comment('[%s]');" . PHP_EOL, + 'I', + 'END AFTER HOOK' ); } From 3608a7f58dbc315747aa3a88c62af26efaa62bdd Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Sun, 6 Feb 2022 18:53:48 +0530 Subject: [PATCH 154/674] MQE-1677 : Static check for created data outside action group --- ...CreatedDataFromOutsideActionGroupCheck.php | 207 ++++++++++++++++++ .../StaticCheck/StaticChecksList.php | 4 +- 2 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php new file mode 100644 index 000000000..fadfe203f --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php @@ -0,0 +1,207 @@ +scriptUtil = new ScriptUtil(); + $this->loadAllXmlFiles($input); + $this->errors = []; + + $this->errors += $this->findReferenceErrorsInActionFiles($this->actionGroupXmlFiles); + + $this->output = $this->scriptUtil->printErrorsToFile( + $this->errors, + StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', + self::ERROR_LOG_MESSAGE + ); + } + + /** + * 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 Dependency errors found." + * + * @return string + */ + public function getOutput() + { + return $this->output; + } + + /** + * Read all XML files for scanning + * + * @param InputInterface $input + * @return void + * @throws Exception + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + private function loadAllXmlFiles($input) + { + $modulePaths = []; + $includeRootPath = true; + $path = $input->getOption('path'); + if ($path) { + if (!realpath($path)) { + throw new InvalidArgumentException('Invalid --path option: ' . $path); + } + MftfApplicationConfig::create( + true, + MftfApplicationConfig::UNIT_TEST_PHASE, + false, + MftfApplicationConfig::LEVEL_DEFAULT, + true + ); + $modulePaths[] = realpath($path); + $includeRootPath = false; + } else { + $modulePaths = $this->scriptUtil->getAllModulePaths(); + } + + // These files can contain references to other entities + $this->actionGroupXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'ActionGroup'); + + if (empty($this->actionGroupXmlFiles)) { + if ($path) { + throw new InvalidArgumentException( + 'Invalid --path option: ' + . $path + . PHP_EOL + . 'Please make sure --path points to a valid MFTF Test Module.' + ); + } elseif (empty($this->rootSuiteXmlFiles)) { + throw new TestFrameworkException('No xml file to scan.'); + } + } + } + + /** + * Find reference errors in set of action files + * + * @param Finder $files + * @return array + * @throws XmlException + */ + private function findReferenceErrorsInActionFiles($files) + { + $testErrors = []; + /** @var SplFileInfo $filePath */ + foreach ($files as $filePath) { + $contents = file_get_contents($filePath); + preg_match_all(self::ACTIONGROUP_REGEX_PATTERN, $contents, $actionGroupReferences); + if(count( $actionGroupReferences) > 0) { + $testErrors = array_merge($testErrors, $this->setErrorOutput($actionGroupReferences, $filePath)); + } + } + + return $testErrors; + } + + /** + * Build and return error output for violating references + * + * @param array $actionGroupReferences + * @param SplFileInfo $path + * @return mixed + */ + private function setErrorOutput( $actionGroupReferences , $path) + { + $testErrors = []; + $errorOutput = ""; + $filePath = StaticChecksList::getFilePath($path->getRealPath()); + + foreach($actionGroupReferences as $key => $actionGroupReferencesData) { + foreach($actionGroupReferencesData as $actionGroupReferencesDataResult) { + + $errorOutput .= "\nFile \"{$filePath}\" contains: ". "\n\t {$actionGroupReferencesDataResult} in {$filePath}"; + $testErrors[$filePath][] = $errorOutput; + } + + + } + return $testErrors; + } + +} diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php index 07c52ce8c..39b9ae748 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php @@ -18,6 +18,7 @@ class StaticChecksList implements StaticCheckListInterface { const DEPRECATED_ENTITY_USAGE_CHECK_NAME = 'deprecatedEntityUsage'; const PAUSE_ACTION_USAGE_CHECK_NAME = 'pauseActionUsage'; + const CREATED_DATA_FROM_OUTSIDE_ACTIONGROUP = 'createdDataFromOutsideActionGroup'; const STATIC_RESULTS = 'tests' . DIRECTORY_SEPARATOR .'_output' . DIRECTORY_SEPARATOR . 'static-results'; /** @@ -47,7 +48,8 @@ public function __construct(array $checks = []) 'actionGroupArguments' => new ActionGroupArgumentsCheck(), self::DEPRECATED_ENTITY_USAGE_CHECK_NAME => new DeprecatedEntityUsageCheck(), 'annotations' => new AnnotationsCheck(), - self::PAUSE_ACTION_USAGE_CHECK_NAME => new PauseActionUsageCheck() + self::PAUSE_ACTION_USAGE_CHECK_NAME => new PauseActionUsageCheck(), + self::CREATED_DATA_FROM_OUTSIDE_ACTIONGROUP => new CreatedDataFromOutsideActionGroupCheck() ] + $checks; // Static checks error files directory From 902fa7d7503472361df8eb8bd222ccf0b995d677 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Sun, 6 Feb 2022 19:39:03 +0530 Subject: [PATCH 155/674] MQE-1677 : Static check for created data outside action group --- ...CreatedDataFromOutsideActionGroupCheck.php | 284 +++++++++--------- 1 file changed, 139 insertions(+), 145 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php index fadfe203f..eec27b157 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php @@ -35,173 +35,167 @@ */ class CreatedDataFromOutsideActionGroupCheck implements StaticCheckInterface { - const ACTIONGROUP_REGEX_PATTERN = '/\$(\$)*([\w.]+)(\$)*\$/'; - - const ERROR_LOG_FILENAME = 'create-data-from-outside-action-group'; - const ERROR_LOG_MESSAGE = 'Created Data From Outside Action Group'; - - /** - * Array containing all errors found after running the execute() function - * - * @var array - */ - private $errors = []; - - /** - * String representing the output summary found after running the execute() function - * - * @var string - */ - private $output; - - /** - * ScriptUtil instance - * - * @var ScriptUtil - */ - private $scriptUtil; - - /** - * Action group xml files to scan - * - * @var Finder|array - */ - private $actionGroupXmlFiles = []; - - /** - * Checks test dependencies, determined by references in tests versus the dependencies listed in the Magento module - * - * @param InputInterface $input - * @return void - * @throws Exception - */ - public function execute(InputInterface $input) - { + const ACTIONGROUP_REGEX_PATTERN = '/\$(\$)*([\w.]+)(\$)*\$/'; + const ERROR_LOG_FILENAME = 'create-data-from-outside-action-group'; + const ERROR_LOG_MESSAGE = 'Created Data From Outside Action Group'; + + /** + * Array containing all errors found after running the execute() function + * + * @var array + */ + private $errors = []; + + /** + * String representing the output summary found after running the execute() function + * + * @var string + */ + private $output; + + /** + * ScriptUtil instance + * + * @var ScriptUtil + */ + private $scriptUtil; + + /** + * Action group xml files to scan + * + * @var Finder|array + */ + private $actionGroupXmlFiles = []; + + /** + * Checks test dependencies, determined by references in tests versus the dependencies listed in the Magento module + * + * @param InputInterface $input + * @return void + * @throws Exception + */ + public function execute(InputInterface $input) + { $this->scriptUtil = new ScriptUtil(); $this->loadAllXmlFiles($input); $this->errors = []; - $this->errors += $this->findReferenceErrorsInActionFiles($this->actionGroupXmlFiles); - $this->output = $this->scriptUtil->printErrorsToFile( $this->errors, StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', self::ERROR_LOG_MESSAGE ); - } - - /** - * 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 Dependency errors found." - * - * @return string - */ - public function getOutput() - { - return $this->output; - } + } - /** - * Read all XML files for scanning - * - * @param InputInterface $input - * @return void - * @throws Exception - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - private function loadAllXmlFiles($input) - { - $modulePaths = []; - $includeRootPath = true; - $path = $input->getOption('path'); - if ($path) { - if (!realpath($path)) { - throw new InvalidArgumentException('Invalid --path option: ' . $path); - } - MftfApplicationConfig::create( - true, - MftfApplicationConfig::UNIT_TEST_PHASE, - false, - MftfApplicationConfig::LEVEL_DEFAULT, - true - ); - $modulePaths[] = realpath($path); - $includeRootPath = false; - } else { - $modulePaths = $this->scriptUtil->getAllModulePaths(); + /** + * Return array containing all errors found after running the execute() function + * + * @return array + */ + public function getErrors() + { + return $this->errors; } - // These files can contain references to other entities - $this->actionGroupXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'ActionGroup'); - - if (empty($this->actionGroupXmlFiles)) { - if ($path) { - throw new InvalidArgumentException( - 'Invalid --path option: ' - . $path - . PHP_EOL - . 'Please make sure --path points to a valid MFTF Test Module.' - ); - } elseif (empty($this->rootSuiteXmlFiles)) { - throw new TestFrameworkException('No xml file to scan.'); - } + /** + * Return string of a short human readable result of the check. For example: "No Dependency errors found." + * + * @return string + */ + public function getOutput() + { + return $this->output; } - } - /** - * Find reference errors in set of action files - * - * @param Finder $files - * @return array - * @throws XmlException - */ - private function findReferenceErrorsInActionFiles($files) - { - $testErrors = []; - /** @var SplFileInfo $filePath */ - foreach ($files as $filePath) { - $contents = file_get_contents($filePath); - preg_match_all(self::ACTIONGROUP_REGEX_PATTERN, $contents, $actionGroupReferences); - if(count( $actionGroupReferences) > 0) { - $testErrors = array_merge($testErrors, $this->setErrorOutput($actionGroupReferences, $filePath)); + /** + * Read all XML files for scanning + * + * @param InputInterface $input + * @return void + * @throws Exception + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + private function loadAllXmlFiles($input) + { + $modulePaths = []; + $includeRootPath = true; + $path = $input->getOption('path'); + if ($path) { + if (!realpath($path)) { + throw new InvalidArgumentException('Invalid --path option: ' . $path); + } + MftfApplicationConfig::create( + true, + MftfApplicationConfig::UNIT_TEST_PHASE, + false, + MftfApplicationConfig::LEVEL_DEFAULT, + true + ); + $modulePaths[] = realpath($path); + $includeRootPath = false; + } else { + $modulePaths = $this->scriptUtil->getAllModulePaths(); + } + + // These files can contain references to other entities + $this->actionGroupXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'ActionGroup'); + + if (empty($this->actionGroupXmlFiles)) { + if ($path) { + throw new InvalidArgumentException( + 'Invalid --path option: ' + . $path + . PHP_EOL + . 'Please make sure --path points to a valid MFTF Test Module.' + ); + } elseif (empty($this->rootSuiteXmlFiles)) { + throw new TestFrameworkException('No xml file to scan.'); + } } } - return $testErrors; - } + /** + * Find reference errors in set of action files + * + * @param Finder $files + * @return array + * @throws XmlException + */ + private function findReferenceErrorsInActionFiles($files) + { + $testErrors = []; + /** @var SplFileInfo $filePath */ + foreach ($files as $filePath) { + $contents = file_get_contents($filePath); + preg_match_all(self::ACTIONGROUP_REGEX_PATTERN, $contents, $actionGroupReferences); + if (count($actionGroupReferences) > 0) { + $testErrors = array_merge($testErrors, $this->setErrorOutput($actionGroupReferences, $filePath)); + } + } + + return $testErrors; + } - /** - * Build and return error output for violating references - * - * @param array $actionGroupReferences - * @param SplFileInfo $path - * @return mixed - */ - private function setErrorOutput( $actionGroupReferences , $path) - { - $testErrors = []; + /** + * Build and return error output for violating references + * + * @param array $actionGroupReferences + * @param SplFileInfo $path + * @return mixed + */ + private function setErrorOutput($actionGroupReferences, $path) + { + $testErrors = []; $errorOutput = ""; $filePath = StaticChecksList::getFilePath($path->getRealPath()); - foreach($actionGroupReferences as $key => $actionGroupReferencesData) { - foreach($actionGroupReferencesData as $actionGroupReferencesDataResult) { - - $errorOutput .= "\nFile \"{$filePath}\" contains: ". "\n\t {$actionGroupReferencesDataResult} in {$filePath}"; - $testErrors[$filePath][] = $errorOutput; - } - - + foreach ($actionGroupReferences as $key => $actionGroupReferencesData) { + foreach ($actionGroupReferencesData as $actionGroupReferencesDataResult) { + $errorOutput .= "\nFile \"{$filePath}\" contains: ". "\n\t + {$actionGroupReferencesDataResult} in {$filePath}"; + $testErrors[$filePath][] = $errorOutput; + } } return $testErrors; } - } From a9ba4475283011af5d9e2d388aa91218672de658 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Sun, 6 Feb 2022 19:54:02 +0530 Subject: [PATCH 156/674] MQE-1677 : Static check for created data outside action group --- ...CreatedDataFromOutsideActionGroupCheck.php | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php index eec27b157..611e2946b 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php @@ -37,7 +37,7 @@ class CreatedDataFromOutsideActionGroupCheck implements StaticCheckInterface { const ACTIONGROUP_REGEX_PATTERN = '/\$(\$)*([\w.]+)(\$)*\$/'; const ERROR_LOG_FILENAME = 'create-data-from-outside-action-group'; - const ERROR_LOG_MESSAGE = 'Created Data From Outside Action Group'; + const ERROR_MESSAGE = 'Created Data From Outside Action Group'; /** * Array containing all errors found after running the execute() function @@ -60,13 +60,6 @@ class CreatedDataFromOutsideActionGroupCheck implements StaticCheckInterface */ private $scriptUtil; - /** - * Action group xml files to scan - * - * @var Finder|array - */ - private $actionGroupXmlFiles = []; - /** * Checks test dependencies, determined by references in tests versus the dependencies listed in the Magento module * @@ -79,11 +72,12 @@ public function execute(InputInterface $input) $this->scriptUtil = new ScriptUtil(); $this->loadAllXmlFiles($input); $this->errors = []; - $this->errors += $this->findReferenceErrorsInActionFiles($this->actionGroupXmlFiles); + $this->errors += $this->findReferenceErrorsInActionFiles($this->actionGroupXmlFile); + // hold on to the output and print any errors to a file $this->output = $this->scriptUtil->printErrorsToFile( $this->errors, StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', - self::ERROR_LOG_MESSAGE + self::ERROR_MESSAGE ); } @@ -118,7 +112,6 @@ public function getOutput() private function loadAllXmlFiles($input) { $modulePaths = []; - $includeRootPath = true; $path = $input->getOption('path'); if ($path) { if (!realpath($path)) { @@ -132,15 +125,14 @@ private function loadAllXmlFiles($input) true ); $modulePaths[] = realpath($path); - $includeRootPath = false; } else { $modulePaths = $this->scriptUtil->getAllModulePaths(); } // These files can contain references to other entities - $this->actionGroupXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'ActionGroup'); + $this->actionGroupXmlFile = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'ActionGroup'); - if (empty($this->actionGroupXmlFiles)) { + if (empty($this->actionGroupXmlFile)) { if ($path) { throw new InvalidArgumentException( 'Invalid --path option: ' From 51b6fadfb767f70e51f0dad7deede116e4535175 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Mon, 7 Feb 2022 10:27:54 +0530 Subject: [PATCH 157/674] Resolved conflicts --- .../Resources/DataActionsTest.txt | 2 ++ .../TestModule/Test/DataActionsTest.xml | 3 ++ .../Test/etc/Actions/dataActions.xsd | 28 +++++++++++++++---- .../Util/TestGenerator.php | 19 +++++++++---- 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/dev/tests/verification/Resources/DataActionsTest.txt b/dev/tests/verification/Resources/DataActionsTest.txt index cf4de53a3..95bb0631e 100644 --- a/dev/tests/verification/Resources/DataActionsTest.txt +++ b/dev/tests/verification/Resources/DataActionsTest.txt @@ -32,6 +32,8 @@ class DataActionsTestCest $I->createEntity("createdInBefore", "hook", "entity", [], []); // stepKey: createdInBefore $I->updateEntity("createdInBefore", "hook", "entity",[]); // stepKey: updateInBefore $I->deleteEntity("createdInBefore", "hook"); // stepKey: deleteInBefore + $customerFields['lastname'] = "foo61f90e3156e25"; + $I->createEntity("customer", "hook", "Simple_Customer_Without_Address", [], $customerFields); // stepKey: customer $I->comment('[END BEFORE HOOK]'); } diff --git a/dev/tests/verification/TestModule/Test/DataActionsTest.xml b/dev/tests/verification/TestModule/Test/DataActionsTest.xml index 2575c41b0..de3d8d0ab 100644 --- a/dev/tests/verification/TestModule/Test/DataActionsTest.xml +++ b/dev/tests/verification/TestModule/Test/DataActionsTest.xml @@ -13,6 +13,9 @@ + + foo + diff --git a/src/Magento/FunctionalTestingFramework/Test/etc/Actions/dataActions.xsd b/src/Magento/FunctionalTestingFramework/Test/etc/Actions/dataActions.xsd index 2cd614266..400cbf942 100644 --- a/src/Magento/FunctionalTestingFramework/Test/etc/Actions/dataActions.xsd +++ b/src/Magento/FunctionalTestingFramework/Test/etc/Actions/dataActions.xsd @@ -125,14 +125,32 @@ + - - field used to override defined fields from metadata or existing data definitions, during operation. - - + + + xp + Key attribute of data/value pair. + + + + + + + Add suite or test wide unique sequence as "prefix" or "suffix" to the data value if specified. + + + - \ No newline at end of file + + + + + + + + diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index bb9dc6978..fb7ad12a2 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -525,7 +525,11 @@ private function generateMethodAnnotations($annotationType = null, $annotationNa break; case null: - $annotationToAppend = ""; + $annotationToAppend = sprintf( + "{$indent} * @Parameter(name = \"%s\", value=\"$%s\")\n", + "AcceptanceTester", + "I" + ); $annotationToAppend .= sprintf("{$indent} * @param %s $%s\n", "AcceptanceTester", "I"); $annotationToAppend .= "{$indent} * @return void\n"; $annotationToAppend .= "{$indent} * @throws \Exception\n"; @@ -1462,11 +1466,14 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $actionObject->getActionOrigin() )[0]; $argRef = "\t\t\$"; - $input = $this->resolveAllRuntimeReferences([$input])[0]; + if (isset($actionObject->getCustomActionAttributes()['unique'])) { + $input = ($actionObject->getCustomActionAttributes()['unique'] == 'prefix') + ? '"'.uniqid().str_replace('"', '', $input).'"' + : '"'.str_replace('"', '', $input).uniqid().'"'; + } $argRef .= str_replace(ucfirst($fieldKey), "", $stepKey) . "Fields['{$fieldKey}'] = ${input};"; - $testSteps .= $argRef; break; case "generateDate": @@ -1801,7 +1808,7 @@ private function generateHooksPhp($hookObjects) $hooks .= $steps; if ($type === 'after') { $hooks .= "\t\t" . 'if ($this->isSuccess) {' . "\n"; - $hooks .= "\t\t\t" . 'unlink(__FILE__);' . "\n"; +// $hooks .= "\t\t\t" . 'unlink(__FILE__);' . "\n"; $hooks .= "\t\t" . '}' . "\n"; } $hooks .= "\t}\n\n"; @@ -1841,7 +1848,7 @@ private function generateTestPhp($test) } else { $skipString .= "No issues have been specified."; } - $steps = "\t\t" . 'unlink(__FILE__);' . "\n"; +// $steps = "\t\t" . 'unlink(__FILE__);' . "\n"; $steps .= "\t\t" . '$scenario->skip("' . $skipString . '");' . "\n"; $dependencies .= ', \Codeception\Scenario $scenario'; } @@ -1861,6 +1868,8 @@ private function generateTestPhp($test) $testPhp .= "\t}\n"; } + echo $testPhp; + exit; return $testPhp; } From 9c7b1eafffb1eab1ad84c4f373bc0d7c1593cebe Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Tue, 1 Feb 2022 16:22:17 +0530 Subject: [PATCH 158/674] MQE-2021 : Added new attribute unique --- dev/tests/verification/Resources/DataActionsTest.txt | 2 +- dev/tests/verification/TestModule/Test/DataActionsTest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/verification/Resources/DataActionsTest.txt b/dev/tests/verification/Resources/DataActionsTest.txt index 95bb0631e..4e675b192 100644 --- a/dev/tests/verification/Resources/DataActionsTest.txt +++ b/dev/tests/verification/Resources/DataActionsTest.txt @@ -32,7 +32,7 @@ class DataActionsTestCest $I->createEntity("createdInBefore", "hook", "entity", [], []); // stepKey: createdInBefore $I->updateEntity("createdInBefore", "hook", "entity",[]); // stepKey: updateInBefore $I->deleteEntity("createdInBefore", "hook"); // stepKey: deleteInBefore - $customerFields['lastname'] = "foo61f90e3156e25"; + $customerFields['firstname'] = "foo61f90e3156e25"; $I->createEntity("customer", "hook", "Simple_Customer_Without_Address", [], $customerFields); // stepKey: customer $I->comment('[END BEFORE HOOK]'); } diff --git a/dev/tests/verification/TestModule/Test/DataActionsTest.xml b/dev/tests/verification/TestModule/Test/DataActionsTest.xml index de3d8d0ab..f974ec2b1 100644 --- a/dev/tests/verification/TestModule/Test/DataActionsTest.xml +++ b/dev/tests/verification/TestModule/Test/DataActionsTest.xml @@ -14,7 +14,7 @@ - foo + foo From cb019081ec51d8728142eb90bfef6a69a1415c38 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Tue, 1 Feb 2022 16:24:52 +0530 Subject: [PATCH 159/674] MQE-2021 : Added new attribute unique --- .../FunctionalTestingFramework/Util/TestGenerator.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index fb7ad12a2..ed48b5906 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1808,7 +1808,7 @@ private function generateHooksPhp($hookObjects) $hooks .= $steps; if ($type === 'after') { $hooks .= "\t\t" . 'if ($this->isSuccess) {' . "\n"; -// $hooks .= "\t\t\t" . 'unlink(__FILE__);' . "\n"; + $hooks .= "\t\t\t" . 'unlink(__FILE__);' . "\n"; $hooks .= "\t\t" . '}' . "\n"; } $hooks .= "\t}\n\n"; @@ -1848,7 +1848,7 @@ private function generateTestPhp($test) } else { $skipString .= "No issues have been specified."; } -// $steps = "\t\t" . 'unlink(__FILE__);' . "\n"; + $steps = "\t\t" . 'unlink(__FILE__);' . "\n"; $steps .= "\t\t" . '$scenario->skip("' . $skipString . '");' . "\n"; $dependencies .= ', \Codeception\Scenario $scenario'; } @@ -1868,8 +1868,6 @@ private function generateTestPhp($test) $testPhp .= "\t}\n"; } - echo $testPhp; - exit; return $testPhp; } From d0cf06ecc10806cd318bdbc4c1ec2c25f7369f01 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Tue, 1 Feb 2022 16:27:56 +0530 Subject: [PATCH 160/674] MQE-2021 : Added new attribute unique --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index ed48b5906..1e57e8ef8 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1808,7 +1808,7 @@ private function generateHooksPhp($hookObjects) $hooks .= $steps; if ($type === 'after') { $hooks .= "\t\t" . 'if ($this->isSuccess) {' . "\n"; - $hooks .= "\t\t\t" . 'unlink(__FILE__);' . "\n"; + $hooks .= "\t\t\t" . 'unlink(__FILE__);' . "\n"; $hooks .= "\t\t" . '}' . "\n"; } $hooks .= "\t}\n\n"; From bbed911a46b052781d8f291b291824b3d6163d62 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Tue, 1 Feb 2022 16:29:11 +0530 Subject: [PATCH 161/674] MQE-2021 : Added new attribute unique --- .../FunctionalTestingFramework/Util/TestGenerator.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 1e57e8ef8..e6187beea 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -525,11 +525,7 @@ private function generateMethodAnnotations($annotationType = null, $annotationNa break; case null: - $annotationToAppend = sprintf( - "{$indent} * @Parameter(name = \"%s\", value=\"$%s\")\n", - "AcceptanceTester", - "I" - ); + $annotationToAppend = ""; $annotationToAppend .= sprintf("{$indent} * @param %s $%s\n", "AcceptanceTester", "I"); $annotationToAppend .= "{$indent} * @return void\n"; $annotationToAppend .= "{$indent} * @throws \Exception\n"; From caf6ec26bf4f9cd233421000126122ffb8b9d82c Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Tue, 1 Feb 2022 16:32:48 +0530 Subject: [PATCH 162/674] MQE-2021 : Added new attribute unique --- dev/tests/verification/Resources/DataActionsTest.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/verification/Resources/DataActionsTest.txt b/dev/tests/verification/Resources/DataActionsTest.txt index 4e675b192..acfe544cf 100644 --- a/dev/tests/verification/Resources/DataActionsTest.txt +++ b/dev/tests/verification/Resources/DataActionsTest.txt @@ -32,7 +32,7 @@ class DataActionsTestCest $I->createEntity("createdInBefore", "hook", "entity", [], []); // stepKey: createdInBefore $I->updateEntity("createdInBefore", "hook", "entity",[]); // stepKey: updateInBefore $I->deleteEntity("createdInBefore", "hook"); // stepKey: deleteInBefore - $customerFields['firstname'] = "foo61f90e3156e25"; + $customerFields['firstname'] = "foo61f9129fd15f1"; $I->createEntity("customer", "hook", "Simple_Customer_Without_Address", [], $customerFields); // stepKey: customer $I->comment('[END BEFORE HOOK]'); } From 2702caebb08e608286b321e8b31b87b3a3780fd0 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Tue, 1 Feb 2022 17:22:44 +0530 Subject: [PATCH 163/674] MQE-2021 : Added new attribute unique --- dev/tests/verification/Resources/DataActionsTest.txt | 2 +- dev/tests/verification/TestModule/Test/DataActionsTest.xml | 4 ++-- .../Test/etc/Actions/dataActions.xsd | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dev/tests/verification/Resources/DataActionsTest.txt b/dev/tests/verification/Resources/DataActionsTest.txt index acfe544cf..12fe3e979 100644 --- a/dev/tests/verification/Resources/DataActionsTest.txt +++ b/dev/tests/verification/Resources/DataActionsTest.txt @@ -32,7 +32,7 @@ class DataActionsTestCest $I->createEntity("createdInBefore", "hook", "entity", [], []); // stepKey: createdInBefore $I->updateEntity("createdInBefore", "hook", "entity",[]); // stepKey: updateInBefore $I->deleteEntity("createdInBefore", "hook"); // stepKey: deleteInBefore - $customerFields['firstname'] = "foo61f9129fd15f1"; + $customerFields['lastname'] = "foo"; $I->createEntity("customer", "hook", "Simple_Customer_Without_Address", [], $customerFields); // stepKey: customer $I->comment('[END BEFORE HOOK]'); } diff --git a/dev/tests/verification/TestModule/Test/DataActionsTest.xml b/dev/tests/verification/TestModule/Test/DataActionsTest.xml index f974ec2b1..d7a2d205b 100644 --- a/dev/tests/verification/TestModule/Test/DataActionsTest.xml +++ b/dev/tests/verification/TestModule/Test/DataActionsTest.xml @@ -14,7 +14,7 @@ - foo + foo @@ -26,4 +26,4 @@ - + \ No newline at end of file diff --git a/src/Magento/FunctionalTestingFramework/Test/etc/Actions/dataActions.xsd b/src/Magento/FunctionalTestingFramework/Test/etc/Actions/dataActions.xsd index 400cbf942..003760bfc 100644 --- a/src/Magento/FunctionalTestingFramework/Test/etc/Actions/dataActions.xsd +++ b/src/Magento/FunctionalTestingFramework/Test/etc/Actions/dataActions.xsd @@ -129,7 +129,7 @@ - + xp Key attribute of data/value pair. From a43787f5804af914a3a598f3ad3a4513227d2fca Mon Sep 17 00:00:00 2001 From: glo00108 Date: Tue, 8 Feb 2022 12:28:34 +0530 Subject: [PATCH 164/674] remove redudant file --- .../Handlers/SecretStorage/FileStorageTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php index 672de5a21..3d5922f9e 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/FileStorageTest.php @@ -23,7 +23,7 @@ public function testBasicEncryptDecrypt(): void { $testKey = 'magento/myKey'; $testValue = 'myValue'; - $creds = ["$testKey=$testValue"]; + $cred = ["$testKey=$testValue"]; $fileStorage = new FileStorage(); $reflection = new ReflectionClass(FileStorage::class); @@ -31,7 +31,7 @@ public function testBasicEncryptDecrypt(): void // Emulate initialize() function result with the test credentials $reflectionMethod = $reflection->getMethod('encryptCredFileContents'); $reflectionMethod->setAccessible(true); - $secretData = $reflectionMethod->invokeArgs($fileStorage, [$creds]); + $secretData = $reflectionMethod->invokeArgs($fileStorage, [$cred]); // Set encrypted test credentials to the private 'secretData' property $reflectionProperty = $reflection->getProperty('secretData'); @@ -59,7 +59,7 @@ public function testEmptyValueEncryptDecrypt(): void $this->expectException(TestFrameworkException::class); $testKey = 'magento/myKey'; - $creds = ["$testKey"]; + $cred = ["$testKey"]; $fileStorage = new FileStorage(); $reflection = new ReflectionClass(FileStorage::class); @@ -67,7 +67,7 @@ public function testEmptyValueEncryptDecrypt(): void // Emulate initialize() function result with the test credentials $reflectionMethod = $reflection->getMethod('encryptCredFileContents'); $reflectionMethod->setAccessible(true); - $secretData = $reflectionMethod->invokeArgs($fileStorage, [$creds]); + $secretData = $reflectionMethod->invokeArgs($fileStorage, [$cred]); // Set encrypted test credentials to the private 'secretData' property $reflectionProperty = $reflection->getProperty('secretData'); From e8095204ec90015eb83dad82aca70bd587019134 Mon Sep 17 00:00:00 2001 From: glo00108 Date: Tue, 8 Feb 2022 12:37:54 +0530 Subject: [PATCH 165/674] add check for null values --- .../Page/Objects/ElementObject.php | 2 +- .../Util/TestGenerator.php | 20 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Page/Objects/ElementObject.php b/src/Magento/FunctionalTestingFramework/Page/Objects/ElementObject.php index f00ded056..262647b34 100644 --- a/src/Magento/FunctionalTestingFramework/Page/Objects/ElementObject.php +++ b/src/Magento/FunctionalTestingFramework/Page/Objects/ElementObject.php @@ -85,7 +85,7 @@ public function __construct($name, $type, $selector, $locatorFunction, $timeout, $this->type = $type; $this->selector = $selector; $this->locatorFunction = $locatorFunction; - if (strpos($locatorFunction, "Locator::") === false) { + if ($locatorFunction !== null && strpos($locatorFunction, "Locator::") === false) { $this->locatorFunction = "Locator::" . $locatorFunction; } $this->timeout = $timeout; diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index c5368b779..00b78cb06 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -2097,18 +2097,20 @@ private function resolveRuntimeReference($args, $regex, $func) foreach ($args as $key => $arg) { $newArgs[$key] = $arg; - preg_match_all($regex, $arg, $matches); - if (!empty($matches[0])) { - foreach ($matches[0] as $matchKey => $fullMatch) { - $refVariable = $matches[1][$matchKey]; + if($arg !== null) { + preg_match_all($regex, $arg, $matches); + if (!empty($matches[0])) { + foreach ($matches[0] as $matchKey => $fullMatch) { + $refVariable = $matches[1][$matchKey]; - $replacement = $this->getReplacement($func, $refVariable); + $replacement = $this->getReplacement($func, $refVariable); - $outputArg = $this->processQuoteBreaks($fullMatch, $newArgs[$key], $replacement); - $newArgs[$key] = $outputArg; + $outputArg = $this->processQuoteBreaks($fullMatch, $newArgs[$key], $replacement); + $newArgs[$key] = $outputArg; + } + unset($matches); + continue; } - unset($matches); - continue; } } From c0eb49596cd76e6ebbcddb90dc20f32d920cfa62 Mon Sep 17 00:00:00 2001 From: glo00108 Date: Tue, 8 Feb 2022 12:45:56 +0530 Subject: [PATCH 166/674] add check for null values --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 00b78cb06..e546cd1d2 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -2097,7 +2097,7 @@ private function resolveRuntimeReference($args, $regex, $func) foreach ($args as $key => $arg) { $newArgs[$key] = $arg; - if($arg !== null) { + if ($arg !== null) { preg_match_all($regex, $arg, $matches); if (!empty($matches[0])) { foreach ($matches[0] as $matchKey => $fullMatch) { From ad0078d832186c916ee7c0c124c0ddf93b42a360 Mon Sep 17 00:00:00 2001 From: glo00108 Date: Tue, 8 Feb 2022 12:56:18 +0530 Subject: [PATCH 167/674] MQE-2668: Some MFTF tests fail without access to S3 --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index bb9dc6978..bfd218e57 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -258,6 +258,7 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) */ public function assembleTestPhp($testObject) { + $this->customHelpers = []; $usePhp = $this->generateUseStatementsPhp(); $className = $testObject->getCodeceptionName(); From 1bb3e5e6d1ebfd448f2ec0406e1b8333848737e0 Mon Sep 17 00:00:00 2001 From: "Mohit.k.Sharma" Date: Wed, 9 Feb 2022 15:45:42 +0530 Subject: [PATCH 168/674] MQE-1693 | Ability To Run MFTF JSON Configuration From File --- .../Console/GenerateTestsCommand.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index b277f9c4e..257189d83 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -128,6 +128,10 @@ protected function execute(InputInterface $input, OutputInterface $output) return 1; } + if ($json !== null && is_file($json)) { + $json = file_get_contents($json); + } + if (!empty($tests)) { $json = $this->getTestAndSuiteConfiguration($tests); } From aef58fa766c421af2ac0667eae178391ca1d477e Mon Sep 17 00:00:00 2001 From: "Mohit.k.Sharma" Date: Fri, 11 Feb 2022 09:39:36 +0530 Subject: [PATCH 169/674] MQE-1693 | Ability To Run MFTF JSON Configuration From File --- .../Console/GenerateTestsCommand.php | 2 +- .../Console/RunTestCommand.php | 25 ++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index 257189d83..15ab977c9 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -69,7 +69,7 @@ protected function configure() 'tests', 't', InputOption::VALUE_REQUIRED, - 'A parameter accepting a JSON string used to determine the test configuration' + 'A parameter accepting a JSON string or JSON file path used to determine the test configuration' )->addOption( 'filter', null, diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php index 096c6794c..10c48c579 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php @@ -40,15 +40,19 @@ protected function configure() ->setDescription("generation and execution of test(s) defined in xml") ->addArgument( 'name', - InputArgument::REQUIRED | InputArgument::IS_ARRAY, + InputArgument::OPTIONAL | InputArgument::IS_ARRAY, "name of tests to generate and execute" )->addOption( 'skip-generate', 'k', InputOption::VALUE_NONE, "skip generation and execute existing test" + )->addOption( + 'tests', + 't', + InputOption::VALUE_REQUIRED, + 'A parameter accepting a JSON string or JSON file path used to determine the test configuration' ); - parent::configure(); } @@ -63,6 +67,7 @@ protected function configure() protected function execute(InputInterface $input, OutputInterface $output): int { $tests = $input->getArgument('name'); + $json = $input->getOption('tests'); // for backward compatibility $skipGeneration = $input->getOption('skip-generate'); $force = $input->getOption('force'); $remove = $input->getOption('remove'); @@ -86,7 +91,18 @@ protected function execute(InputInterface $input, OutputInterface $output): int $allowSkipped ); - $testConfiguration = $this->getTestAndSuiteConfiguration($tests); + if ($json !== null && is_file($json)) { + $testConfiguration = file_get_contents($json); + } + + if (!empty($tests)) { + $testConfiguration = $this->getTestAndSuiteConfiguration($tests); + } + + if ($testConfiguration !== null && !json_decode($testConfiguration)) { + // stop execution if we have failed to properly parse any json passed in by the user + throw new TestFrameworkException("JSON could not be parsed: " . json_last_error_msg()); + } $generationErrorCode = 0; @@ -98,7 +114,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int '--remove' => $remove, '--debug' => $debug, '--allow-skipped' => $allowSkipped, - '-v' => $verbose + '-v' => $verbose, + '' ]; $command->run(new ArrayInput($args), $output); From 2e1b1a2bcee74a7cc23e0465df15e3649e540766 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Sun, 13 Feb 2022 12:28:57 +0530 Subject: [PATCH 170/674] MQE-2021 : Added unit test --- .../Util/TestGeneratorTest.php | 60 +++++++++++++++++++ .../Util/TestGenerator.php | 23 +++++-- 2 files changed, 78 insertions(+), 5 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 217cf7f09..a40959db3 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -88,6 +88,66 @@ public function testEntityException(): void $this->assertArrayHasKey('sampleTest', $testErrors); } + /** + * Basic test to check unique id is appended to input as prefix + * + * @return void + * @throws Exception + */ + public function testUniqueIdAppendedToInputStringAsPrefix() + { + $actionObject = new ActionObject('fakeAction', 'comment', [ + 'userInput' => '{{someEntity.entity}}' + ]); + + $testObject = new TestObject('sampleTest', ['merge123' => $actionObject], [], [], 'filename'); + $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $testObject]); + + $result = $testGeneratorObject->getUniqueIdForInput('prefix' , "foo"); + + $this->assertMatchesRegularExpression('/[A-Za-z0-9]+foo/' ,$result ); + } + + /** + * Basic test to check unique id is appended to input as suffix + * + * @return void + * @throws Exception + */ + public function testUniqueIdAppendedToInputStringAsSuffix() + { + $actionObject = new ActionObject('fakeAction', 'comment', [ + 'userInput' => '{{someEntity.entity}}' + ]); + + $testObject = new TestObject('sampleTest', ['merge123' => $actionObject], [], [], 'filename'); + $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $testObject]); + + $result = $testGeneratorObject->getUniqueIdForInput('suffix' , "foo"); + + $this->assertMatchesRegularExpression('/foo[A-Za-z0-9]+/' ,$result ); + } + + /** + * Basic test for wrong output for input + * + * @return void + * @throws Exception + */ + public function testFailedRegexForUniqueAttribute() + { + $actionObject = new ActionObject('fakeAction', 'comment', [ + 'userInput' => '{{someEntity.entity}}' + ]); + + $testObject = new TestObject('sampleTest', ['merge123' => $actionObject], [], [], 'filename'); + $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $testObject]); + + $result = $testGeneratorObject->getUniqueIdForInput('suffix' , "foo"); + + $this->assertDoesNotMatchRegularExpression('/bar[A-Za-z0-9]+/' ,$result ); + } + /** * Tests that skipped tests do not have a fully generated body. * diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index e6187beea..9773079df 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1463,11 +1463,9 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato )[0]; $argRef = "\t\t\$"; $input = $this->resolveAllRuntimeReferences([$input])[0]; - if (isset($actionObject->getCustomActionAttributes()['unique'])) { - $input = ($actionObject->getCustomActionAttributes()['unique'] == 'prefix') - ? '"'.uniqid().str_replace('"', '', $input).'"' - : '"'.str_replace('"', '', $input).uniqid().'"'; - } + $input = (isset($actionObject->getCustomActionAttributes()['unique'])) ? + $this->getUniqueIdForInput( $actionObject->getCustomActionAttributes()['unique'], $input) + : $input; $argRef .= str_replace(ucfirst($fieldKey), "", $stepKey) . "Fields['{$fieldKey}'] = ${input};"; $testSteps .= $argRef; @@ -1516,6 +1514,21 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato return $testSteps; } + /** + * Get unique value appended to input string + * + * @param string $uniqueValue + * @param string $input + * @return string + */ + public function getUniqueIdForInput( $uniqueValue, $input) + { + $input = ( $uniqueValue == 'prefix') + ? '"'.uniqid().str_replace('"', '', $input).'"' + : '"'.str_replace('"', '', $input).uniqid().'"'; + return $input; + } + /** * Resolves Locator:: in given $attribute if it is found. * From b91f3a3e399e4c5f4be1e6f7bcda689b2f0d4322 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Sun, 13 Feb 2022 12:31:50 +0530 Subject: [PATCH 171/674] MQE-2021 : Added unit test --- .../FunctionalTestingFramework/Util/TestGenerator.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 9773079df..c4748ee81 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1464,7 +1464,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $argRef = "\t\t\$"; $input = $this->resolveAllRuntimeReferences([$input])[0]; $input = (isset($actionObject->getCustomActionAttributes()['unique'])) ? - $this->getUniqueIdForInput( $actionObject->getCustomActionAttributes()['unique'], $input) + $this->getUniqueIdForInput($actionObject->getCustomActionAttributes()['unique'], $input) : $input; $argRef .= str_replace(ucfirst($fieldKey), "", $stepKey) . "Fields['{$fieldKey}'] = ${input};"; @@ -1521,9 +1521,9 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato * @param string $input * @return string */ - public function getUniqueIdForInput( $uniqueValue, $input) + public function getUniqueIdForInput( $uniqueValue, $input) { - $input = ( $uniqueValue == 'prefix') + $input = ($uniqueValue == 'prefix') ? '"'.uniqid().str_replace('"', '', $input).'"' : '"'.str_replace('"', '', $input).uniqid().'"'; return $input; From 37e51717cc6750cb1481f90a5e65272a5615631f Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Sun, 13 Feb 2022 12:33:04 +0530 Subject: [PATCH 172/674] MQE-2021 : Added unit test --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index c4748ee81..cd6544f82 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1521,7 +1521,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato * @param string $input * @return string */ - public function getUniqueIdForInput( $uniqueValue, $input) + public function getUniqueIdForInput($uniqueValue, $input) { $input = ($uniqueValue == 'prefix') ? '"'.uniqid().str_replace('"', '', $input).'"' From 01e7b4f1ec8c38217eca915ce332d6c988b7b046 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Sun, 13 Feb 2022 12:38:13 +0530 Subject: [PATCH 173/674] MQE-2021 : Added unit test --- .../Util/TestGeneratorTest.php | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index a40959db3..d59811d4a 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -103,9 +103,9 @@ public function testUniqueIdAppendedToInputStringAsPrefix() $testObject = new TestObject('sampleTest', ['merge123' => $actionObject], [], [], 'filename'); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $testObject]); - $result = $testGeneratorObject->getUniqueIdForInput('prefix' , "foo"); + $result = $testGeneratorObject->getUniqueIdForInput('prefix', "foo"); - $this->assertMatchesRegularExpression('/[A-Za-z0-9]+foo/' ,$result ); + $this->assertMatchesRegularExpression('/[A-Za-z0-9]+foo/', $result); } /** @@ -123,17 +123,17 @@ public function testUniqueIdAppendedToInputStringAsSuffix() $testObject = new TestObject('sampleTest', ['merge123' => $actionObject], [], [], 'filename'); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $testObject]); - $result = $testGeneratorObject->getUniqueIdForInput('suffix' , "foo"); + $result = $testGeneratorObject->getUniqueIdForInput('suffix', "foo"); - $this->assertMatchesRegularExpression('/foo[A-Za-z0-9]+/' ,$result ); + $this->assertMatchesRegularExpression('/foo[A-Za-z0-9]+/', $result); } /** - * Basic test for wrong output for input - * - * @return void - * @throws Exception - */ + * Basic test for wrong output for input + * + * @return void + * @throws Exception + */ public function testFailedRegexForUniqueAttribute() { $actionObject = new ActionObject('fakeAction', 'comment', [ @@ -143,9 +143,9 @@ public function testFailedRegexForUniqueAttribute() $testObject = new TestObject('sampleTest', ['merge123' => $actionObject], [], [], 'filename'); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $testObject]); - $result = $testGeneratorObject->getUniqueIdForInput('suffix' , "foo"); + $result = $testGeneratorObject->getUniqueIdForInput('suffix', "foo"); - $this->assertDoesNotMatchRegularExpression('/bar[A-Za-z0-9]+/' ,$result ); + $this->assertDoesNotMatchRegularExpression('/bar[A-Za-z0-9]+/', $result); } /** From daa2742464bb9fea0e1e1d0c20d8f5b2a387277f Mon Sep 17 00:00:00 2001 From: "Mohit.k.Sharma" Date: Mon, 14 Feb 2022 09:30:03 +0530 Subject: [PATCH 174/674] Static Checks Error Fix --- .../Console/RunTestCommand.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php index 10c48c579..cf58bc050 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php @@ -20,6 +20,9 @@ use Symfony\Component\Process\Process; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; +/** + * @SuppressWarnings(PHPMD) + */ class RunTestCommand extends BaseGenerateCommand { /** @@ -91,8 +94,12 @@ protected function execute(InputInterface $input, OutputInterface $output): int $allowSkipped ); - if ($json !== null && is_file($json)) { - $testConfiguration = file_get_contents($json); + if ($json !== null) { + if (is_file($json)) { + $testConfiguration = file_get_contents($json); + } else { + $testConfiguration = $json; + } } if (!empty($tests)) { From 64b13bc64140f0ebdc9f742a3487909607f01d40 Mon Sep 17 00:00:00 2001 From: Jonatan Santos Date: Tue, 15 Feb 2022 19:38:59 -0300 Subject: [PATCH 175/674] Fix #885 - Implement correct params on Vault PHP lib call --- composer.json | 1 + composer.lock | 95 ++++++++++++++++++- .../Handlers/SecretStorage/VaultStorage.php | 20 ++-- .../SecretStorage/VaultTokenAuthStrategy.php | 2 +- 4 files changed, 108 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 9a7757c5d..b6c0a5d88 100755 --- a/composer.json +++ b/composer.json @@ -24,6 +24,7 @@ "composer/composer": "^1.9||^2.0", "csharpru/vault-php": "^4.2.1", "guzzlehttp/guzzle": "^7.3.0", + "laminas/laminas-diactoros": "^2.8", "monolog/monolog": "^2.3", "mustache/mustache": "~2.5", "nikic/php-parser": "^4.4", diff --git a/composer.lock b/composer.lock index 8000882be..d3c3432f1 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": "35ff8c71326b9f8ab0885c8b55dd59cf", + "content-hash": "1fbed16ee8423681934f65424c9d0374", "packages": [ { "name": "allure-framework/allure-codeception", @@ -2141,6 +2141,97 @@ }, "time": "2021-07-22T09:24:00+00:00" }, + { + "name": "laminas/laminas-diactoros", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-diactoros.git", + "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/0c26ef1d95b6d7e6e3943a243ba3dc0797227199", + "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199", + "shasum": "" + }, + "require": { + "php": "^7.3 || ~8.0.0 || ~8.1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0" + }, + "conflict": { + "phpspec/prophecy": "<1.9.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "ext-dom": "*", + "ext-gd": "*", + "ext-libxml": "*", + "http-interop/http-factory-tests": "^0.8.0", + "laminas/laminas-coding-standard": "~1.0.0", + "php-http/psr7-integration-tests": "^1.1", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.1", + "psalm/plugin-phpunit": "^0.14.0", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "extra": { + "laminas": { + "config-provider": "Laminas\\Diactoros\\ConfigProvider", + "module": "Laminas\\Diactoros" + } + }, + "autoload": { + "files": [ + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/marshal_uri_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php", + "src/functions/create_uploaded_file.legacy.php", + "src/functions/marshal_headers_from_sapi.legacy.php", + "src/functions/marshal_method_from_sapi.legacy.php", + "src/functions/marshal_protocol_version_from_sapi.legacy.php", + "src/functions/marshal_uri_from_sapi.legacy.php", + "src/functions/normalize_server.legacy.php", + "src/functions/normalize_uploaded_files.legacy.php", + "src/functions/parse_cookie_header.legacy.php" + ], + "psr-4": { + "Laminas\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR HTTP Message implementations", + "homepage": "https://laminas.dev", + "keywords": [ + "http", + "laminas", + "psr", + "psr-17", + "psr-7" + ], + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2021-09-22T03:54:36+00:00" + }, { "name": "monolog/monolog", "version": "2.3.5", @@ -7800,5 +7891,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "2.1.0" + "plugin-api-version": "1.1.0" } diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/VaultStorage.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/VaultStorage.php index cc0b3e7a8..7e307b30c 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/VaultStorage.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/VaultStorage.php @@ -6,6 +6,9 @@ namespace Magento\FunctionalTestingFramework\DataGenerator\Handlers\SecretStorage; +use Laminas\Diactoros\RequestFactory; +use Laminas\Diactoros\StreamFactory; +use Laminas\Diactoros\Uri; use GuzzleHttp\Client as GuzzleClient; use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; @@ -79,13 +82,16 @@ public function __construct($baseUrl, $secretBasePath) parent::__construct(); if (null === $this->client) { // client configuration and override http errors settings - $config = [ - 'timeout' => 15, - 'base_uri' => $baseUrl, - 'http_errors' => false - ]; - - $this->client = new Client(new GuzzleClient($config)); + $this->client = new Client( + new Uri($baseUrl), + new GuzzleClient([ + 'timeout' => 15, + 'base_uri' => $baseUrl, + 'http_errors' => false + ]), + new RequestFactory(), + new StreamFactory() + ); $this->secretBasePath = $secretBasePath; } $this->readVaultTokenFromFileSystem(); diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/VaultTokenAuthStrategy.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/VaultTokenAuthStrategy.php index 716344ca1..0f071216d 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/VaultTokenAuthStrategy.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/SecretStorage/VaultTokenAuthStrategy.php @@ -36,7 +36,7 @@ public function __construct($token) * @return Auth * @throws TestFrameworkException */ - public function authenticate() + public function authenticate(): ?Auth { try { return new Auth(['clientToken' => $this->token]); From 4ef9e51f33e1366df358ec5149fbcdbcfe48997c Mon Sep 17 00:00:00 2001 From: glo00108 Date: Thu, 17 Feb 2022 13:06:00 +0530 Subject: [PATCH 176/674] resolve static check --- .../FunctionalTestingFramework/Util/TestGenerator.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index e546cd1d2..52ebdee5e 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -2101,12 +2101,10 @@ private function resolveRuntimeReference($args, $regex, $func) preg_match_all($regex, $arg, $matches); if (!empty($matches[0])) { 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; + $refVariable = $matches[1][$matchKey]; + $replacement = $this->getReplacement($func, $refVariable); + $outputArg = $this->processQuoteBreaks($fullMatch, $newArgs[$key], $replacement); + $newArgs[$key] = $outputArg; } unset($matches); continue; From e92f7af3d69e68a125fb2cacc286837d10636ff3 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 18 Feb 2022 12:32:02 +0530 Subject: [PATCH 177/674] MQE-2088 : Test generation error on invalid entities --- .../Util/TestGenerator.php | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 01f1a3cba..66468fe3e 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -31,6 +31,7 @@ use Magento\FunctionalTestingFramework\Util\Path\FilePathFormatter; use Mustache_Engine; use Mustache_Loader_FilesystemLoader; +use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; /** * Class TestGenerator @@ -904,7 +905,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato break; case "createData": $entity = $customActionAttributes['entity']; - + $this->entityExistsCheck($entity , $stepKey); //TODO refactor entity field override to not be individual actionObjects $customEntityFields = $customActionAttributes[ActionObjectExtractor::ACTION_OBJECT_PERSISTENCE_FIELDS] ?? []; @@ -922,7 +923,6 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato if (!empty($requiredEntityKeys)) { $requiredEntityKeysArray = '"' . implode('", "', $requiredEntityKeys) . '"'; } - $scope = $this->getObjectScope($generationScope); $createEntityFunctionCall = "\t\t\${$actor}->createEntity("; @@ -1511,7 +1511,8 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato } $testSteps .= PHP_EOL; } - + + return $testSteps; } @@ -1673,6 +1674,9 @@ private function resolveStepKeyReferences($input, $actionGroupOrigin, $matchAll $testInvocationKey = ucfirst($actionGroupOrigin[ActionGroupObject::ACTION_GROUP_ORIGIN_TEST_REF]); foreach ($stepKeys as $stepKey) { + + + // MQE-1011 $stepKeyVarRef = "$" . $stepKey; @@ -1877,7 +1881,6 @@ private function generateTestPhp($test) $testPhp .= "\t\t\$this->isSuccess = true;" . PHP_EOL; $testPhp .= "\t}\n"; } - return $testPhp; } @@ -2049,6 +2052,23 @@ private function addDollarSign($input) return sprintf("$%s", ltrim($this->stripQuotes($input), '$')); } + /** + * Check if the entity exists + * + * @param string $entity + * @param string $stepKey + * @throws TestReferenceException + */ + public function entityExistsCheck($entity , $stepKey) + { + $retrievedEntity = DataObjectHandler::getInstance()->getObject($entity); + if ($retrievedEntity === null) { + throw new TestReferenceException( + "Test generation failed as entity \"" . $entity . "\" does not exist. at stepkey ".$stepKey + ); + } + } + /** * Wrap parameters into a function call. * From 5a1041e87e13d0f06c467fb7e5550ee43b96eb81 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 18 Feb 2022 12:34:19 +0530 Subject: [PATCH 178/674] MQE-2088 : Test generation error on invalid entities --- .../FunctionalTestingFramework/Util/TestGenerator.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 66468fe3e..078148f61 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1511,8 +1511,6 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato } $testSteps .= PHP_EOL; } - - return $testSteps; } @@ -1674,9 +1672,6 @@ private function resolveStepKeyReferences($input, $actionGroupOrigin, $matchAll $testInvocationKey = ucfirst($actionGroupOrigin[ActionGroupObject::ACTION_GROUP_ORIGIN_TEST_REF]); foreach ($stepKeys as $stepKey) { - - - // MQE-1011 $stepKeyVarRef = "$" . $stepKey; From 700e79586521f0f3070ce21673b09ceecfa19f71 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 18 Feb 2022 12:36:38 +0530 Subject: [PATCH 179/674] MQE-2088 : Test generation error on invalid entities --- .../FunctionalTestingFramework/Util/TestGenerator.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 078148f61..5265b0102 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -905,7 +905,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato break; case "createData": $entity = $customActionAttributes['entity']; - $this->entityExistsCheck($entity , $stepKey); + $this->entityExistsCheck($entity, $stepKey); //TODO refactor entity field override to not be individual actionObjects $customEntityFields = $customActionAttributes[ActionObjectExtractor::ACTION_OBJECT_PERSISTENCE_FIELDS] ?? []; @@ -2052,9 +2052,10 @@ private function addDollarSign($input) * * @param string $entity * @param string $stepKey + * @return void * @throws TestReferenceException */ - public function entityExistsCheck($entity , $stepKey) + public function entityExistsCheck($entity, $stepKey) { $retrievedEntity = DataObjectHandler::getInstance()->getObject($entity); if ($retrievedEntity === null) { From f7f9f34736332cf17a1ca30d44d5b35bdff3902a Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 18 Feb 2022 15:45:14 +0530 Subject: [PATCH 180/674] unit test added --- .../Util/TestGeneratorTest.php | 18 ++++++++++++++++++ .../Util/TestGenerator.php | 2 ++ 2 files changed, 20 insertions(+) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index d59811d4a..cc0316e57 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -108,6 +108,24 @@ public function testUniqueIdAppendedToInputStringAsPrefix() $this->assertMatchesRegularExpression('/[A-Za-z0-9]+foo/', $result); } + /** + * Basic test to check if exception is thrown when invalid entity is found in xml file + * + * @return void + * @throws Exception + */ + public function testInvalidEntity() + { + $actionObject = new ActionObject('fakeAction', 'comment', [ + 'userInput' => '{{someEntity.entity}}' + ]); + + $testObject = new TestObject('sampleTest', ['merge123' => $actionObject], [], [], 'filename'); + $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $testObject]); + $this->expectException(TestReferenceException::class); + $result = $testGeneratorObject->entityExistsCheck('testintity', "teststepkey"); + } + /** * Basic test to check unique id is appended to input as suffix * diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 5265b0102..bf67ca1cd 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -977,6 +977,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato true ); $updateEntity = $customActionAttributes['entity']; + $this->entityExistsCheck($updateEntity, $stepKey); $actionGroup = $actionObject->getCustomActionAttributes()['actionGroup'] ?? null; $key .= $actionGroup; @@ -1010,6 +1011,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato break; case "getData": $entity = $customActionAttributes['entity']; + $this->entityExistsCheck($entity, $stepKey); $index = null; if (isset($customActionAttributes['index'])) { $index = (int)$customActionAttributes['index']; From 1f1331a885bb5270ce96bd5e6a061d0f3baa3554 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 18 Feb 2022 15:52:24 +0530 Subject: [PATCH 181/674] unit test added --- .../FunctionalTestFramework/Util/TestGeneratorTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index cc0316e57..dbdff8304 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -108,7 +108,7 @@ public function testUniqueIdAppendedToInputStringAsPrefix() $this->assertMatchesRegularExpression('/[A-Za-z0-9]+foo/', $result); } - /** + /** * Basic test to check if exception is thrown when invalid entity is found in xml file * * @return void @@ -123,9 +123,9 @@ public function testInvalidEntity() $testObject = new TestObject('sampleTest', ['merge123' => $actionObject], [], [], 'filename'); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $testObject]); $this->expectException(TestReferenceException::class); - $result = $testGeneratorObject->entityExistsCheck('testintity', "teststepkey"); + $result = $testGeneratorObject->entityExistsCheck('testintity', "teststepkey"); } - + /** * Basic test to check unique id is appended to input as suffix * From 9a7f1404fc8a4a51921b47cea2a567e8e103624a Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 18 Feb 2022 16:01:23 +0530 Subject: [PATCH 182/674] unit test added --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index bf67ca1cd..5265b0102 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -977,7 +977,6 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato true ); $updateEntity = $customActionAttributes['entity']; - $this->entityExistsCheck($updateEntity, $stepKey); $actionGroup = $actionObject->getCustomActionAttributes()['actionGroup'] ?? null; $key .= $actionGroup; @@ -1011,7 +1010,6 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato break; case "getData": $entity = $customActionAttributes['entity']; - $this->entityExistsCheck($entity, $stepKey); $index = null; if (isset($customActionAttributes['index'])) { $index = (int)$customActionAttributes['index']; From 5b43951fcc81339e9ad3894935d396efe8bf3952 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Mon, 21 Feb 2022 18:35:08 +0530 Subject: [PATCH 183/674] Fixed Verification test --- .../Resources/ActionGroupUsingCreateData.txt | 3 +-- .../ActionGroupWithStepKeyReferences.txt | 3 +-- .../Resources/DataActionsTest.txt | 4 ---- .../Resources/HookActionsTest.txt | 6 ----- .../PersistenceActionGroupAppendingTest.txt | 4 ++-- .../Resources/PersistenceCustomFieldsTest.txt | 22 +------------------ .../ActionGroupWithCreateDataActionGroup.xml | 3 +-- ...nGroupWithStepKeyReferencesActionGroup.xml | 3 +-- .../DataPersistenceAppendingActionGroup.xml | 2 +- .../PersistenceActionGroup.xml | 6 ++--- .../TestModule/Data/DefaultPerson.xml | 15 +++++++++++++ .../verification/TestModule/Data/TestData.xml | 14 ++++++++++++ .../TestModule/Data/UniquePerson.xml | 16 ++++++++++++++ .../verification/TestModule/Data/entity1.xml | 13 +++++++++++ .../verification/TestModule/Data/entity2.xml | 13 +++++++++++ .../TestModule/Test/DataActionsTest.xml | 7 ------ .../TestModule/Test/HookActionsTest.xml | 4 ---- .../Test/PersistenceCustomFieldsTest.xml | 16 +------------- 18 files changed, 83 insertions(+), 71 deletions(-) create mode 100644 dev/tests/verification/TestModule/Data/DefaultPerson.xml create mode 100644 dev/tests/verification/TestModule/Data/TestData.xml create mode 100644 dev/tests/verification/TestModule/Data/UniquePerson.xml create mode 100644 dev/tests/verification/TestModule/Data/entity1.xml create mode 100644 dev/tests/verification/TestModule/Data/entity2.xml diff --git a/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt b/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt index 88f1f0183..2ca4e0a63 100644 --- a/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt +++ b/dev/tests/verification/Resources/ActionGroupUsingCreateData.txt @@ -30,8 +30,7 @@ class ActionGroupUsingCreateDataCest { $I->comment('[START BEFORE HOOK]'); $I->comment("Entering Action Group [Key1] actionGroupWithCreateData"); - $I->createEntity("createCategoryKey1", "hook", "ApiCategory", [], []); // stepKey: createCategoryKey1 - $I->createEntity("createConfigProductKey1", "hook", "ApiConfigurableProduct", ["createCategoryKey1"], []); // stepKey: createConfigProductKey1 + $I->createEntity("createConfigProductKey1", "hook", "TestData", ["createCategory"], []); // stepKey: createConfigProductKey1 $I->comment("Exiting Action Group [Key1] actionGroupWithCreateData"); $I->comment('[END BEFORE HOOK]'); } diff --git a/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt b/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt index e5886ab8e..04195a1da 100644 --- a/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt +++ b/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt @@ -42,7 +42,7 @@ class ActionGroupWithStepKeyReferencesCest public function ActionGroupWithStepKeyReferences(AcceptanceTester $I) { $I->comment("Entering Action Group [actionGroup] FunctionActionGroupWithStepKeyReferences"); - $I->createEntity("createSimpleDataActionGroup", "test", "simpleData", [], []); // stepKey: createSimpleDataActionGroup + $I->createEntity("createSimpleDataActionGroup", "test", "TestData", [], []); // stepKey: createSimpleDataActionGroup $grabTextDataActionGroup = $I->grabTextFrom(".class"); // stepKey: grabTextDataActionGroup $I->fillField(".{$grabTextDataActionGroup}", $I->retrieveEntityField('createSimpleDataActionGroup', 'field', 'test')); // stepKey: fill1ActionGroup $I->comment("Invocation stepKey will not be appended in non stepKey instances"); @@ -61,7 +61,6 @@ class ActionGroupWithStepKeyReferencesCest $I->deleteEntity("{$action7ActionGroupActionGroup}", "test"); // stepKey: action7ActionGroup $I->getEntity("action8ActionGroup", "test", "{$action8}", [], null); // stepKey: action8ActionGroup $I->updateEntity("1", "test", "{$action9}",[]); // stepKey: action9ActionGroup - $I->createEntity("action10ActionGroup", "test", "{$action10}", [], []); // stepKey: action10ActionGroup $action11ActionGroup = $I->grabAttributeFrom($action11ActionGroup, "someInput"); // stepKey: action11ActionGroup $action12ActionGroup = $I->grabCookie($action12ActionGroup, ['domain' => 'www.google.com']); // stepKey: action12ActionGroup $action13ActionGroup = $I->grabFromCurrentUrl($action13ActionGroup); // stepKey: action13ActionGroup diff --git a/dev/tests/verification/Resources/DataActionsTest.txt b/dev/tests/verification/Resources/DataActionsTest.txt index 12fe3e979..882d5fe1a 100644 --- a/dev/tests/verification/Resources/DataActionsTest.txt +++ b/dev/tests/verification/Resources/DataActionsTest.txt @@ -29,11 +29,8 @@ class DataActionsTestCest public function _before(AcceptanceTester $I) { $I->comment('[START BEFORE HOOK]'); - $I->createEntity("createdInBefore", "hook", "entity", [], []); // stepKey: createdInBefore $I->updateEntity("createdInBefore", "hook", "entity",[]); // stepKey: updateInBefore $I->deleteEntity("createdInBefore", "hook"); // stepKey: deleteInBefore - $customerFields['lastname'] = "foo"; - $I->createEntity("customer", "hook", "Simple_Customer_Without_Address", [], $customerFields); // stepKey: customer $I->comment('[END BEFORE HOOK]'); } @@ -57,7 +54,6 @@ class DataActionsTestCest public function DataActionsTest(AcceptanceTester $I) { $I->waitForElementClickable(".functionalTestSelector"); // stepKey: waitForElementClickable - $I->createEntity("createdInTest", "test", "entity", [], []); // stepKey: createdInTest $I->updateEntity("createdInTest", "test", "entity",[]); // stepKey: updateInTest $I->deleteEntity("createdInTest", "test"); // stepKey: deleteInTest $I->updateEntity("createdInBefore", "test", "entity",[]); // stepKey: updatedDataOutOfScope diff --git a/dev/tests/verification/Resources/HookActionsTest.txt b/dev/tests/verification/Resources/HookActionsTest.txt index 01edd913d..6ff14a09c 100644 --- a/dev/tests/verification/Resources/HookActionsTest.txt +++ b/dev/tests/verification/Resources/HookActionsTest.txt @@ -28,11 +28,6 @@ class HookActionsTestCest */ public function _before(AcceptanceTester $I) { - $I->comment('[START BEFORE HOOK]'); - $I->createEntity("sampleCreateBefore", "hook", "sampleCreatedEntity", [], []); // stepKey: sampleCreateBefore - $I->deleteEntity("sampleCreateBefore", "hook"); // stepKey: sampleDeleteBefore - $I->createEntity("sampleCreateForAfter", "hook", "sampleCreatedEntity", [], []); // stepKey: sampleCreateForAfter - $I->comment('[END BEFORE HOOK]'); } /** @@ -42,7 +37,6 @@ class HookActionsTestCest public function _after(AcceptanceTester $I) { $I->comment('[START AFTER HOOK]'); - $I->createEntity("sampleCreateAfter", "hook", "sampleCreatedEntity", [], []); // stepKey: sampleCreateAfter $I->deleteEntity("sampleCreateForAfter", "hook"); // stepKey: sampleDeleteAfter $I->comment('[END AFTER HOOK]'); if ($this->isSuccess) { diff --git a/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt b/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt index 43689fc0a..4901e3341 100644 --- a/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt +++ b/dev/tests/verification/Resources/PersistenceActionGroupAppendingTest.txt @@ -30,7 +30,7 @@ class PersistenceActionGroupAppendingTestCest { $I->comment('[START BEFORE HOOK]'); $I->comment("Entering Action Group [ACTIONGROUPBEFORE] DataPersistenceAppendingActionGroup"); - $I->createEntity("createDataACTIONGROUPBEFORE", "hook", "entity", [], []); // stepKey: createDataACTIONGROUPBEFORE + $I->createEntity("createDataACTIONGROUPBEFORE", "hook", "DefaultPerson", [], []); // stepKey: createDataACTIONGROUPBEFORE $I->updateEntity("createDataACTIONGROUPBEFORE", "hook", "newEntity",[]); // stepKey: updateDataACTIONGROUPBEFORE $I->deleteEntity("createDataACTIONGROUPBEFORE", "hook"); // stepKey: deleteDataACTIONGROUPBEFORE $I->getEntity("getDataACTIONGROUPBEFORE", "hook", "someEneity", [], null); // stepKey: getDataACTIONGROUPBEFORE @@ -59,7 +59,7 @@ class PersistenceActionGroupAppendingTestCest public function PersistenceActionGroupAppendingTest(AcceptanceTester $I) { $I->comment("Entering Action Group [ACTIONGROUP] DataPersistenceAppendingActionGroup"); - $I->createEntity("createDataACTIONGROUP", "test", "entity", [], []); // stepKey: createDataACTIONGROUP + $I->createEntity("createDataACTIONGROUP", "test", "DefaultPerson", [], []); // stepKey: createDataACTIONGROUP $I->updateEntity("createDataACTIONGROUP", "test", "newEntity",[]); // stepKey: updateDataACTIONGROUP $I->deleteEntity("createDataACTIONGROUP", "test"); // stepKey: deleteDataACTIONGROUP $I->getEntity("getDataACTIONGROUP", "test", "someEneity", [], null); // stepKey: getDataACTIONGROUP diff --git a/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt b/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt index 4039b952f..5a3270922 100644 --- a/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt +++ b/dev/tests/verification/Resources/PersistenceCustomFieldsTest.txt @@ -30,10 +30,8 @@ class PersistenceCustomFieldsTestCest { $I->comment('[START BEFORE HOOK]'); $createData1Fields['firstname'] = "Mac"; - $createData1Fields['lastname'] = "Doe"; + $createData1Fields['lastname'] = "Bar"; $I->createEntity("createData1", "hook", "DefaultPerson", [], $createData1Fields); // stepKey: createData1 - $createData2Fields['firstname'] = $I->retrieveEntityField('createData1', 'firstname', 'hook'); - $I->createEntity("createData2", "hook", "uniqueData", ["createData1"], $createData2Fields); // stepKey: createData2 $I->comment('[END BEFORE HOOK]'); } @@ -56,27 +54,9 @@ class PersistenceCustomFieldsTestCest */ public function PersistenceCustomFieldsTest(AcceptanceTester $I) { - $createdDataFields['favoriteIndex'] = "1"; - $createdDataFields['middlename'] = "Kovacs"; - $I->createEntity("createdData", "test", "simpleData", [], $createdDataFields); // stepKey: createdData $createdData3Fields['firstname'] = "Takeshi"; $createdData3Fields['lastname'] = "Kovacs"; $I->createEntity("createdData3", "test", "UniquePerson", ["createdData"], $createdData3Fields); // stepKey: createdData3 - $I->comment("Entering Action Group [createdAG] PersistenceActionGroup"); - $createDataAG1CreatedAGFields['firstname'] = "string1"; - $I->createEntity("createDataAG1CreatedAG", "test", "simpleData", [], $createDataAG1CreatedAGFields); // stepKey: createDataAG1CreatedAG - $createDataAG2CreatedAGFields['firstname'] = "Jane"; - $I->createEntity("createDataAG2CreatedAG", "test", "simpleData", [], $createDataAG2CreatedAGFields); // stepKey: createDataAG2CreatedAG - $createDataAG3CreatedAGFields['firstname'] = $I->retrieveEntityField('createdData3', 'firstname', 'test'); - $I->createEntity("createDataAG3CreatedAG", "test", "simpleData", [], $createDataAG3CreatedAGFields); // stepKey: createDataAG3CreatedAG - $I->comment("Exiting Action Group [createdAG] PersistenceActionGroup"); - $I->comment("Entering Action Group [AGKEY] DataPersistenceSelfReferenceActionGroup"); - $I->createEntity("createData1AGKEY", "test", "entity1", [], []); // stepKey: createData1AGKEY - $I->createEntity("createData2AGKEY", "test", "entity2", [], []); // stepKey: createData2AGKEY - $createData3AGKEYFields['key1'] = $I->retrieveEntityField('createData1AGKEY', 'field', 'test'); - $createData3AGKEYFields['key2'] = $I->retrieveEntityField('createData2AGKEY', 'field', 'test'); - $I->createEntity("createData3AGKEY", "test", "entity3", [], $createData3AGKEYFields); // stepKey: createData3AGKEY - $I->comment("Exiting Action Group [AGKEY] DataPersistenceSelfReferenceActionGroup"); } public function _passed(AcceptanceTester $I) diff --git a/dev/tests/verification/TestModule/ActionGroup/BasicActionGroup/ActionGroupWithCreateDataActionGroup.xml b/dev/tests/verification/TestModule/ActionGroup/BasicActionGroup/ActionGroupWithCreateDataActionGroup.xml index 9f3a11a4f..7bf83c230 100644 --- a/dev/tests/verification/TestModule/ActionGroup/BasicActionGroup/ActionGroupWithCreateDataActionGroup.xml +++ b/dev/tests/verification/TestModule/ActionGroup/BasicActionGroup/ActionGroupWithCreateDataActionGroup.xml @@ -8,8 +8,7 @@ - - + diff --git a/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup/FunctionActionGroupWithStepKeyReferencesActionGroup.xml b/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup/FunctionActionGroupWithStepKeyReferencesActionGroup.xml index 516c2895b..205e32b3a 100644 --- a/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup/FunctionActionGroupWithStepKeyReferencesActionGroup.xml +++ b/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup/FunctionActionGroupWithStepKeyReferencesActionGroup.xml @@ -8,7 +8,7 @@ - + @@ -22,7 +22,6 @@ - diff --git a/dev/tests/verification/TestModule/ActionGroup/PersistenceActionGroup/DataPersistenceAppendingActionGroup.xml b/dev/tests/verification/TestModule/ActionGroup/PersistenceActionGroup/DataPersistenceAppendingActionGroup.xml index e5ee7ce4f..2fa5cb0aa 100644 --- a/dev/tests/verification/TestModule/ActionGroup/PersistenceActionGroup/DataPersistenceAppendingActionGroup.xml +++ b/dev/tests/verification/TestModule/ActionGroup/PersistenceActionGroup/DataPersistenceAppendingActionGroup.xml @@ -8,7 +8,7 @@ - + diff --git a/dev/tests/verification/TestModule/ActionGroup/PersistenceActionGroup/PersistenceActionGroup.xml b/dev/tests/verification/TestModule/ActionGroup/PersistenceActionGroup/PersistenceActionGroup.xml index c164e13c8..2a7b4873d 100644 --- a/dev/tests/verification/TestModule/ActionGroup/PersistenceActionGroup/PersistenceActionGroup.xml +++ b/dev/tests/verification/TestModule/ActionGroup/PersistenceActionGroup/PersistenceActionGroup.xml @@ -13,13 +13,13 @@ - + {{arg1}} - + {{arg2}} - + {{arg3}} diff --git a/dev/tests/verification/TestModule/Data/DefaultPerson.xml b/dev/tests/verification/TestModule/Data/DefaultPerson.xml new file mode 100644 index 000000000..d513b1fe1 --- /dev/null +++ b/dev/tests/verification/TestModule/Data/DefaultPerson.xml @@ -0,0 +1,15 @@ + + + + + + test + bar + + diff --git a/dev/tests/verification/TestModule/Data/TestData.xml b/dev/tests/verification/TestModule/Data/TestData.xml new file mode 100644 index 000000000..bbd9bdaf6 --- /dev/null +++ b/dev/tests/verification/TestModule/Data/TestData.xml @@ -0,0 +1,14 @@ + + + + + + test + + diff --git a/dev/tests/verification/TestModule/Data/UniquePerson.xml b/dev/tests/verification/TestModule/Data/UniquePerson.xml new file mode 100644 index 000000000..5027b1d2a --- /dev/null +++ b/dev/tests/verification/TestModule/Data/UniquePerson.xml @@ -0,0 +1,16 @@ + + + + + + Qty_1000 + test + bar + + diff --git a/dev/tests/verification/TestModule/Data/entity1.xml b/dev/tests/verification/TestModule/Data/entity1.xml new file mode 100644 index 000000000..c000223c2 --- /dev/null +++ b/dev/tests/verification/TestModule/Data/entity1.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/dev/tests/verification/TestModule/Data/entity2.xml b/dev/tests/verification/TestModule/Data/entity2.xml new file mode 100644 index 000000000..0e1455f2d --- /dev/null +++ b/dev/tests/verification/TestModule/Data/entity2.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/dev/tests/verification/TestModule/Test/DataActionsTest.xml b/dev/tests/verification/TestModule/Test/DataActionsTest.xml index d7a2d205b..3d0e4172b 100644 --- a/dev/tests/verification/TestModule/Test/DataActionsTest.xml +++ b/dev/tests/verification/TestModule/Test/DataActionsTest.xml @@ -10,19 +10,12 @@ xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> - - - foo - - - - diff --git a/dev/tests/verification/TestModule/Test/HookActionsTest.xml b/dev/tests/verification/TestModule/Test/HookActionsTest.xml index 0a26256d0..b1350a0a7 100644 --- a/dev/tests/verification/TestModule/Test/HookActionsTest.xml +++ b/dev/tests/verification/TestModule/Test/HookActionsTest.xml @@ -10,12 +10,8 @@ xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> - - - - diff --git a/dev/tests/verification/TestModule/Test/PersistenceCustomFieldsTest.xml b/dev/tests/verification/TestModule/Test/PersistenceCustomFieldsTest.xml index 77a85060b..867dd35ff 100644 --- a/dev/tests/verification/TestModule/Test/PersistenceCustomFieldsTest.xml +++ b/dev/tests/verification/TestModule/Test/PersistenceCustomFieldsTest.xml @@ -12,27 +12,13 @@ Mac - {{simpleData.lastname}} - - - - $$createData1.firstname$$ + Bar - - 1 - Kovacs - Takeshi Kovacs - - - - - - From 44cd1d2c23b7f9c913003aa77f1fcfbe5fca7500 Mon Sep 17 00:00:00 2001 From: "Mohit.k.Sharma" Date: Mon, 28 Feb 2022 09:35:08 +0530 Subject: [PATCH 184/674] MQE-1693 | Doc added for generate test by json file --- docs/commands/mftf.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/commands/mftf.md b/docs/commands/mftf.md index 67fc61e02..74a41dea9 100644 --- a/docs/commands/mftf.md +++ b/docs/commands/mftf.md @@ -173,7 +173,7 @@ vendor/bin/mftf generate:tests [option] [] [] [--remove] | `--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.
Example: `generate:tests --config=parallel --time=15`
Option `--time` will be the default and the __default value__ is `10` when neither `--time` nor `--groups` is specified.
Example: `generate:tests --config=parallel`| | `-g,--groups` | Set number of groups to be split into when `--config=parallel` is used.
Example: `generate:tests --config=parallel --groups=300`
Options `--time` and `--groups` are mutually exclusive and only one should be used.| -| `--tests` | Defines the test configuration as a JSON string.| +| `--tests` | Defines the test configuration as a JSON string or JSON file path.| | `--allow-skipped` | Allows MFTF to generate and run tests marked with `.`| | `--debug` | Performs schema validations on XML files.
DEFAULT: `generate:tests` implicitly performs schema validation on merged files. It does not indicate the file name where the error is encountered.
DEVELOPER: `--debug` performs per-file validation and returns additional debug information (such as the filename where an error occurred) when test generation fails because of an invalid XML schema. This option takes extra processing time. Use it after test generation has failed once.
| | `-r,--remove`| Removes the existing generated suites and tests cleaning up the `_generated` directory before the actual run. For example, `generate:tests SampleTest --remove` cleans up the entire `_generated` directory and generates `SampleTest` only.| @@ -224,12 +224,20 @@ Complex configuration to generate a few non-suite tests, a single test in a suit The command that encodes this complex configuration: +Command to generate test by json string: + ```bash vendor/bin/mftf generate:tests --tests '{"tests":["general_test1","general_test2","general_test3"],"suites":{"sample":["suite_test1"],"sample2":null}}' ``` Note that the strings must be escaped and surrounded in quotes. +Command to generate test by json file: + +```bash +vendor/bin/mftf generate:tests --tests ./foldername/filename.json +``` + ### `generate:suite` #### Description From 8c85258c9bf38647864594e49282a6ed910b7c84 Mon Sep 17 00:00:00 2001 From: Shashi Kumar Singh <92144509+glo00108@users.noreply.github.com> Date: Mon, 28 Feb 2022 20:39:39 +0530 Subject: [PATCH 185/674] MQE-3121 MFTF config parallel to support input test names from a file (#167) * MQE-3121 MFTF config parallel to support input test names from a file * fix static checks and ac. * updated doc * added example * Update mftf.md Co-authored-by: Kevin Kozan Co-authored-by: Kevin Kozan --- docs/commands/mftf.md | 39 +++++++++++++------ .../Console/GenerateTestsCommand.php | 33 ++++++++++++++++ 2 files changed, 61 insertions(+), 11 deletions(-) diff --git a/docs/commands/mftf.md b/docs/commands/mftf.md index 67fc61e02..049facdd0 100644 --- a/docs/commands/mftf.md +++ b/docs/commands/mftf.md @@ -42,6 +42,23 @@ vendor/bin/mftf generate:tests vendor/bin/mftf generate:tests AdminLoginSuccessfulTest StorefrontPersistedCustomerLoginTest ``` +### Generate tests by testNames.txt file + +```bash +vendor/bin/mftf generate:tests -p path/to/your/testNames.txt +``` + +This command generate all tests specified in a testNames.txt file. + +#### Example + +```bash +testName1 +testName2 +testNameN +suiteName:testInSuite +``` + ### Generate test by test and suite name ```bash @@ -183,7 +200,7 @@ vendor/bin/mftf generate:tests [option] [] [] [--remove] The configuration to generate a single test with no suites: ```json -{ +{ "tests":[ "general_test1" //Generate the "general_test1" test. ], @@ -194,9 +211,9 @@ The configuration to generate a single test with no suites: The configuration to generate a single test in the suite: ```json -{ +{ "tests": null, // No tests outside the suite configuration will be generated. - "suites":{ + "suites":{ "sample":[ // The suite that contains the test. "suite_test1" // The test to be generated. ] @@ -207,8 +224,8 @@ The configuration to generate a single test in the suite: Complex configuration to generate a few non-suite tests, a single test in a suite, and an entire suite: ```json -{ - "tests":[ +{ + "tests":[ "general_test1", "general_test2", "general_test3" @@ -368,7 +385,7 @@ vendor/bin/mftf run:test LoginCustomerTest StorefrontCreateCustomerTest Runs a testManifest.txt file. -This command runs all tests specified in a testManifest.xml file. It does not generate tests for you. You must do that as first. +This command runs all tests specified in a testManifest.xml file. It does not generate tests for you. You must do that as first. #### Usage @@ -449,7 +466,7 @@ The example parameters are taken from the `etc/config/.env.example` file. ### `static-checks` -Runs all or specific MFTF static-checks on the test codebase that MFTF is currently attached to. +Runs all or specific MFTF static-checks on the test codebase that MFTF is currently attached to. Behavior for determining what tests to run is as follows: * If test names are specified, only those tests are run. @@ -469,7 +486,7 @@ vendor/bin/mftf static-checks []... | Option | Description | |-----------------------|-----------------------------------------------------------------------------------------------------------| | `-p, --path` | Path to a MFTF test module to run "deprecatedEntityUsage" and "pauseActionUsage" static check scripts. Option is ignored by other static check scripts. - + #### Examples To check what existing static check scripts are available @@ -478,7 +495,7 @@ To check what existing static check scripts are available vendor/bin/mftf static-checks --help ``` -To run all existing static check scripts +To run all existing static check scripts ```bash vendor/bin/mftf static-checks @@ -527,7 +544,7 @@ vendor/bin/mftf static-checks testDependencies actionGroupArguments |`deprecatedEntityUsage`| Checks that deprecated test entities are not being referenced.| |`annotations`| Checks various details of test annotations, such as missing annotations or duplicate annotations.| |`pauseUsage`| Checks that pause action is not used in action groups, tests or suites.| - + #### Defining ruleset The `static-checks` command will look for a `staticRuleset.json` file under either: @@ -623,7 +640,7 @@ vendor/bin/mftf codecept:run functional --verbose --steps -g default

-Note: You may want to limit the usage of this Codeception command with arguments and options for "acceptance" only, since it is what's supported by MFTF. +Note: You may want to limit the usage of this Codeception command with arguments and options for "acceptance" only, since it is what's supported by MFTF. When using this command, you should change "acceptance" to "functional" when referring to Codeception documentation.

diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index b277f9c4e..88b9dc7b6 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -80,6 +80,11 @@ protected function configure() . 'Existing severity values: BLOCKER, CRITICAL, MAJOR, AVERAGE, MINOR.' . PHP_EOL . 'Example: --filter=severity:CRITICAL' . ' --filter=includeGroup:customer --filter=excludeGroup:customerAnalytics' . PHP_EOL + )->addOption( + 'path', + 'p', + InputOption::VALUE_REQUIRED, + 'path to a test names file.', ); parent::configure(); @@ -113,6 +118,11 @@ protected function execute(InputInterface $input, OutputInterface $output) list($filterType, $filterValue) = explode(':', $filter); $filterList[$filterType][] = $filterValue; } + $path = $input->getOption('path'); + // check filepath is given for generate test file + if (!empty($path)) { + $tests = $this->generateTestFileFromPath($path); + } // Set application configuration so we can references the user options in our framework try { MftfApplicationConfig::create( @@ -311,4 +321,27 @@ private function parseConfigParallelOptions($time, $groups) throw new FastFailException("'groups' option must be an integer and greater than 0"); } } + + /** + * @param string $path + * @return array + * @throws TestFrameworkException + */ + private function generateTestFileFromPath(string $path): array + { + if (!file_exists($path)) { + throw new TestFrameworkException("Could not find file $path. Check the path and try again."); + } + + $test_names = file($path, FILE_IGNORE_NEW_LINES); + $tests = []; + foreach ($test_names as $test_name) { + if (empty(trim($test_name))) { + continue; + } + $test_name_array = explode(' ', trim($test_name)); + $tests = array_merge($tests, $test_name_array); + } + return $tests; + } } From 2c5c3d2656f2ef591877096afc5e7d9d2c8bb15e Mon Sep 17 00:00:00 2001 From: glo00108 Date: Tue, 8 Mar 2022 15:14:03 +0530 Subject: [PATCH 186/674] MQE-2342 Provide MFTF group summary file --- .../Manifest/BaseParallelTestManifest.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Util/Manifest/BaseParallelTestManifest.php b/src/Magento/FunctionalTestingFramework/Util/Manifest/BaseParallelTestManifest.php index da0f9d353..0708d9e63 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Manifest/BaseParallelTestManifest.php +++ b/src/Magento/FunctionalTestingFramework/Util/Manifest/BaseParallelTestManifest.php @@ -41,6 +41,12 @@ abstract class BaseParallelTestManifest extends BaseTestManifest */ protected $dirPath; + /** + * An array of test name count in a single group + * @var array + */ + protected $testCountsToGroup = []; + /** * BaseParallelTestManifest constructor. * @@ -87,6 +93,8 @@ public function generate() foreach ($this->testGroups as $groupNumber => $groupContents) { $this->generateGroupFile($groupContents, $groupNumber, $suites); } + + $this->generateGroupSummaryFile($this->testCountsToGroup); } /** @@ -114,17 +122,35 @@ protected function generateGroupFile($testGroup, $nodeNumber, $suites) foreach ($testGroup as $entryName => $testValue) { $fileResource = fopen($this->dirPath . DIRECTORY_SEPARATOR . "group{$nodeNumber}.txt", 'a'); + $this->testCountsToGroup["group{$nodeNumber}"] = $this->testCountsToGroup["group{$nodeNumber}"] ?? 0; + $line = null; if (!empty($suites[$entryName])) { $line = "-g {$entryName}"; } else { $line = $this->relativeDirPath . DIRECTORY_SEPARATOR . $entryName . '.php'; + $this->testCountsToGroup["group{$nodeNumber}"]++; } fwrite($fileResource, $line . PHP_EOL); fclose($fileResource); } } + /** + * @param array $groups + * @return void + */ + protected function generateGroupSummaryFile(array $groups) + { + $fileResource = fopen($this->dirPath . DIRECTORY_SEPARATOR . "mftf_group_summary.txt", 'w'); + $contents = "Total Number of Groups: " . count($groups) . PHP_EOL; + foreach ($groups as $key => $value) { + $contents .= $key . " - ". $value . "tests" .PHP_EOL; + } + fwrite($fileResource, $contents); + fclose($fileResource); + } + /** * Function which recusrively parses a given potentially multidimensional array of suites containing their split * groups. The result is a flattened array of suite names to relevant tests for generation of the manifest. From 5228185c324ff79c7654606b28c3879259dc0830 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Thu, 24 Mar 2022 20:15:56 +0530 Subject: [PATCH 187/674] MQE-2328 : Detect unused Entities (#173) * MQE-2328 : Detect unused Entities * MQE-2328 : Detect unused Entities * MQE-2328 : Detect unused Entities * MQE-2328 : Detect unused Entities * MQE-2328 : Detect unused Entities * MQE-2328 : Detect unused Entities * MQE-2328 : Detect unused Entities * MQE-2328 : Detect unused Entities * MQE-2328 : Detect unused Entities * MQE-2328 : Detect unused Entities * added variable above foreach Co-authored-by: Manjusha.S --- .../StaticCheck/StaticChecksList.php | 2 + .../StaticCheck/UnusedEntityCheck.php | 658 ++++++++++++++++++ 2 files changed, 660 insertions(+) create mode 100644 src/Magento/FunctionalTestingFramework/StaticCheck/UnusedEntityCheck.php diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php index 39b9ae748..7eda14f1b 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php @@ -19,6 +19,7 @@ class StaticChecksList implements StaticCheckListInterface const DEPRECATED_ENTITY_USAGE_CHECK_NAME = 'deprecatedEntityUsage'; const PAUSE_ACTION_USAGE_CHECK_NAME = 'pauseActionUsage'; const CREATED_DATA_FROM_OUTSIDE_ACTIONGROUP = 'createdDataFromOutsideActionGroup'; + const UNUSED_ENTITY_CHECK = 'unusedEntityCheck'; const STATIC_RESULTS = 'tests' . DIRECTORY_SEPARATOR .'_output' . DIRECTORY_SEPARATOR . 'static-results'; /** @@ -49,6 +50,7 @@ public function __construct(array $checks = []) self::DEPRECATED_ENTITY_USAGE_CHECK_NAME => new DeprecatedEntityUsageCheck(), 'annotations' => new AnnotationsCheck(), self::PAUSE_ACTION_USAGE_CHECK_NAME => new PauseActionUsageCheck(), + self::UNUSED_ENTITY_CHECK => new UnusedEntityCheck(), self::CREATED_DATA_FROM_OUTSIDE_ACTIONGROUP => new CreatedDataFromOutsideActionGroupCheck() ] + $checks; diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/UnusedEntityCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/UnusedEntityCheck.php new file mode 100644 index 000000000..72c5ea801 --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/UnusedEntityCheck.php @@ -0,0 +1,658 @@ +(.+?)<\/requiredEntity>/'; + const ENTITY_SEPERATED_BY_DOT_REFERENCE = '/([\w]+)(\.)+([\w]+)/'; + + /** + * ScriptUtil instance + * + * @var ScriptUtil $scriptUtil + */ + private $scriptUtil; + + /** + * Checks test dependencies, determined by references in tests versus the dependencies listed in the Magento module + * + * @param InputInterface $input + * @return void + * @throws Exception + */ + public function execute(InputInterface $input) + { + $this->scriptUtil = new ScriptUtil(); + $domDocument = new \DOMDocument(); + $modulePaths = $this->scriptUtil->getAllModulePaths(); + $testXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Test"); + $actionGroupXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "ActionGroup"); + $dataXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Data"); + $pageXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Page"); + $sectionXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Section"); + $suiteXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'Suite'); + $this->errors = $this->unusedEntities( + $domDocument, + $dataXmlFiles, + $actionGroupXmlFiles, + $sectionXmlFiles, + $pageXmlFiles, + $testXmlFiles, + $suiteXmlFiles + ); + $this->output = $this->scriptUtil->printErrorsToFile( + $this->errors, + StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', + self::ERROR_LOG_MESSAGE + ); + } + + /** + * Centralized method to get unused Entities + * + * @param DOMDocument $domDocument + * @param ScriptUtil $dataXmlFiles + * @param ScriptUtil $actionGroupXmlFiles + * @param ScriptUtil $sectionXmlFiles + * @param ScriptUtil $pageXmlFiles + * @param ScriptUtil $testXmlFiles + * @param ScriptUtil $suiteXmlFiles + * @return array + * @throws Exception + */ + private function unusedEntities( + $domDocument, + $dataXmlFiles, + $actionGroupXmlFiles, + $sectionXmlFiles, + $pageXmlFiles, + $testXmlFiles, + $suiteXmlFiles + ) { + foreach ($dataXmlFiles as $filePath) { + $domDocument->load($filePath); + $entityResult = $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName("entity"), + ["type" => "name"] + ); + foreach ($entityResult as $entitiesResultData) { + $dataNames[$entitiesResultData[key($entitiesResultData)]] = [ + "dataFilePath"=>StaticChecksList::getFilePath($filePath->getRealPath()) + ]; + } + } + foreach ($actionGroupXmlFiles as $filePath) { + $domDocument->load($filePath); + $actionGroupName = $domDocument->getElementsByTagName("actionGroup")->item(0)->getAttribute("name"); + if (!empty($domDocument->getElementsByTagName("actionGroup")->item(0)->getAttribute("deprecated"))) { + continue; + } + $allActionGroupFileNames[$actionGroupName ] = + StaticChecksList::getFilePath($filePath->getRealPath()); + } + + foreach ($sectionXmlFiles as $filePath) { + $domDocument->load($filePath); + $sectionName = $domDocument->getElementsByTagName("section")->item(0)->getAttribute("name"); + $sectionFileNames[$sectionName] = StaticChecksList::getFilePath($filePath->getRealPath()); + } + + foreach ($pageXmlFiles as $filePath) { + $domDocument->load($filePath); + $pageName = $domDocument->getElementsByTagName("page")->item(0)->getAttribute("name"); + $pageFiles[$pageName] = StaticChecksList::getFilePath( + $filePath->getRealPath() + ); + } + $actionGroupReferences = $this->unusedActionEntity( + $domDocument, + $actionGroupXmlFiles, + $testXmlFiles, + $allActionGroupFileNames, + $suiteXmlFiles + ); + $entityReferences = $this->unusedData( + $domDocument, + $actionGroupXmlFiles, + $testXmlFiles, + $dataNames, + $dataXmlFiles + ); + $pagesReference = $this->unusedPageEntity( + $domDocument, + $actionGroupXmlFiles, + $testXmlFiles, + $pageFiles, + $suiteXmlFiles + ); + $sectionReference = $this->unusedSectionEntity( + $domDocument, + $actionGroupXmlFiles, + $testXmlFiles, + $pageXmlFiles, + $sectionFileNames, + $suiteXmlFiles + ); + return $this->setErrorOutput( + array_merge( + array_values($actionGroupReferences), + array_values($entityReferences), + array_values($pagesReference), + array_values($sectionReference) + ) + ); + } + /** + * Setting error message + * + * @return array + * @throws Exception + */ + private function setErrorOutput($unusedFilePath) + { + $testErrors = []; + foreach ($unusedFilePath as $files) { + $errorOutput = " Unused Entity File Path "; + $errorOutput .= "\n\t".$files."\t\n"; + $testErrors[$files][] = $errorOutput; + } + return $testErrors; + } + + /** + * Retrieves Unused Action Group Entities + * + * @param DOMDocument $domDocument + * @param ScriptUtil $actionGroupXmlFiles + * @param ScriptUtil $testXmlFiles + * @param ScriptUtil $allActionGroupFileNames + * @param ScriptUtil $suiteXmlFiles + * @return array + * @throws Exception + */ + private function unusedActionEntity( + $domDocument, + $actionGroupXmlFiles, + $testXmlFiles, + $allActionGroupFileNames, + $suiteXmlFiles + ) { + foreach ($suiteXmlFiles as $filePath) { + $domDocument->load($filePath); + $referencesSuite= $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName("actionGroup"), + "ref" + ); + foreach ($referencesSuite as $referencesResultSuite) { + if (isset($allActionGroupFileNames[$referencesResultSuite])) { + unset($allActionGroupFileNames[$referencesResultSuite]); + } + } + } + + foreach ($actionGroupXmlFiles as $filePath) { + $domDocument->load($filePath); + $actionGroup = $domDocument->getElementsByTagName("actionGroup")->item(0); + $references = $actionGroup->getAttribute("extends"); + if (in_array($references, array_keys($allActionGroupFileNames))) { + unset($allActionGroupFileNames[$references]); + } + } + foreach ($testXmlFiles as $filePath) { + $domDocument->load($filePath); + $testReferences = $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName("actionGroup"), + "ref" + ); + foreach ($testReferences as $testReferencesResult) { + if (isset($allActionGroupFileNames[$testReferencesResult])) { + unset($allActionGroupFileNames[$testReferencesResult]); + } + } + } + return $allActionGroupFileNames; + } + + /** + * Retrieves Unused Page Entities + * + * @param DOMDocument $domDocument + * @return array + * @throws Exception + */ + private function unusedPageEntity($domDocument, $actionGroupXmlFiles, $testXmlFiles, $pageNames, $suiteXmlFiles) + { + + foreach ($suiteXmlFiles as $filePath) { + $domDocument->load($filePath); + $contents = file_get_contents($filePath); + $pagesReferencesInSuites = $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName("amOnPage"), + "url" + ); + foreach ($pagesReferencesInSuites as $pagesReferencesInSuitesResult) { + $explodepagesReferencesResult = explode( + ".", + trim($pagesReferencesInSuitesResult, "{}") + ); + unset($pageNames[$explodepagesReferencesResult[0]]); + } + $pageNames = $this->entityReferencePatternCheck($domDocument, $pageNames, $contents, false, []); + } + foreach ($actionGroupXmlFiles as $filePath) { + $domDocument->load($filePath); + $contents = file_get_contents($filePath); + $pagesReferences = $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName("amOnPage"), + "url" + ); + foreach ($pagesReferences as $pagesReferencesResult) { + $explodepagesReferencesResult = explode( + ".", + trim($pagesReferencesResult, "{}") + ); + unset($pageNames[$explodepagesReferencesResult[0]]); + } + $pageNames = $this->entityReferencePatternCheck($domDocument, $pageNames, $contents, false, []); + } + + foreach ($testXmlFiles as $filePath) { + $domDocument->load($filePath); + $contents = file_get_contents($filePath); + $testReferences = $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName("amOnPage"), + "url" + ); + foreach ($testReferences as $pagesReferencesResult) { + $explodepagesReferencesResult = explode( + ".", + trim($pagesReferencesResult, "{}") + ); + unset($pageNames[$explodepagesReferencesResult[0]]); + } + $pageNames = $this->entityReferencePatternCheck($domDocument, $pageNames, $contents, false, []); + } + return $pageNames; + } + + /** + * Common Pattern Check Method + * + * @param DOMDocument $domDocument + * @param array $fileNames + * @param string $contents + * @return array + * @throws Exception + */ + private function entityReferencePatternCheck($domDocument, $fileNames, $contents, $data, $removeDataFilePath) + { + $sectionArgumentValueReference = $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName("argument"), + "value" + ); + $sectionDefaultValueArgumentReference = $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName("argument"), + "defaultValue" + ); + $sectionArgumentValue = array_merge($sectionArgumentValueReference, $sectionDefaultValueArgumentReference); + foreach ($sectionArgumentValue as $sectionArgumentValueResult) { + $explodedReference = str_contains($sectionArgumentValueResult, '$') + ? explode(".", trim($sectionArgumentValueResult, '$')) + : explode(".", trim($sectionArgumentValueResult, "{}")); + if (in_array($explodedReference[0], array_keys($fileNames))) { + $removeDataFilePath[] = isset($fileNames[$explodedReference[0]]["dataFilePath"]) + ? $fileNames[$explodedReference[0]]["dataFilePath"] + : []; + unset($fileNames[$explodedReference[0]]); + } + } + preg_match_all(self::ENTITY_REGEX_PATTERN, $contents, $bracketReferencesData); + preg_match_all( + self::ENTITY_SEPERATED_BY_DOT_REFERENCE, + $contents, + $entitySeperatedByDotReferenceActionGroup + ); + $entityReferenceDataResultActionGroup = array_merge( + array_unique($bracketReferencesData[0]), + array_unique($entitySeperatedByDotReferenceActionGroup[0]) + ); + + foreach (array_unique($entityReferenceDataResultActionGroup) as $bracketReferencesResults) { + $bracketReferencesDataResultOutput = explode(".", trim($bracketReferencesResults, "{}")); + if (in_array($bracketReferencesDataResultOutput[0], array_keys($fileNames))) { + $removeDataFilePath[] = isset($fileNames[$bracketReferencesDataResultOutput[0]]["dataFilePath"]) + ? $fileNames[$bracketReferencesDataResultOutput[0]]["dataFilePath"] + : []; + unset($fileNames[$bracketReferencesDataResultOutput[0]]); + } + } + + return ($data === true) ? ['dataFilePath'=>$removeDataFilePath ,'fileNames'=> $fileNames ] : $fileNames ; + } + + /** + * Retrieves Unused Section Entities + * + * @param DOMDocument $domDocument + * @param ScriptUtil $actionGroupXmlFiles + * @param ScriptUtil $testXmlFiles + * @param ScriptUtil $pageXmlFiles + * @param array $sectionFileNames + * @param ScriptUtil $suiteXmlFiles + * @return array + * @throws Exception + */ + private function unusedSectionEntity( + $domDocument, + $actionGroupXmlFiles, + $testXmlFiles, + $pageXmlFiles, + $sectionFileNames, + $suiteXmlFiles + ) { + foreach ($suiteXmlFiles as $filePath) { + $contents = file_get_contents($filePath); + $domDocument->load($filePath); + preg_match_all( + self::SELECTOR_REGEX_PATTERN, + $contents, + $selectorReferences + ); + + if (isset($selectorReferences[1])) { + foreach (array_unique($selectorReferences[1]) as $selectorReferencesResult) { + $trimSelector = explode(".", trim($selectorReferencesResult, "{{}}")); + if (isset($sectionFileNames[$trimSelector[0]])) { + unset($sectionFileNames[$trimSelector[0]]); + } + } + } + $sectionFileNames = $this->entityReferencePatternCheck( + $domDocument, + $sectionFileNames, + $contents, + false, + [] + ); + } + foreach ($actionGroupXmlFiles as $filePath) { + $contents = file_get_contents($filePath); + $domDocument->load($filePath); + preg_match_all( + self::SELECTOR_REGEX_PATTERN, + $contents, + $selectorReferences + ); + + if (isset($selectorReferences[1])) { + foreach (array_unique($selectorReferences[1]) as $selectorReferencesResult) { + $trimSelector = explode(".", trim($selectorReferencesResult, "{{}}")); + if (isset($sectionFileNames[$trimSelector[0]])) { + unset($sectionFileNames[$trimSelector[0]]); + } + } + } + $sectionFileNames = $this->entityReferencePatternCheck( + $domDocument, + $sectionFileNames, + $contents, + false, + [] + ); + } + $sectionFileNames = $this->getUnusedSectionEntitiesReferenceInActionGroupAndTestFiles( + $testXmlFiles, + $pageXmlFiles, + $domDocument, + $sectionFileNames + ); + return $sectionFileNames; + } + + /** + * Get unused section entities reference in Action group and Test files + * @param ScriptUtil $testXmlFiles + * @param ScriptUtil $pageXmlFiles + * @param DOMDocument $domDocument + * @param array $sectionFileNames + * @return array + * @throws Exception + */ + private function getUnusedSectionEntitiesReferenceInActionGroupAndTestFiles( + $testXmlFiles, + $pageXmlFiles, + $domDocument, + $sectionFileNames + ) { + foreach ($testXmlFiles as $filePath) { + $contents = file_get_contents($filePath); + $domDocument->load($filePath); + preg_match_all( + self::SELECTOR_REGEX_PATTERN, + $contents, + $selectorReferences + ); + if (isset($selectorReferences[1])) { + foreach (array_unique($selectorReferences[1]) as $selectorReferencesResult) { + $trimSelector = explode(".", trim($selectorReferencesResult, "{{}}")); + if (isset($sectionFileNames[$trimSelector[0]])) { + unset($sectionFileNames[$trimSelector[0]]); + } + } + } + $sectionFileNames = $this->entityReferencePatternCheck( + $domDocument, + $sectionFileNames, + $contents, + false, + [] + ); + } + + foreach ($pageXmlFiles as $filePath) { + $contents = file_get_contents($filePath); + preg_match_all( + self::SELECTOR_REGEX_PATTERN, + $contents, + $selectorReferences + ); + if (isset($selectorReferences[1])) { + foreach (array_unique($selectorReferences[1]) as $selectorReferencesResult) { + $trimSelector = explode(".", trim($selectorReferencesResult, "{{}}")); + if (isset($sectionFileNames[$trimSelector[0]])) { + unset($sectionFileNames[$trimSelector[0]]); + } + } + } + $sectionFileNames = $this->entityReferencePatternCheck( + $domDocument, + $sectionFileNames, + $contents, + false, + [] + ); + } + return $sectionFileNames; + } + /** + * Return Unused Data entities + * + * @param DOMDocument $domDocument + * @return array + */ + private function unusedData( + $domDocument, + $actionGroupXmlFiles, + $testXmlFiles, + $dataNames, + $dataXmlFiles + ) { + $removeDataFilePath = []; + foreach ($dataXmlFiles as $filePath) { + $domDocument->load($filePath); + $contents = file_get_contents($filePath); + preg_match_all(self::REQUIRED_ENTITY, $contents, $requiredEntityReference); + foreach ($requiredEntityReference[2] as $requiredEntityReferenceResult) { + if (isset($dataNames[$requiredEntityReferenceResult])) { + $removeDataFilePath[] = + $dataNames[$requiredEntityReferenceResult]["dataFilePath"]; + unset($dataNames[$requiredEntityReferenceResult]); + } + } + } + foreach ($actionGroupXmlFiles as $filePath) { + $domDocument->load($filePath); + $contents = file_get_contents($filePath); + $getUnusedFilePath = $this->entityReferencePatternCheck( + $domDocument, + $dataNames, + $contents, + true, + $removeDataFilePath + ); + $dataNames = $getUnusedFilePath['fileNames']; + $removeDataFilePath = $getUnusedFilePath['dataFilePath']; + } + foreach ($testXmlFiles as $filePath) { + $domDocument->load($filePath); + $contents = file_get_contents($filePath); + $getUnusedFilePath = $this->entityReferencePatternCheck( + $domDocument, + $dataNames, + $contents, + true, + $removeDataFilePath + ); + $dataNames = $getUnusedFilePath['fileNames']; + $removeDataFilePath = $getUnusedFilePath['dataFilePath']; + $createdDataReferences = $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName("createData"), + "entity" + ); + $updatedDataReferences = $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName("updateData"), + "entity" + ); + $getDataReferences = $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName("getData"), + "entity" + ); + $dataReferences = array_unique( + array_merge( + $createdDataReferences, + $updatedDataReferences, + $getDataReferences + ) + ); + if (count($dataReferences) > 0) { + foreach ($dataReferences as $dataReferencesResult) { + if (isset($dataNames[$dataReferencesResult])) { + $removeDataFilePath[] = $dataNames[$dataReferencesResult]["dataFilePath"]; + unset($dataNames[$dataReferencesResult]); + } + } + } + } + $dataFilePathResult = $this->unsetFilePath($dataNames, $removeDataFilePath); + return array_unique($dataFilePathResult); + } + + /** + * Remove used entities file path from unused entities array + * + * @return array + */ + private function unsetFilePath($dataNames, $removeDataFilePath) + { + $dataFilePathResult = []; + foreach ($dataNames as $key => $dataNamesResult) { + if (in_array($dataNamesResult["dataFilePath"], $removeDataFilePath)) { + unset($dataNames[$key]); + continue; + } + $dataFilePathResult[] = $dataNames[$key]['dataFilePath']; + } + return array_unique($dataFilePathResult); + } + + /** + * Return attribute value for each node in DOMNodeList as an array + * + * @param DOMNodeList $nodes + * @param string $attributeName + * @return array + */ + private function getAttributesFromDOMNodeList($nodes, $attributeName) + { + $attributes = []; + foreach ($nodes as $node) { + if (is_string($attributeName)) { + $attributeValue = $node->getAttribute($attributeName); + } else { + $attributeValue = [$node->getAttribute(key($attributeName)) => + $node->getAttribute($attributeName[key($attributeName)])]; + } + if (!empty($attributeValue)) { + $attributes[] = $attributeValue; + } + } + return $attributes; + } + + /** + * Extract actionGroup DomElement from xml file + * + * @param string $contents + * @return \DOMElement + */ + public function getActionGroupDomElement(string $contents): DOMElement + { + $domDocument = new \DOMDocument(); + $domDocument->loadXML($contents); + return $domDocument->getElementsByTagName("actionGroup")[0]; + } + + /** + * Return array containing all errors found after running the execute() function + * + * @return array + */ + public function getErrors() + { + return $this->errors; + } + + /** + * Return output + * + * @return array + */ + public function getOutput() + { + return $this->output; + } +} From fe04f75ccc9d8e6ba6a305cc8d7ff42bf31de59e Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Mon, 21 Mar 2022 21:36:37 -0500 Subject: [PATCH 188/674] MQE-3267: trim invalid utf-8 characters from response --- composer.json | 1 + composer.lock | 7 +++-- .../Module/MagentoWebDriver.php | 28 ++++++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 9a7757c5d..8bc9aa988 100755 --- a/composer.json +++ b/composer.json @@ -15,6 +15,7 @@ "ext-intl": "*", "ext-json": "*", "ext-openssl": "*", + "ext-iconv": "*", "allure-framework/allure-codeception": "^1.4", "aws/aws-sdk-php": "^3.132", "codeception/codeception": "^4.1", diff --git a/composer.lock b/composer.lock index 8000882be..110b8530d 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": "35ff8c71326b9f8ab0885c8b55dd59cf", + "content-hash": "827f1612ae8476f99dae2541f722221c", "packages": [ { "name": "allure-framework/allure-codeception", @@ -7797,8 +7797,9 @@ "ext-dom": "*", "ext-intl": "*", "ext-json": "*", - "ext-openssl": "*" + "ext-openssl": "*", + "ext-iconv": "*" }, "platform-dev": [], - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.2.0" } diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 68d2efd4b..84007099a 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -584,7 +584,8 @@ public function magentoCLI($command, $timeout = null, $arguments = null) $response = $executor->read(); $executor->close(); - return $response; + $response = trim($this->safeUtf8Conversion($response)); + return $response != "" ? $response : "CLI did not return output."; } /** @@ -1059,4 +1060,29 @@ public function pause($pauseOnFail = false) $this->codeceptPause(); } + + /** + * Return UTF-8 encoding string with control/invisible characters removed, return original string on error. + * + * @param string $input + * @return string + */ + private function safeUtf8Conversion(string $input): string + { + // Convert $input string to UTF-8 encoding + $convInput = iconv("ISO-8859-1", "UTF-8//IGNORE", $input); + if ($convInput !== false) { + // Remove invisible control characters, unused code points and replacement character + // so that they don't break xml test results for Allure + $cleanInput = preg_replace('/[^\PC\s]|\x{FFFD}/u', '', $convInput); + if ($cleanInput !== null) { + return $cleanInput; + } else { + $err = preg_last_error_msg(); + print("MagentoCLI response preg_replace() with error $err.\n"); + } + } + + return $input; + } } From 722c74f98c17b283ea8e1577e6a64c3fb9c87ade Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" Date: Tue, 29 Mar 2022 14:45:22 +0530 Subject: [PATCH 189/674] MQE-2903:Implement rapid times X clicks on UI element in MFTF --- .../Module/MagentoWebDriver.php | 15 ++++++++++ .../Test/etc/actionTypeTags.xsd | 28 +++++++++++++++++++ .../Util/TestGenerator.php | 8 ++++++ 3 files changed, 51 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 68d2efd4b..4bafbafa4 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -390,6 +390,21 @@ public function searchAndMultiSelectOption($select, array $options, $requireActi } } + /** + * Simple rapid click as per given count number. + * + * @param string $selector + * @param string $count + * @return void + * @throws \Exception + */ + public function rapidClick($selector, $count) + { + for ($i = 0; $i < $count; $i++) { + $this->click($selector); + } + } + /** * Select multiple options from a drop down using a filter and text field to narrow results. * diff --git a/src/Magento/FunctionalTestingFramework/Test/etc/actionTypeTags.xsd b/src/Magento/FunctionalTestingFramework/Test/etc/actionTypeTags.xsd index d68cf43db..1ce58001d 100644 --- a/src/Magento/FunctionalTestingFramework/Test/etc/actionTypeTags.xsd +++ b/src/Magento/FunctionalTestingFramework/Test/etc/actionTypeTags.xsd @@ -34,6 +34,7 @@ + @@ -253,6 +254,33 @@ + + + + Performs simple mouse rapid click as per given count. + + + + + + + + Selector for rapid click. + + + + + + + Click count. + + + + + + + + diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 5265b0102..bff24bf67 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1159,6 +1159,14 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $y ); break; + case "rapidClick": + $testSteps .= $this->wrapFunctionCall( + $actor, + $actionObject, + $selector, + $countValue + ); + break; case "selectMultipleOptions": $testSteps .= $this->wrapFunctionCall( $actor, From a3950a8d2d13a2228fa4549abad0016c0df49b3a Mon Sep 17 00:00:00 2001 From: GL-Ashish <92850316+GL-Ashish@users.noreply.github.com> Date: Tue, 29 Mar 2022 15:00:20 +0530 Subject: [PATCH 190/674] Update MagentoWebDriver.php --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 4bafbafa4..11ffa5fe9 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -393,8 +393,8 @@ public function searchAndMultiSelectOption($select, array $options, $requireActi /** * Simple rapid click as per given count number. * - * @param string $selector - * @param string $count + * @param string $selector + * @param string $count * @return void * @throws \Exception */ From e2769416418f663defa97ae48d77ec8f4433370f Mon Sep 17 00:00:00 2001 From: glo00108 Date: Wed, 30 Mar 2022 12:39:12 +0530 Subject: [PATCH 191/674] count groupname test --- .../Util/Manifest/BaseParallelTestManifest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Manifest/BaseParallelTestManifest.php b/src/Magento/FunctionalTestingFramework/Util/Manifest/BaseParallelTestManifest.php index 0708d9e63..5f90e24e8 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Manifest/BaseParallelTestManifest.php +++ b/src/Magento/FunctionalTestingFramework/Util/Manifest/BaseParallelTestManifest.php @@ -94,7 +94,7 @@ public function generate() $this->generateGroupFile($groupContents, $groupNumber, $suites); } - $this->generateGroupSummaryFile($this->testCountsToGroup); + $this->generateGroupSummaryFile($this->testCountsToGroup); } /** @@ -124,9 +124,9 @@ protected function generateGroupFile($testGroup, $nodeNumber, $suites) $this->testCountsToGroup["group{$nodeNumber}"] = $this->testCountsToGroup["group{$nodeNumber}"] ?? 0; - $line = null; - if (!empty($suites[$entryName])) { + if (!empty($suites[$entryName])) { $line = "-g {$entryName}"; + $this->testCountsToGroup["group{$nodeNumber}"] += count($suites[$entryName]); } else { $line = $this->relativeDirPath . DIRECTORY_SEPARATOR . $entryName . '.php'; $this->testCountsToGroup["group{$nodeNumber}"]++; @@ -145,7 +145,7 @@ protected function generateGroupSummaryFile(array $groups) $fileResource = fopen($this->dirPath . DIRECTORY_SEPARATOR . "mftf_group_summary.txt", 'w'); $contents = "Total Number of Groups: " . count($groups) . PHP_EOL; foreach ($groups as $key => $value) { - $contents .= $key . " - ". $value . "tests" .PHP_EOL; + $contents .= $key . " - ". $value . " tests" .PHP_EOL; } fwrite($fileResource, $contents); fclose($fileResource); From eba018ddcb61a2b74e7b2b49471cf4a0914530a8 Mon Sep 17 00:00:00 2001 From: glo00108 Date: Wed, 30 Mar 2022 12:42:19 +0530 Subject: [PATCH 192/674] count groupname test --- .../Util/Manifest/BaseParallelTestManifest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Manifest/BaseParallelTestManifest.php b/src/Magento/FunctionalTestingFramework/Util/Manifest/BaseParallelTestManifest.php index 5f90e24e8..1e9e1d109 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Manifest/BaseParallelTestManifest.php +++ b/src/Magento/FunctionalTestingFramework/Util/Manifest/BaseParallelTestManifest.php @@ -94,7 +94,7 @@ public function generate() $this->generateGroupFile($groupContents, $groupNumber, $suites); } - $this->generateGroupSummaryFile($this->testCountsToGroup); + $this->generateGroupSummaryFile($this->testCountsToGroup); } /** @@ -124,7 +124,7 @@ protected function generateGroupFile($testGroup, $nodeNumber, $suites) $this->testCountsToGroup["group{$nodeNumber}"] = $this->testCountsToGroup["group{$nodeNumber}"] ?? 0; - if (!empty($suites[$entryName])) { + if (!empty($suites[$entryName])) { $line = "-g {$entryName}"; $this->testCountsToGroup["group{$nodeNumber}"] += count($suites[$entryName]); } else { From 792a051e0cd89ddc48b5cd8223ec7f7e923c4fc4 Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Fri, 1 Apr 2022 11:44:39 -0500 Subject: [PATCH 193/674] MQE-3267: trim invalid utf-8 characters from response --- .../Module/Util/ModuleUtilTest.php | 48 +++++++++++++++++++ .../Module/MagentoWebDriver.php | 29 ++--------- .../Module/Util/ModuleUtils.php | 32 +++++++++++++ 3 files changed, 83 insertions(+), 26 deletions(-) create mode 100644 dev/tests/unit/Magento/FunctionalTestFramework/Module/Util/ModuleUtilTest.php create mode 100644 src/Magento/FunctionalTestingFramework/Module/Util/ModuleUtils.php diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Module/Util/ModuleUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Module/Util/ModuleUtilTest.php new file mode 100644 index 000000000..dabf46fd0 --- /dev/null +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Module/Util/ModuleUtilTest.php @@ -0,0 +1,48 @@ +assertStringContainsString($output, $util->utf8SafeControlCharacterTrim($input)); + $this->assertStringNotContainsString($removed, $util->utf8SafeControlCharacterTrim($input)); + } + + /** + * Data input. + * + * @return array + */ + public function inDataProvider(): array + { + $ctr1 = '‹'; + $ctr2 = 'Œ'; + $ctr3 = 'Œ ‹'; + return [ + ["some text $ctr1", 'some text', $ctr1], + ["some text $ctr2", 'some text', $ctr2], + ["some text $ctr3", 'some text', $ctr3] + ]; + } +} diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 84007099a..a7826f1da 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -21,6 +21,7 @@ use Magento\FunctionalTestingFramework\DataTransport\Auth\Tfa\OTP; use Magento\FunctionalTestingFramework\DataTransport\Protocol\CurlInterface; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; +use Magento\FunctionalTestingFramework\Module\Util\ModuleUtils; use Magento\FunctionalTestingFramework\Util\Path\UrlFormatter; use Magento\FunctionalTestingFramework\Util\ConfigSanitizerUtil; use Yandex\Allure\Adapter\AllureException; @@ -584,7 +585,8 @@ public function magentoCLI($command, $timeout = null, $arguments = null) $response = $executor->read(); $executor->close(); - $response = trim($this->safeUtf8Conversion($response)); + $util = new ModuleUtils(); + $response = trim($util->utf8SafeControlCharacterTrim($response)); return $response != "" ? $response : "CLI did not return output."; } @@ -1060,29 +1062,4 @@ public function pause($pauseOnFail = false) $this->codeceptPause(); } - - /** - * Return UTF-8 encoding string with control/invisible characters removed, return original string on error. - * - * @param string $input - * @return string - */ - private function safeUtf8Conversion(string $input): string - { - // Convert $input string to UTF-8 encoding - $convInput = iconv("ISO-8859-1", "UTF-8//IGNORE", $input); - if ($convInput !== false) { - // Remove invisible control characters, unused code points and replacement character - // so that they don't break xml test results for Allure - $cleanInput = preg_replace('/[^\PC\s]|\x{FFFD}/u', '', $convInput); - if ($cleanInput !== null) { - return $cleanInput; - } else { - $err = preg_last_error_msg(); - print("MagentoCLI response preg_replace() with error $err.\n"); - } - } - - return $input; - } } diff --git a/src/Magento/FunctionalTestingFramework/Module/Util/ModuleUtils.php b/src/Magento/FunctionalTestingFramework/Module/Util/ModuleUtils.php new file mode 100644 index 000000000..aa73ca7fc --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/Module/Util/ModuleUtils.php @@ -0,0 +1,32 @@ + Date: Fri, 1 Apr 2022 11:54:09 -0500 Subject: [PATCH 194/674] MQE-3267: trim invalid utf-8 characters from response --- .../FunctionalTestingFramework/Module/Util/ModuleUtils.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Module/Util/ModuleUtils.php b/src/Magento/FunctionalTestingFramework/Module/Util/ModuleUtils.php index aa73ca7fc..d9bc203c4 100644 --- a/src/Magento/FunctionalTestingFramework/Module/Util/ModuleUtils.php +++ b/src/Magento/FunctionalTestingFramework/Module/Util/ModuleUtils.php @@ -1,4 +1,8 @@ Date: Thu, 7 Apr 2022 12:18:32 +0530 Subject: [PATCH 195/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index bff24bf67..1390321f1 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -773,6 +773,12 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $selector = $this->addUniquenessFunctionCall($customActionAttributes['selector']); $selector = $this->resolveLocatorFunctionInAttribute($selector); } + + if (isset($customActionAttributes['count'])) { + $countClickValue = $customActionAttributes['count']; + $countValue = $this->addUniquenessFunctionCall($countClickValue); + $countValue = $this->resolveLocatorFunctionInAttribute($countValue); + } if (isset($customActionAttributes['selector1']) || isset($customActionAttributes['filterSelector'])) { $selectorOneValue = $customActionAttributes['selector1'] ?? $customActionAttributes['filterSelector']; From 58b07574e7a9905f49de645a5ba8935256f1b98d Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" Date: Thu, 7 Apr 2022 16:49:17 +0530 Subject: [PATCH 196/674] Verification test added --- dev/tests/verification/Resources/DataActionsTest.txt | 2 +- dev/tests/verification/TestModule/Test/DataActionsTest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/verification/Resources/DataActionsTest.txt b/dev/tests/verification/Resources/DataActionsTest.txt index d59329e3b..982c680b2 100644 --- a/dev/tests/verification/Resources/DataActionsTest.txt +++ b/dev/tests/verification/Resources/DataActionsTest.txt @@ -58,7 +58,7 @@ class DataActionsTestCest $I->deleteEntity("createdInTest", "test"); // stepKey: deleteInTest $I->updateEntity("createdInBefore", "test", "entity",[]); // stepKey: updatedDataOutOfScope $I->deleteEntity("createdInBefore", "test"); // stepKey: deleteDataOutOfScope - $I->rapidClick("#general_locale_timezone", "50"); // stepKey: rapidClickTest + $I->rapidClick("#functionalTestSelector", "50"); // stepKey: rapidClickTest } public function _passed(AcceptanceTester $I) diff --git a/dev/tests/verification/TestModule/Test/DataActionsTest.xml b/dev/tests/verification/TestModule/Test/DataActionsTest.xml index e588a239e..6f36803ae 100644 --- a/dev/tests/verification/TestModule/Test/DataActionsTest.xml +++ b/dev/tests/verification/TestModule/Test/DataActionsTest.xml @@ -18,6 +18,6 @@ - +
From 2196d3ee80b87b66f71bd12b7183e42391ba01a6 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Mon, 11 Apr 2022 20:47:50 +0530 Subject: [PATCH 197/674] 3.9.0-RC : 3.9.0 Change log, version bump to master --- CHANGELOG.md | 10 +++ composer.json | 2 +- composer.lock | 170 +++++++++++++++++++++++++------------------------- 3 files changed, 96 insertions(+), 86 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04999e2c5..a8287172a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ Magento Functional Testing Framework Changelog ================================================ +3.9.0 +--------- + +### Fixes: +* Fix for invalid UTF-8 chars returned from magentoCLI breaks Allure reporting + +### GitHub Pull Requests: +* [#175](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/175) -- Fixed invalid UTF-8 chars returned from magentoCLI that breaks allure reporting + + 3.8.0 --------- diff --git a/composer.json b/composer.json index 8bc9aa988..69a974db8 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": "3.8.0", + "version": "3.9.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 110b8530d..cc5694857 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": "827f1612ae8476f99dae2541f722221c", + "content-hash": "40786b066af41372e12e5af07aeeaf0b", "packages": [ { "name": "allure-framework/allure-codeception", @@ -230,12 +230,12 @@ } }, "autoload": { - "psr-4": { - "Aws\\": "src/" - }, "files": [ "src/functions.php" - ] + ], + "psr-4": { + "Aws\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -298,12 +298,12 @@ }, "type": "library", "autoload": { - "psr-4": { - "Assert\\": "lib/Assert" - }, "files": [ "lib/Assert/functions.php" - ] + ], + "psr-4": { + "Assert\\": "lib/Assert" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1640,12 +1640,12 @@ } }, "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1747,12 +1747,12 @@ } }, "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1840,12 +1840,12 @@ } }, "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2272,12 +2272,12 @@ } }, "autoload": { - "psr-4": { - "JmesPath\\": "src/" - }, "files": [ "src/JmesPath.php" - ] + ], + "psr-4": { + "JmesPath\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2378,12 +2378,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": [ @@ -2682,12 +2682,12 @@ }, "type": "library", "autoload": { - "psr-4": { - "Facebook\\WebDriver\\": "lib/" - }, "files": [ "lib/Exception/TimeoutException.php" - ] + ], + "psr-4": { + "Facebook\\WebDriver\\": "lib/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3363,11 +3363,11 @@ } }, "autoload": { - "classmap": [ - "src/" - ], "files": [ "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3899,12 +3899,12 @@ } }, "autoload": { - "psr-4": { - "Ramsey\\Uuid\\": "src/" - }, "files": [ "src/functions.php" - ] + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3954,12 +3954,12 @@ }, "type": "library", "autoload": { - "psr-4": { - "React\\Promise\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "React\\Promise\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5900,12 +5900,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5981,12 +5981,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6066,12 +6066,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -6150,12 +6150,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6227,12 +6227,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6303,12 +6303,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -6382,12 +6382,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -6465,12 +6465,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -6761,13 +6761,6 @@ } }, "autoload": { - "psr-4": { - "Safe\\": [ - "lib/", - "deprecated/", - "generated/" - ] - }, "files": [ "deprecated/apc.php", "deprecated/libevent.php", @@ -6858,7 +6851,14 @@ "generated/yaz.php", "generated/zip.php", "generated/zlib.php" - ] + ], + "psr-4": { + "Safe\\": [ + "lib/", + "deprecated/", + "generated/" + ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7066,12 +7066,12 @@ } }, "autoload": { - "psr-4": { - "BrainMaestro\\GitHooks\\": "src/" - }, "files": [ "src/helpers.php" - ] + ], + "psr-4": { + "BrainMaestro\\GitHooks\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7801,5 +7801,5 @@ "ext-iconv": "*" }, "platform-dev": [], - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.1.0" } From d4ae664ea11ddfa8e39e51ae5db9aa8461c5ee6c Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Tue, 12 Apr 2022 14:31:30 +0530 Subject: [PATCH 198/674] Added PRS that has to get merged with master --- CHANGELOG.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8287172a..53eeaeff9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,20 @@ Magento Functional Testing Framework Changelog ### GitHub Pull Requests: * [#175](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/175) -- Fixed invalid UTF-8 chars returned from magentoCLI that breaks allure reporting - +* [#172](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/172) -- MQE-2342 : Provide MFTF group summary file +* [#173](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/173) -- MQE-2328 : Detect unused entities +* [#164](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/164) -- MQE-1693 | Ability To Run MFTF JSON Configuration From File +* [#171](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/171) --MQE-2088 : Test generation error on invalid entities +* [#161](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/161) --MQE-3228: Update MFTF to not pass NULL into non-nullable arguments +* [#162](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/162) --MQE-2668: Some MFTF tests fail without access to S3 +* [#159](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/159) --MQE-1677 : Static check for created data outside action group +* [#168](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/168) -- Deleted docs/img/issue.png , docs/img/pull-request.png ,docs/img/switching-the-base.png and docs/img/trouble-chrome232.png files +* [#157](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/157) -- MQE-2021 : Added new attribute unique +* [#156](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/156) -- MQE-3205: Set proper weight for action for config parallel generation +* [#152](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/152) -- MQE-1545: Test before/after comments in test/allure +* [#154](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/154) -- MQE-1190: Do not truncate parameters when using MFTF run:test +* [#142](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/142) -- MQE-3092 throw error message if key value pair is not mapped properly in .credentials file +* [#144](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/144) -- MQE-1794 : Removed Parameters from allure report 3.8.0 --------- From ac5b5cfe2a608170256413dc1cb584835fecc1d2 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Tue, 12 Apr 2022 14:44:44 +0530 Subject: [PATCH 199/674] Added PRS that has to get merged with master --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53eeaeff9..d801e5f8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,6 @@ Magento Functional Testing Framework Changelog 3.9.0 --------- -### Fixes: -* Fix for invalid UTF-8 chars returned from magentoCLI breaks Allure reporting - ### GitHub Pull Requests: * [#175](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/175) -- Fixed invalid UTF-8 chars returned from magentoCLI that breaks allure reporting * [#172](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/172) -- MQE-2342 : Provide MFTF group summary file From 4fc4334f2a354b3ced627c73bd344b6010be1035 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" Date: Tue, 12 Apr 2022 17:45:02 +0530 Subject: [PATCH 200/674] MQE-2903: rapidClick doc added in actions.md --- docs/test/actions.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/test/actions.md b/docs/test/actions.md index 373a44ee0..993a9ff84 100644 --- a/docs/test/actions.md +++ b/docs/test/actions.md @@ -973,6 +973,25 @@ Attribute|Type|Use|Description ``` +### rapidClick + +See [rapidClick docs on codeception.com](http://codeception.com/docs/modules/WebDriver#rapidClick). + +| Attribute | Type | Use | Description | +|------------|--------|----------|-------------------------------------------------| +| `selector` | string | optional | A selector for the HTML element to rapid click. | +| `count` | string | required | Click count. | +| `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. | + +#### Examples + +```xml + + +``` + ### executeJS See [executeJS docs on codeception.com](http://codeception.com/docs/modules/WebDriver#executeJS). @@ -1077,7 +1096,7 @@ This action can optionally contain one or more [requiredEntity](#requiredentity) ### getOTP Generate a one-time password (OTP) based on a saved `secret` at path `magento/tfa/OTP_SHARED_SECRET` in a MFTF credential storage. -The one-time password (OTP) is returned and accessible through the stepkey. +The one-time password (OTP) is returned and accessible through the stepkey. MFTF use TOTP from [Spomky-Labs/otphp](https://github.com/Spomky-Labs/otphp), if you want to learn more about this action. From 0b414d0dce5d56c0c531d5c26ba200c38d2e55ee Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Wed, 13 Apr 2022 11:03:07 +0530 Subject: [PATCH 201/674] Categorized the commits into Enhancements and Fixes --- CHANGELOG.md | 112 ++++++++++++++++++++++++++------------------------- 1 file changed, 58 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d801e5f8a..e634dabb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,22 +3,26 @@ Magento Functional Testing Framework Changelog 3.9.0 --------- -### GitHub Pull Requests: -* [#175](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/175) -- Fixed invalid UTF-8 chars returned from magentoCLI that breaks allure reporting -* [#172](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/172) -- MQE-2342 : Provide MFTF group summary file -* [#173](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/173) -- MQE-2328 : Detect unused entities -* [#164](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/164) -- MQE-1693 | Ability To Run MFTF JSON Configuration From File -* [#171](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/171) --MQE-2088 : Test generation error on invalid entities -* [#161](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/161) --MQE-3228: Update MFTF to not pass NULL into non-nullable arguments -* [#162](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/162) --MQE-2668: Some MFTF tests fail without access to S3 -* [#159](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/159) --MQE-1677 : Static check for created data outside action group -* [#168](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/168) -- Deleted docs/img/issue.png , docs/img/pull-request.png ,docs/img/switching-the-base.png and docs/img/trouble-chrome232.png files -* [#157](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/157) -- MQE-2021 : Added new attribute unique -* [#156](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/156) -- MQE-3205: Set proper weight for action for config parallel generation -* [#152](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/152) -- MQE-1545: Test before/after comments in test/allure -* [#154](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/154) -- MQE-1190: Do not truncate parameters when using MFTF run:test -* [#142](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/142) -- MQE-3092 throw error message if key value pair is not mapped properly in .credentials file -* [#144](https://github.com/magento-commerce/magento2-functional-testing-framework/pull/144) -- MQE-1794 : Removed Parameters from allure report +### Fixes + +* Fixed invalid UTF-8 chars returned from magentoCLI that breaks allure reporting +* Fixed MFTF tests failure without access to S3 + + +### Enhancements +* MFTF group summary file +* Static check to detect unused entities +* Ability To Run MFTF JSON Configuration From File +* Test generation error on invalid entities +* Update MFTF to not pass NULL into non-nullable arguments +* Static check for created data outside action group +* Deleted the unused images +* CreateData's to allow uniqueness attribute +* Set proper weight for action for config parallel generation +* Test before/after comments in test/allure +* Removed truncation of parameters on running MFTF run:test +* Throw error message if key value pair is not mapped properly in .credentials file +* Removed sub heading Parameters from allure report 3.8.0 --------- @@ -90,7 +94,7 @@ Magento Functional Testing Framework Changelog * [#870](https://github.com/magento/magento2-functional-testing-framework/pull/870) -- Removing the csharpru/vault-php-guzzle6-transport not needed dependency * [#871](https://github.com/magento/magento2-functional-testing-framework/pull/871) -- Changed loose comparisons into strict * [#872](https://github.com/magento/magento2-functional-testing-framework/pull/872) -- Fix broken MFTF tests - + 3.6.1 --------- @@ -106,7 +110,7 @@ Magento Functional Testing Framework Changelog * Maintainability * Updated composer dependencies to be PHP 8 compatible with the except of codeception/aspect-mock. - + ### GitHub Pull Requests: * [#830](https://github.com/magento/magento2-functional-testing-framework/pull/830) -- Add ability to configure multiple OTPs @@ -130,7 +134,7 @@ Magento Functional Testing Framework Changelog ### Enhancements * Customizability - * Added new `config:parallel --groups` option in `generate:tests` command to generate and split tests/suites into required number of execution time balanced groups. + * Added new `config:parallel --groups` option in `generate:tests` command to generate and split tests/suites into required number of execution time balanced groups. ### Fixes @@ -149,7 +153,7 @@ Magento Functional Testing Framework Changelog * Maintainability * Added support for composer 2. - + 3.3.0 --------- @@ -157,11 +161,11 @@ Magento Functional Testing Framework Changelog * Usability * [#817](https://github.com/magento/magento2-functional-testing-framework/pull/817) -- Add support for admin WebAPI token refresh. - + * Maintainability * [#814](https://github.com/magento/magento2-functional-testing-framework/pull/814) -- Update dependencies in order to make mftf php8 compatible, fix running phpcpd - * [#815](https://github.com/magento/magento2-functional-testing-framework/pull/815) -- Upgrade csharpru/vault-php to 4.1 - + * [#815](https://github.com/magento/magento2-functional-testing-framework/pull/815) -- Upgrade csharpru/vault-php to 4.1 + ### Fixes * Fixed test generation error in a split suite group (--config=parallel) to allow generation of subsequent groups. @@ -187,8 +191,8 @@ Magento Functional Testing Framework Changelog * Usability * Introduced error tolerance during test and suite generation. See the [command page](./docs/commands/mftf.md#error-tolerance-during-generation) for details. Addressed github issue [#276](https://github.com/magento/magento2-functional-testing-framework/issues/276). - -* Maintainability + +* Maintainability * Updated annotation static-check to check all required annotations. ### Fixes @@ -203,7 +207,7 @@ Magento Functional Testing Framework Changelog * Removed `travis.yml` and replaced with `.github/workflows/main.yml` ### Fixes -Fixed issue with XPath locators for waits in MagentoPwaWebDriver. +Fixed issue with XPath locators for waits in MagentoPwaWebDriver. 3.1.0 --------- @@ -217,13 +221,13 @@ Fixed issue with XPath locators for waits in MagentoPwaWebDriver. * Usability * Introduced new action `pause`, to invoke codeception interactive pause for debugging during test execution. See the [Interactive Pause](./docs/interactive-pause.md) page for details. * Introduced a new `.env` configuration option `ENABLE_PAUSE`, to enable the new pause feature. - -* Maintainability + +* Maintainability * Added a new static check that checks for the usage of the `pause` action. See the [command page](./docs/commands/mftf.md#static-checks) for details. - -* Modularity + +* Modularity * MFTF now supports the use of actions from multiple modules within suites. - + * Traceability * A deprecation notice is now added at test execution time for deprecated metadata usage. @@ -239,7 +243,7 @@ Fixed issue with XPath locators for waits in MagentoPwaWebDriver. * [#683](https://github.com/magento/magento2-functional-testing-framework/pull/683) -- Docs: Renamed sample test name with the correct one * [#691](https://github.com/magento/magento2-functional-testing-framework/pull/691) -- Docs: Branch name updates * [#678](https://github.com/magento/magento2-functional-testing-framework/pull/678) -- Docs: Command added to modify the web server rewrites configuration - * [#745](https://github.com/magento/magento2-functional-testing-framework/pull/745) -- Docs: Remove invalid sample test name + * [#745](https://github.com/magento/magento2-functional-testing-framework/pull/745) -- Docs: Remove invalid sample test name 3.0.0 --------- @@ -250,22 +254,22 @@ Fixed issue with XPath locators for waits in MagentoPwaWebDriver. * Introduced MFTF helpers `` to create custom actions outside of MFTF.[See custom-helpers page for details](./docs/custom-helpers.md) * Removed deprecated actions `` and ``. * `` no longer skips a test. Instead, the test is added to the `skip` group. - + * Maintainability * Added support for PHP 7.4. * Added support for PHPUnit 9. * Dropped support for PHP 7.0, 7.1, 7.2. * Schema updates for test entities to only allow single entity per file except Data and Metadata. * Support for sub-folders in test modules. - * Removed support to read test entities from `dev/tests/acceptance/tests/functional/Magento/FunctionalTest`. + * Removed support to read test entities from `dev/tests/acceptance/tests/functional/Magento/FunctionalTest`. * Removed file attribute for `` in suiteSchema. * Removed action `pauseExecution` and added `pause`. [See actions page for details](./docs/test/actions.md#pause) - * Removed action `formatMoney` and added `formatCurrency`. [See actions page for details](./docs/test/actions.md#formatcurrency) - * Improved assertion actions to support PHPUnit 9 changes. [See assertions page for details](./docs/test/assertions.md) + * Removed action `formatMoney` and added `formatCurrency`. [See actions page for details](./docs/test/actions.md#formatcurrency) + * Improved assertion actions to support PHPUnit 9 changes. [See assertions page for details](./docs/test/assertions.md) * Added new actions: `assertEqualsWithDelta`, `assertNotEqualsWithDelta`, `assertEqualsCanonicalizing`, `assertNotEqualsCanonicalizing`, `assertEqualsIgnoringCase`, `assertNotEqualsIgnoringCase`. * Added new actions: `assertStringContainsString`, `assertStringNotContainsString`, `assertStringContainsStringIgnoringCase`, `assertStringNotContainsStringIgnoringCase` for string haystacks. * Removed actions: `assertInternalType`, `assertNotInternalType`, `assertArraySubset`. - * Removed delta option from `assertEquals` and `assertNotEquals`. + * Removed delta option from `assertEquals` and `assertNotEquals`. * Added static check `deprecatedEntityUsage` that checks and reports references to deprecated test entities. * Added static check `annotations` that checks and reports missing annotations in tests. * Updated `bin/mftf static-checks` command to allow executing static-checks defined in `staticRuleSet.json` by default. [See command page for details](./docs/commands/mftf.md#static-checks) @@ -274,19 +278,19 @@ Fixed issue with XPath locators for waits in MagentoPwaWebDriver. * `mftf.log` no longer includes notices and warnings at test execution time. * Added unhandledPromptBehavior driver capability for Chrome 75+ support. * Added the Chrome option `--ignore-certificate-errors` to `functional.suite.dist.yml`. - + * Traceability * Removed `--debug` option `NONE` to disallow ability to turn off schema validation. * Notices added for test entity naming convention violations. * Metadata file names changed to `*Meta.xml`. - * Introduced new `.env` configuration `VERBOSE_ARTIFACTS` to toggle saving attachments in Allure. [See configuration page for details](./docs/configuration.md) + * Introduced new `.env` configuration `VERBOSE_ARTIFACTS` to toggle saving attachments in Allure. [See configuration page for details](./docs/configuration.md) * Changed the `bin/mftf static-checks` error file directory from the current working directory to `TESTS_BP/tests/_output/static-results/`. - + * Readability - * Support only nested assertion syntax [See assertions page for details](./docs/test/assertions.md). + * Support only nested assertion syntax [See assertions page for details](./docs/test/assertions.md). * Documented [3.0.0 Backward Incompatible Changes](./docs/backward-incompatible-changes.md). - * Removed blacklist/whitelist terminology in MFTF. - + * Removed blacklist/whitelist terminology in MFTF. + * Upgrade scripts added to upgrade tests to MFTF major version requirements. See upgrade instructions below. * Bumped dependencies to support PHP/PHPUnit upgrade. @@ -374,7 +378,7 @@ Fixed issue with XPath locators for waits in MagentoPwaWebDriver. * Page * Section * Section Element - * See DevDocs for details + * See DevDocs for details * Improved `mftf static-checks` command to allow executing all or specific static checks. * Added a new static check that checks and reports unused arguments in action groups. * Customizability @@ -426,12 +430,12 @@ Fixed issue with XPath locators for waits in MagentoPwaWebDriver. ----- * Traceability - * Allure report enhanced to display file path of tests. + * Allure report enhanced to display file path of tests. * Maintainability * Added support to read MFTF test entities from `dev/tests/acceptance/tests/functional///*` * Removed path deprecation warning from `ModuleResolver`. * Refactored problem methods to reduce cyclomatic complexity. - + ### Fixes * Fixed issue with builds due to absence of AcceptanceTester class. @@ -498,7 +502,7 @@ Fixed issue with XPath locators for waits in MagentoPwaWebDriver. * Customizability * Use of `_CREDS` has been extended to `` and `` actions * Traceability - * A Test step is now generated and injected in the allure report when a test is reported as `BROKEN`. + * A Test step is now generated and injected in the allure report when a test is reported as `BROKEN`. ### Fixes * `static-checks` command now properly returns `1` if any static check failed. @@ -600,7 +604,7 @@ Fixed issue with XPath locators for waits in MagentoPwaWebDriver. ### Enhancements * Maintainability * Added new `mftf run:failed` commands, which reruns all failed tests from last run configuration. - + ### Fixes * Fixed an issue where mftf would fail to parse test materials for extensions installed under `vendor`. * Fixed a Windows compatibility issue around the use of Magento's `ComponentRegistrar` to aggregate paths. @@ -689,15 +693,15 @@ Fixed issue with XPath locators for waits in MagentoPwaWebDriver. 2.3.1 ----- -### Enhancements +### Enhancements * Maintainability * `mftf build:project` now copies over the `command.php` file into the parent Magento installation, if detected. 2.3.0 ----- -### Enhancements +### Enhancements * Traceability - * MFTF now outputs generation run-time information, warnings, and errors to an `mftf.log` file. + * MFTF now outputs generation run-time information, warnings, and errors to an `mftf.log` file. * Overall error messages for various generation errors have been improved. Usage of the `--debug` flag provides file-specific errors for all XML-related errors. * Allure Reports now require a unique `story` and `title` combination, to prevent collisions in Allure Report generation. * The `features` annotation now ignores user input and defaults to the module the test lives under (for clear Allure organization). @@ -748,7 +752,7 @@ Fixed issue with XPath locators for waits in MagentoPwaWebDriver. 2.2.0 ----- -### Enhancements +### Enhancements * Traceability * Javascript errors are now logged and reported in test output. * Test failures are no longer overwritten by failures in an `` hook. @@ -825,7 +829,7 @@ Fixed issue with XPath locators for waits in MagentoPwaWebDriver. ----- ### Enhancements * Traceability - * Severity in `` tags now properly reflect Magento severity values. + * Severity in `` tags now properly reflect Magento severity values. * Modularity * Added ability to pass in simple values to actionGroups via addition of `type` attribute in actionGroup `` declaration. * For examples, see devdocs article on actionGroups. @@ -861,7 +865,7 @@ Fixed issue with XPath locators for waits in MagentoPwaWebDriver. * Added the ability to refer to `custom_attribute` data in persisted entities via `key` instead of index. * ex. `url_key` in category entity: `$category.custom_attributes[3][value]$` and `$category.custom_attributes[url_key]$` are both valid. * Maintainability - * Added check for duplicate `stepKey` attributes at test generation. This check is scoped to `` tags within a single `` tag in a single file. + * Added check for duplicate `stepKey` attributes at test generation. This check is scoped to `` tags within a single `` tag in a single file. ### Fixes * Fixed inability to use `` with `` in test hooks. From ef6634496be1c6cd44d941e23ff8adc07377f27a Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Wed, 13 Apr 2022 11:30:09 +0530 Subject: [PATCH 202/674] moved few data in enhancements to fixes --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e634dabb7..e9b3822aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ Magento Functional Testing Framework Changelog * Fixed invalid UTF-8 chars returned from magentoCLI that breaks allure reporting * Fixed MFTF tests failure without access to S3 +* Removed sub heading Parameters from allure report +* Removed truncation of parameters on running MFTF run:test ### Enhancements @@ -20,9 +22,7 @@ Magento Functional Testing Framework Changelog * CreateData's to allow uniqueness attribute * Set proper weight for action for config parallel generation * Test before/after comments in test/allure -* Removed truncation of parameters on running MFTF run:test * Throw error message if key value pair is not mapped properly in .credentials file -* Removed sub heading Parameters from allure report 3.8.0 --------- From 88ddb9e896c7443395f602e06adcca2b7c24ddd4 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Wed, 13 Apr 2022 11:31:01 +0530 Subject: [PATCH 203/674] moved few data in enhancements to fixes --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9b3822aa..9688654fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,6 @@ Magento Functional Testing Framework Changelog * Removed sub heading Parameters from allure report * Removed truncation of parameters on running MFTF run:test - ### Enhancements * MFTF group summary file * Static check to detect unused entities From 0faa3a011bf420bb1112ab28dbe0e7b305f03c9f Mon Sep 17 00:00:00 2001 From: Shashi Kumar Singh <92144509+glo00108@users.noreply.github.com> Date: Wed, 20 Apr 2022 22:29:55 +0530 Subject: [PATCH 204/674] MQE-2964 Log MFTF test dependencies (#166) * MQE-2964 Log MFTF test dependencies * MQE-2964 Log MFTF test dependencies * MQE-2964 fix static check test dependecies * MQE-2964 fix static check test dependecies * MQE-2964 fix static check test dependecies * new test depencyutil file created * else case added for testEntityJson * update doc for parameters Co-authored-by: Kevin Kozan --- .../Console/GenerateTestsCommandTest.php | 1 + docs/commands/mftf.md | 37 ++- .../Console/GenerateTestsCommand.php | 250 ++++++++++++++++++ .../StaticCheck/TestDependencyCheck.php | 158 ++--------- .../Util/Script/ScriptUtil.php | 32 ++- .../Util/Script/TestDependencyUtil.php | 184 +++++++++++++ 6 files changed, 512 insertions(+), 150 deletions(-) create mode 100644 src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestsCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestsCommandTest.php index 40a96e774..715031c53 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestsCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestsCommandTest.php @@ -17,6 +17,7 @@ class GenerateTestsCommandTest extends TestCase * @param mixed $expected * @return void * @dataProvider configParallelOptions + * @throws \ReflectionException */ public function testParseConfigParallelOptions($time, $groups, $expected): void { diff --git a/docs/commands/mftf.md b/docs/commands/mftf.md index 6992189a4..be026cd74 100644 --- a/docs/commands/mftf.md +++ b/docs/commands/mftf.md @@ -65,6 +65,20 @@ suiteName:testInSuite vendor/bin/mftf generate:tests WYSIWYGDisabledSuite:AdminCMSPageCreatePageTest ``` +### Generate test dependencies + +```bash +vendor/bin/mftf generate:tests -l testEntityJson +``` + +This command generate json file consist of all test dependent module. + +### Generate test dependencies by test name + +```bash +vendor/bin/mftf generate:tests testName1 testName2 .. testNameN -l testEntityJson +``` + ### Generate and run the tests for a specified group ```bash @@ -183,17 +197,18 @@ vendor/bin/mftf generate:tests [option] [] [] [--remove] #### Options -| 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: `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.
Example: `generate:tests --config=parallel --time=15`
Option `--time` will be the default and the __default value__ is `10` when neither `--time` nor `--groups` is specified.
Example: `generate:tests --config=parallel`| -| `-g,--groups` | Set number of groups to be split into when `--config=parallel` is used.
Example: `generate:tests --config=parallel --groups=300`
Options `--time` and `--groups` are mutually exclusive and only one should be used.| -| `--tests` | Defines the test configuration as a JSON string or JSON file path.| -| `--allow-skipped` | Allows MFTF to generate and run tests marked with `.`| -| `--debug` | Performs schema validations on XML files.
DEFAULT: `generate:tests` implicitly performs schema validation on merged files. It does not indicate the file name where the error is encountered.
DEVELOPER: `--debug` performs per-file validation and returns additional debug information (such as the filename where an error occurred) when test generation fails because of an invalid XML schema. This option takes extra processing time. Use it after test generation has failed once.
| -| `-r,--remove`| Removes the existing generated suites and tests cleaning up the `_generated` directory before the actual run. For example, `generate:tests SampleTest --remove` cleans up the entire `_generated` directory and generates `SampleTest` only.| +| 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: `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.
Example: `generate:tests --config=parallel --time=15`
Option `--time` will be the default and the __default value__ is `10` when neither `--time` nor `--groups` is specified.
Example: `generate:tests --config=parallel` | +| `-g,--groups` | Set number of groups to be split into when `--config=parallel` is used.
Example: `generate:tests --config=parallel --groups=300`
Options `--time` and `--groups` are mutually exclusive and only one should be used. | +| `--tests` | Defines the test configuration as a JSON string or JSON file path. | +| `--allow-skipped` | Allows MFTF to generate and run tests marked with `.` | +| `--debug` | Performs schema validations on XML files.
DEFAULT: `generate:tests` implicitly performs schema validation on merged files. It does not indicate the file name where the error is encountered.
DEVELOPER: `--debug` performs per-file validation and returns additional debug information (such as the filename where an error occurred) when test generation fails because of an invalid XML schema. This option takes extra processing time. Use it after test generation has failed once.
| +| `-r,--remove` | Removes the existing generated suites and tests cleaning up the `_generated` directory before the actual run. For example, `generate:tests SampleTest --remove` cleans up the entire `_generated` directory and generates `SampleTest` only. | +| `-l,--log` | Generate metadata files during test generation. Accepted parameters are: testEntityJson. | #### Examples of the JSON configuration diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index 2bb5b8091..dc5e18f75 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -11,18 +11,23 @@ use Magento\FunctionalTestingFramework\Exceptions\FastFailException; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; +use Magento\FunctionalTestingFramework\Exceptions\XmlException; use Magento\FunctionalTestingFramework\Suite\SuiteGenerator; use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; +use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; use Magento\FunctionalTestingFramework\Util\Manifest\ParallelByTimeTestManifest; use Magento\FunctionalTestingFramework\Util\Manifest\TestManifestFactory; +use Magento\FunctionalTestingFramework\Util\Script\ScriptUtil; +use Magento\FunctionalTestingFramework\Util\Script\TestDependencyUtil; use Magento\FunctionalTestingFramework\Util\TestGenerator; 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 Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Finder\Finder; /** * @SuppressWarnings(PHPMD) @@ -30,6 +35,34 @@ class GenerateTestsCommand extends BaseGenerateCommand { const PARALLEL_DEFAULT_TIME = 10; + const EXTENDS_REGEX_PATTERN = '/extends=["\']([^\'"]*)/'; + const ACTIONGROUP_REGEX_PATTERN = '/ref=["\']([^\'"]*)/'; + const TEST_DEPENDENCY_FILE_LOCATION = 'dev/tests/_output/test-dependencies.json'; + + /** + * @var ScriptUtil + */ + private $scriptUtil; + + /** + * @var TestDependencyUtil + */ + private $testDependencyUtil; + + /** + * @var array + */ + private $moduleNameToPath; + + /** + * @var array + */ + private $moduleNameToComposerName; + + /** + * @var array + */ + private $flattenedDependencies; /** * Configures the current command. @@ -85,6 +118,11 @@ protected function configure() 'p', InputOption::VALUE_REQUIRED, 'path to a test names file.', + )->addOption( + 'log', + 'l', + InputOption::VALUE_REQUIRED, + 'Generate metadata files during test generation.', ); parent::configure(); @@ -98,6 +136,7 @@ protected function configure() * @return void|integer * @throws TestFrameworkException * @throws FastFailException + * @throws XmlException */ protected function execute(InputInterface $input, OutputInterface $output) { @@ -113,16 +152,19 @@ protected function execute(InputInterface $input, OutputInterface $output) $remove = $input->getOption('remove'); $verbose = $output->isVerbose(); $allowSkipped = $input->getOption('allow-skipped'); + $log = $input->getOption('log'); $filters = $input->getOption('filter'); foreach ($filters as $filter) { list($filterType, $filterValue) = explode(':', $filter); $filterList[$filterType][] = $filterValue; } + $path = $input->getOption('path'); // check filepath is given for generate test file if (!empty($path)) { $tests = $this->generateTestFileFromPath($path); } + // Set application configuration so we can references the user options in our framework try { MftfApplicationConfig::create( @@ -204,6 +246,20 @@ protected function execute(InputInterface $input, OutputInterface $output) return 1; } + // check test dependencies log command + if (!empty($log)) { + if ($log === "testEntityJson") { + $this->getTestEntityJson($tests); + $output->writeln( + "Test dependencies file created, Located in: " . self::TEST_DEPENDENCY_FILE_LOCATION + ); + } else { + $output->writeln( + "Wrong parameter for log (-l) option, accepted parameter are: testEntityJson" . PHP_EOL + ); + } + } + if (empty(GenerationErrorHandler::getInstance()->getAllErrors())) { $output->writeln("Generate Tests Command Run" . PHP_EOL); return 0; @@ -326,6 +382,200 @@ private function parseConfigParallelOptions($time, $groups) } } + /** + * console command options --log and create test dependencies in json file + * @return void + * @throws TestFrameworkException + * @throws XmlException|FastFailException + */ + private function getTestEntityJson(array $tests = []) + { + $testDependencies = $this->getTestDependencies($tests); + $this->array2Json($testDependencies); + } + + /** + * Function responsible for getting test dependencies in array + * @param array $tests + * @return array + * @throws FastFailException + * @throws TestFrameworkException + * @throws XmlException + */ + public function getTestDependencies(array $tests = []): array + { + $this->scriptUtil = new ScriptUtil(); + $this->testDependencyUtil = new TestDependencyUtil(); + $allModules = $this->scriptUtil->getAllModulePaths(); + + if (!class_exists('\Magento\Framework\Component\ComponentRegistrar')) { + throw new TestFrameworkException( + "TEST DEPENDENCY CHECK ABORTED: MFTF must be attached or pointing to Magento codebase." + ); + } + $registrar = new \Magento\Framework\Component\ComponentRegistrar(); + $this->moduleNameToPath = $registrar->getPaths(\Magento\Framework\Component\ComponentRegistrar::MODULE); + $this->moduleNameToComposerName = $this->testDependencyUtil->buildModuleNameToComposerName( + $this->moduleNameToPath + ); + $this->flattenedDependencies = $this->testDependencyUtil->buildComposerDependencyList( + $this->moduleNameToPath, + $this->moduleNameToComposerName + ); + + if (!empty($tests)) { + # specific test dependencies will be generate. + $testXmlFiles = $this->scriptUtil->getModuleXmlFilesByTestNames($tests); + } else { + $filePaths = [ + DIRECTORY_SEPARATOR . 'Test' . DIRECTORY_SEPARATOR + ]; + // These files can contain references to other modules. + $testXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($allModules, $filePaths[0]); + } + + list($testDependencies, $extendedTestMapping) = $this->findTestDependentModule($testXmlFiles); + return $this->testDependencyUtil->mergeDependenciesForExtendingTests($testDependencies, $extendedTestMapping); + } + + /** + * Finds all test dependencies in given set of files + * @param Finder $files + * @return array + * @throws FastFailException + * @throws XmlException + */ + private function findTestDependentModule(Finder $files): array + { + $testDependencies = []; + $extendedTests = []; + $extendedTestMapping = []; + foreach ($files as $filePath) { + $allEntities = []; + $filePath = $filePath->getPathname(); + $moduleName = $this->testDependencyUtil->getModuleName($filePath, $this->moduleNameToPath); + // Not a module, is either dev/tests/acceptance or loose folder with test materials + if ($moduleName == null) { + continue; + } + + $contents = file_get_contents($filePath); + preg_match_all(ActionObject::ACTION_ATTRIBUTE_VARIABLE_REGEX_PATTERN, $contents, $braceReferences); + preg_match_all(self::ACTIONGROUP_REGEX_PATTERN, $contents, $actionGroupReferences); + preg_match_all(self::EXTENDS_REGEX_PATTERN, $contents, $extendReferences); + + // Remove Duplicates + $braceReferences[0] = array_unique($braceReferences[0]); + $actionGroupReferences[1] = array_unique($actionGroupReferences[1]); + $braceReferences[1] = array_unique($braceReferences[1]); + $braceReferences[2] = array_filter(array_unique($braceReferences[2])); + + // resolve entity references + $allEntities = array_merge( + $allEntities, + $this->scriptUtil->resolveEntityReferences($braceReferences[0], $contents) + ); + + // resolve parameterized references + $allEntities = array_merge( + $allEntities, + $this->scriptUtil->resolveParametrizedReferences($braceReferences[2], $contents) + ); + + // resolve entity by names + $allEntities = array_merge( + $allEntities, + $this->scriptUtil->resolveEntityByNames($actionGroupReferences[1]) + ); + + // resolve entity by names + $allEntities = array_merge( + $allEntities, + $this->scriptUtil->resolveEntityByNames($extendReferences[1]) + ); + $modulesReferencedInTest = $this->testDependencyUtil->getModuleDependenciesFromReferences( + $allEntities, + $this->moduleNameToComposerName, + $this->moduleNameToPath + ); + if (! empty($modulesReferencedInTest)) { + $document = new \DOMDocument(); + $document->loadXML($contents); + $test_file = $document->getElementsByTagName('test')->item(0); + $test_name = $test_file->getAttribute('name'); + + # check any test extends on with this test. + $extended_test = $test_file->getAttribute('extends') ?? ""; + if (!empty($extended_test)) { + $extendedTests[] = $extended_test; + $extendedTestMapping[] = ["child_test_name" =>$test_name, "parent_test_name" =>$extended_test]; + } + + $flattenedDependencyMap = array_values( + array_unique(call_user_func_array('array_merge', array_values($modulesReferencedInTest))) + ); + $suite_name = $this->getSuiteName($test_name); + $full_name = "Magento\AcceptanceTest\_". $suite_name. "\Backend\\".$test_name."Cest.".$test_name; + $dependencyMap = [ + "file_path" => $filePath, + "full_name" => $full_name, + "test_name" => $test_name, + "test_modules" => $flattenedDependencyMap, + ]; + $testDependencies[] = $dependencyMap; + } + } + + if (!empty($extendedTests)) { + list($extendedDependencies, $tempExtendedTestMapping) = $this->getExtendedTestDependencies($extendedTests); + $testDependencies = array_merge($testDependencies, $extendedDependencies); + $extendedTestMapping = array_merge($extendedTestMapping, $tempExtendedTestMapping); + } + + return [$testDependencies, $extendedTestMapping]; + } + + /** + * Finds all extended test dependencies in given set of files + * @param array $extendedTests + * @return array + * @throws FastFailException + * @throws XmlException + */ + private function getExtendedTestDependencies(array $extendedTests): array + { + $testXmlFiles = $this->scriptUtil->getModuleXmlFilesByTestNames($extendedTests); + return $this->findTestDependentModule($testXmlFiles); + } + + /** + * Create json file of test dependencies + * @param array $array + * @return void + */ + private function array2Json(array $array) + { + $file = fopen(self::TEST_DEPENDENCY_FILE_LOCATION, 'w'); + $json = json_encode($array, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); + fwrite($file, $json); + fclose($file); + } + + /** + * Get suite name. + * @param string $test_name + * @return integer|mixed|string + * @throws FastFailException + */ + private function getSuiteName(string $test_name) + { + $suite_name = json_decode($this->getTestAndSuiteConfiguration([$test_name]), true)["suites"] ?? "default"; + if (is_array($suite_name)) { + $suite_name = array_keys($suite_name)[0]; + } + return $suite_name; + } + /** * @param string $path * @return array diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php index 556d30d28..848b2c463 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php @@ -13,6 +13,7 @@ use Symfony\Component\Finder\Finder; use Exception; use Magento\FunctionalTestingFramework\Util\Script\ScriptUtil; +use Magento\FunctionalTestingFramework\Util\Script\TestDependencyUtil; /** * Class TestDependencyCheck @@ -26,12 +27,6 @@ class TestDependencyCheck implements StaticCheckInterface const ERROR_LOG_FILENAME = 'mftf-dependency-checks'; const ERROR_LOG_MESSAGE = 'MFTF File Dependency Check'; - /** - * Array of FullModuleName => [dependencies] - * @var array - */ - private $allDependencies; - /** * Array of FullModuleName => [dependencies], including flattened dependency tree * @var array @@ -50,12 +45,6 @@ class TestDependencyCheck implements StaticCheckInterface */ private $moduleNameToComposerName; - /** - * Transactional Array to keep track of what dependencies have already been extracted. - * @var array - */ - private $alreadyExtractedDependencies; - /** * Array containing all errors found after running the execute() function. * @var array @@ -81,6 +70,11 @@ class TestDependencyCheck implements StaticCheckInterface */ private $scriptUtil; + /** + * @var TestDependencyUtil + */ + private $testDependencyUtil; + /** * Checks test dependencies, determined by references in tests versus the dependencies listed in the Magento module * @@ -91,6 +85,7 @@ class TestDependencyCheck implements StaticCheckInterface public function execute(InputInterface $input) { $this->scriptUtil = new ScriptUtil(); + $this->testDependencyUtil = new TestDependencyUtil(); $allModules = $this->scriptUtil->getAllModulePaths(); if (!class_exists('\Magento\Framework\Component\ComponentRegistrar')) { @@ -100,8 +95,13 @@ public function execute(InputInterface $input) } $registrar = new \Magento\Framework\Component\ComponentRegistrar(); $this->moduleNameToPath = $registrar->getPaths(\Magento\Framework\Component\ComponentRegistrar::MODULE); - $this->moduleNameToComposerName = $this->buildModuleNameToComposerName($this->moduleNameToPath); - $this->flattenedDependencies = $this->buildComposerDependencyList(); + $this->moduleNameToComposerName = $this->testDependencyUtil->buildModuleNameToComposerName( + $this->moduleNameToPath + ); + $this->flattenedDependencies = $this->testDependencyUtil->buildComposerDependencyList( + $this->moduleNameToPath, + $this->moduleNameToComposerName + ); $filePaths = [ DIRECTORY_SEPARATOR . 'Test' . DIRECTORY_SEPARATOR, @@ -130,7 +130,7 @@ public function execute(InputInterface $input) * Return array containing all errors found after running the execute() function. * @return array */ - public function getErrors() + public function getErrors(): array { return $this->errors; } @@ -139,7 +139,7 @@ public function getErrors() * Return string of a short human readable result of the check. For example: "No Dependency errors found." * @return string */ - public function getOutput() + public function getOutput(): string { return $this->output; } @@ -150,12 +150,12 @@ public function getOutput() * @return array * @throws XmlException */ - private function findErrorsInFileSet($files) + private function findErrorsInFileSet(Finder $files): array { $testErrors = []; foreach ($files as $filePath) { $this->allEntities = []; - $moduleName = $this->getModuleName($filePath); + $moduleName = $this->testDependencyUtil->getModuleName($filePath, $this->moduleNameToPath); // Not a module, is either dev/tests/acceptance or loose folder with test materials if ($moduleName === null) { continue; @@ -209,12 +209,16 @@ private function findErrorsInFileSet($files) * @param string $moduleName * @return array */ - private function findViolatingReferences($moduleName) + private function findViolatingReferences(string $moduleName): array { // Find Violations $violatingReferences = []; $currentModule = $this->moduleNameToComposerName[$moduleName]; - $modulesReferencedInTest = $this->getModuleDependenciesFromReferences($this->allEntities); + $modulesReferencedInTest = $this->testDependencyUtil->getModuleDependenciesFromReferences( + $this->allEntities, + $this->moduleNameToComposerName, + $this->moduleNameToPath + ); $moduleDependencies = $this->flattenedDependencies[$moduleName]; foreach ($modulesReferencedInTest as $entityName => $files) { $valid = false; @@ -235,11 +239,10 @@ private function findViolatingReferences($moduleName) /** * Builds and returns error output for violating references * - * @param array $violatingReferences - * @param string $path - * @return mixed + * @param array $violatingReferences + * @return array */ - private function setErrorOutput($violatingReferences, $path) + private function setErrorOutput(array $violatingReferences, $path): array { $testErrors = []; @@ -255,111 +258,4 @@ private function setErrorOutput($violatingReferences, $path) return $testErrors; } - - /** - * Builds and returns array of FullModuleNae => composer name - * @param array $array - * @return array - */ - private function buildModuleNameToComposerName($array) - { - $returnList = []; - foreach ($array as $moduleName => $path) { - $composerData = json_decode(file_get_contents($path . DIRECTORY_SEPARATOR . "composer.json")); - $returnList[$moduleName] = $composerData->name; - } - return $returnList; - } - - /** - * Builds and returns flattened dependency list based on composer dependencies - * @return array - */ - private function buildComposerDependencyList() - { - $flattenedDependencies = []; - - foreach ($this->moduleNameToPath as $moduleName => $pathToModule) { - $composerData = json_decode( - file_get_contents($pathToModule . DIRECTORY_SEPARATOR . "composer.json"), - true - ); - $this->allDependencies[$moduleName] = $composerData['require']; - } - foreach ($this->allDependencies as $moduleName => $dependencies) { - $this->alreadyExtractedDependencies = []; - $flattenedDependencies[$moduleName] = $this->extractSubDependencies($moduleName); - } - return $flattenedDependencies; - } - - /** - * Recursive function to fetch dependencies of given dependency, and its child dependencies - * @param string $subDependencyName - * @return array - */ - private function extractSubDependencies($subDependencyName) - { - $flattenedArray = []; - - if (array_search($subDependencyName, $this->alreadyExtractedDependencies) !== false) { - return $flattenedArray; - } - - if (isset($this->allDependencies[$subDependencyName])) { - $subDependencyArray = $this->allDependencies[$subDependencyName]; - $flattenedArray = array_merge($flattenedArray, $this->allDependencies[$subDependencyName]); - - // Keep track of dependencies that have already been used, prevents circular dependency problems - $this->alreadyExtractedDependencies[] = $subDependencyName; - foreach ($subDependencyArray as $composerDependencyName => $version) { - $subDependencyFullName = array_search($composerDependencyName, $this->moduleNameToComposerName); - $flattenedArray = array_merge( - $flattenedArray, - $this->extractSubDependencies($subDependencyFullName) - ); - } - } - return $flattenedArray; - } - - /** - * Finds unique array ofcomposer dependencies of given testObjects - * @param array $array - * @return array - */ - private function getModuleDependenciesFromReferences($array) - { - $filenames = []; - foreach ($array as $item) { - // Should it append ALL filenames, including merges? - $allFiles = explode(",", $item->getFilename()); - foreach ($allFiles as $file) { - $moduleName = $this->getModuleName($file); - if (isset($this->moduleNameToComposerName[$moduleName])) { - $composerModuleName = $this->moduleNameToComposerName[$moduleName]; - $filenames[$item->getName()][] = $composerModuleName; - } - } - } - return $filenames; - } - - /** - * Return module name for a file path - * - * @param string $filePath - * @return string|null - */ - private function getModuleName($filePath) - { - $moduleName = null; - foreach ($this->moduleNameToPath as $name => $path) { - if (strpos($filePath, $path) !== false) { - $moduleName = $name; - break; - } - } - return $moduleName; - } } diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php index 745ab53fe..e7fb1075f 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php @@ -5,6 +5,7 @@ */ namespace Magento\FunctionalTestingFramework\Util\Script; +use Exception; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException; use Magento\FunctionalTestingFramework\Exceptions\XmlException; @@ -40,7 +41,7 @@ class ScriptUtil * @return array * @throws TestFrameworkException */ - public function getAllModulePaths() + public function getAllModulePaths(): array { MftfApplicationConfig::create( true, @@ -60,7 +61,7 @@ public function getAllModulePaths() * @param string $message * @return string */ - public function printErrorsToFile($errors, $filePath, $message) + public function printErrorsToFile(array $errors, string $filePath, string $message): string { if (empty($errors)) { return $message . ": No errors found."; @@ -91,7 +92,7 @@ public function printErrorsToFile($errors, $filePath, $message) * @param string $scope * @return Finder|array */ - public function getModuleXmlFilesByScope($modulePaths, $scope) + public function getModuleXmlFilesByScope(array $modulePaths, string $scope) { $found = false; $scopePath = DIRECTORY_SEPARATOR . ucfirst($scope) . DIRECTORY_SEPARATOR; @@ -178,7 +179,6 @@ public function resolveEntityReferences($braceReferences, $contents, $resolveSec // 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; @@ -200,7 +200,7 @@ public function resolveEntityReferences($braceReferences, $contents, $resolveSec * @throws XmlException * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - public function resolveParametrizedReferences($braceReferences, $contents, $resolveSectionElement = false) + public function resolveParametrizedReferences($braceReferences, $contents, $resolveSectionElement = false): array { $entities = []; foreach ($braceReferences as $parameterizedReference) { @@ -232,7 +232,6 @@ public function resolveParametrizedReferences($braceReferences, $contents, $reso // 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; @@ -252,7 +251,7 @@ public function resolveParametrizedReferences($braceReferences, $contents, $reso * @return array * @throws XmlException */ - public function resolveEntityByNames($references) + public function resolveEntityByNames(array $references): array { $entities = []; foreach ($references as $reference) { @@ -270,8 +269,9 @@ public function resolveEntityByNames($references) * @param string $name * @return mixed * @throws XmlException + * @throws Exception */ - public function findEntity($name) + public function findEntity(string $name) { if ($name === '_ENV' || $name === '_CREDS') { return null; @@ -293,4 +293,20 @@ public function findEntity($name) } return null; } + + /** + * Return all XML files in given test name, empty array if no path is valid + * @param array $testNames + * @return array|Finder + */ + public function getModuleXmlFilesByTestNames(array $testNames) + { + $finder = new Finder(); + array_walk($testNames, function (&$value) { + $value = $value . ".xml"; + }); + $finder->files()->followLinks()->in(MAGENTO_BP)->name($testNames)->sortByName(); + + return $finder->files() ?? []; + } } diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php new file mode 100644 index 000000000..0fbf566a7 --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -0,0 +1,184 @@ + [dependencies] + * @var array + */ + private $allDependencies; + + /** + * Transactional Array to keep track of what dependencies have already been extracted. + * @var array + */ + private $alreadyExtractedDependencies; + + /** + * Builds and returns array of FullModuleNae => composer name + * @param array $moduleNameToPath + * @return array + */ + public function buildModuleNameToComposerName(array $moduleNameToPath): array + { + $moduleNameToComposerName = []; + foreach ($moduleNameToPath as $moduleName => $path) { + $composerData = json_decode(file_get_contents($path . DIRECTORY_SEPARATOR . "composer.json")); + $moduleNameToComposerName[$moduleName] = $composerData->name; + } + return $moduleNameToComposerName; + } + + /** + * Builds and returns flattened dependency list based on composer dependencies + * @param array $moduleNameToPath + * @param array $moduleNameToComposerName + * @return array + */ + public function buildComposerDependencyList(array $moduleNameToPath, array $moduleNameToComposerName): array + { + $flattenedDependencies = []; + + foreach ($moduleNameToPath as $moduleName => $pathToModule) { + $composerData = json_decode( + file_get_contents($pathToModule . DIRECTORY_SEPARATOR . "composer.json"), + true + ); + $this->allDependencies[$moduleName] = $composerData['require']; + } + foreach ($this->allDependencies as $moduleName => $dependencies) { + $this->alreadyExtractedDependencies = []; + $flattenedDependencies[$moduleName] = $this->extractSubDependencies($moduleName, $moduleNameToComposerName); + } + return $flattenedDependencies; + } + + /** + * Recursive function to fetch dependencies of given dependency, and its child dependencies + * @param string $subDependencyName + * @param array $moduleNameToComposerName + * @return array + */ + private function extractSubDependencies(string $subDependencyName, array $moduleNameToComposerName): array + { + $flattenedArray = []; + + if (in_array($subDependencyName, $this->alreadyExtractedDependencies)) { + return $flattenedArray; + } + + if (isset($this->allDependencies[$subDependencyName])) { + $subDependencyArray = $this->allDependencies[$subDependencyName]; + $flattenedArray = array_merge($flattenedArray, $this->allDependencies[$subDependencyName]); + + // Keep track of dependencies that have already been used, prevents circular dependency problems + $this->alreadyExtractedDependencies[] = $subDependencyName; + foreach ($subDependencyArray as $composerDependencyName => $version) { + $subDependencyFullName = array_search($composerDependencyName, $moduleNameToComposerName); + $flattenedArray = array_merge( + $flattenedArray, + $this->extractSubDependencies($subDependencyFullName, $moduleNameToComposerName) + ); + } + } + return $flattenedArray; + } + + /** + * Finds unique array composer dependencies of given testObjects + * @param array $allEntities + * @param array $moduleComposerName + * @param array $moduleNameToPath + * @return array + */ + public function getModuleDependenciesFromReferences( + array $allEntities, + array $moduleComposerName, + array $moduleNameToPath + ): array { + $filenames = []; + foreach ($allEntities as $item) { + // Should it append ALL filenames, including merges? + $allFiles = explode(",", $item->getFilename()); + foreach ($allFiles as $file) { + $moduleName = $this->getModuleName($file, $moduleNameToPath); + if (isset($moduleComposerName[$moduleName])) { + $composerModuleName = $moduleComposerName[$moduleName]; + $filenames[$item->getName()][] = $composerModuleName; + } + } + } + return $filenames; + } + + /** + * Return module name for a file path + * + * @param string $filePath + * @param array $moduleNameToPath + * @return string|null + */ + public function getModuleName(string $filePath, array $moduleNameToPath): ?string + { + $moduleName = null; + foreach ($moduleNameToPath as $name => $path) { + if (strpos($filePath, $path. "/") !== false) { + $moduleName = $name; + break; + } + } + return $moduleName; + } + + /** + * Return array of merge test modules and file path with same test name. + * @param array $testDependencies + * @param array $extendedTestMapping + * @return array + */ + public function mergeDependenciesForExtendingTests(array $testDependencies, array $extendedTestMapping = []): array + { + $temp_array = array_reverse(array_column($testDependencies, "test_name"), true); + if (!empty($extendedTestMapping)) { + foreach ($extendedTestMapping as $value) { + $key = array_search($value["parent_test_name"], $temp_array); + if ($key !== false) { + #if parent test found merge this to child, for doing so just replace test name with child. + $testDependencies[$key]["test_name"] = $value["child_test_name"]; + } + } + } + $temp_array = []; + foreach ($testDependencies as $testDependency) { + $temp_array[$testDependency["test_name"]][] = $testDependency; + } + $testDependencies = []; + foreach ($temp_array as $testDependencyArray) { + $testDependencies[] = [ + "file_path" => array_column($testDependencyArray, 'file_path'), + "full_name" => $testDependencyArray[0]["full_name"], + "test_name" => $testDependencyArray[0]["test_name"], + "test_modules" =>array_values( + array_unique( + call_user_func_array( + 'array_merge', + array_column($testDependencyArray, 'test_modules') + ) + ) + ), + ]; + } + return $testDependencies; + } +} From ac48cf067f3fbc3006afc81d2a78dd30af5c83b5 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Sat, 23 Apr 2022 00:27:56 +0530 Subject: [PATCH 205/674] Mqe 3371 : Added unit test for unused entity static check and added ignore tag (#180) * static check * unused entity * made changes * Added ignore tag and unit test * Added ignore tag and unit test * Updated Section in devdocs with unused entity tag Co-authored-by: Manjusha.S --- .../MFTF/DevDocs/Section/ContentSection.xml | 2 + .../Util/UnusedEntityCheckTest.php | 190 ++++++++++++++++++ .../StaticCheck/UnusedEntityCheck.php | 76 +++---- 3 files changed, 218 insertions(+), 50 deletions(-) create mode 100644 dev/tests/unit/Magento/FunctionalTestFramework/Util/UnusedEntityCheckTest.php diff --git a/dev/tests/functional/tests/MFTF/DevDocs/Section/ContentSection.xml b/dev/tests/functional/tests/MFTF/DevDocs/Section/ContentSection.xml index e0a133d51..a365c9ff5 100644 --- a/dev/tests/functional/tests/MFTF/DevDocs/Section/ContentSection.xml +++ b/dev/tests/functional/tests/MFTF/DevDocs/Section/ContentSection.xml @@ -6,6 +6,8 @@ */ --> + +
diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/UnusedEntityCheckTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/UnusedEntityCheckTest.php new file mode 100644 index 000000000..c7a170d86 --- /dev/null +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/UnusedEntityCheckTest.php @@ -0,0 +1,190 @@ +unusedEntities(); + $this->assertIsArray($result); + } + + public function testUnusedActiongroupFiles() + { + $unusedEntityCheck = new UnusedEntityCheck(); + $domDocument = new \DOMDocument(); + $actionGroupFiles = ['DeprecationCheckActionGroup' => + '/verification/DeprecationCheckModule/ActionGroup/DeprecationCheckActionGroup.xml', + 'ActionGroupWithMultiplePausesActionGroup'=> + '/verification/PauseCheckModule/ActionGroup/ActionGroupWithMultiplePausesActionGroup.xml', + 'ActionGroupWithNoPauseActionGroup'=> + '/verification/PauseCheckModule/ActionGroup/ActionGroupWithNoPauseActionGroup.xml']; + $result = $unusedEntityCheck->unusedActionEntity($domDocument, [], [], $actionGroupFiles, []); + $this->assertIsArray($result); + $this->assertCount(3, $result); + } + + public function testUnusedActiongroupFilesReturnedWhenActionXmlFilesAreNotEmpty() + { + $this->scriptUtil = new ScriptUtil(); + $unusedEntityCheck = new UnusedEntityCheck(); + $domDocument = new \DOMDocument(); + $modulePaths = $this->scriptUtil->getAllModulePaths(); + $actionGroupXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "ActionGroup"); + $actionGroupFiles = ['DeprecationCheckActionGroup' => + '/verification/DeprecationCheckModule/ActionGroup/DeprecationCheckActionGroup.xml', + 'ActionGroupWithMultiplePausesActionGroup'=> + '/verification/PauseCheckModule/ActionGroup/ActionGroupWithMultiplePausesActionGroup.xml', + 'ActionGroupWithNoPauseActionGroup' => + '/verification/PauseCheckModule/ActionGroup/ActionGroupWithNoPauseActionGroup.xml']; + $result = $unusedEntityCheck->unusedActionEntity( + $domDocument, + $actionGroupXmlFiles, + [], + $actionGroupFiles, + [] + ); + $this->assertIsArray($result); + $this->assertCount(3, $result); + } + + public function testUnusedSectionFiles() + { + $unusedEntityCheck = new UnusedEntityCheck(); + $domDocument = new \DOMDocument(); + $section = [ + 'DeprecationCheckSection' => '/verification/DeprecationCheckModule/Section/DeprecationCheckSection.xml', + 'DeprecatedSection' => '/verification/TestModule/Section/DeprecatedSection.xml', + 'LocatorFunctionSection' => '/verification/TestModule/Section/LocatorFunctionSection.xml', + 'SampleSection' => '/verification/TestModuleMerged/Section/MergeSection.xml' + ]; + $result=$unusedEntityCheck->unusedSectionEntity($domDocument, [], [], [], $section, []); + $this->assertIsArray($result); + $this->assertCount(4, $result); + } + + public function testUnusedSectionFilesReturnedWhenSectionXmlFilesAreNotEmpty() + { + $unusedEntityCheck = new UnusedEntityCheck(); + $this->scriptUtil = new ScriptUtil(); + $modulePaths = $this->scriptUtil->getAllModulePaths(); + $sectionXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Section"); + + $domDocument = new \DOMDocument(); + $section = [ + 'DeprecationCheckSection' => '/verification/DeprecationCheckModule/Section/DeprecationCheckSection.xml', + 'DeprecatedSection' => '/verification/TestModule/Section/DeprecatedSection.xml', + 'LocatorFunctionSection' => '/verification/TestModule/Section/LocatorFunctionSection.xml', + 'SampleSection' => '/verification/TestModuleMerged/Section/MergeSection.xml' + ]; + $result = $unusedEntityCheck->unusedSectionEntity($domDocument, $sectionXmlFiles, [], [], $section, []); + $this->assertIsArray($result); + $this->assertCount(4, $result); + } + + public function testUnusedPageFiles() + { + $unusedEntityCheck = new UnusedEntityCheck(); + $domDocument = new \DOMDocument(); + $page = [ + 'DeprecationCheckPage' => '/verification/DeprecationCheckModule/Page/DeprecationCheckPage.xml', + 'DeprecatedPage' => '/verification/TestModule/Page/DeprecatedPage.xml', + 'AdminOneParamPage' => '/verification/TestModule/Page/SamplePage/AdminOneParamPage.xml', + 'AdminPage' => '/verification/TestModule/Page/SamplePage/AdminPage.xml', + 'ExternalPage' => '/verification/TestModule/Page/SamplePage/ExternalPage.xml', + 'NoParamPage' => '/verification/TestModule/Page/SamplePage/NoParamPage.xml' + ]; + $result = $unusedEntityCheck->unusedPageEntity($domDocument, [], [], $page, []); + $this->assertIsArray($result); + $this->assertCount(6, $result); + } + + public function testUnusedPageFilesReturnedWhenPageXmlFilesPassedAreNotEmpty() + { + $unusedEntityCheck = new UnusedEntityCheck(); + $domDocument = new \DOMDocument(); + $this->scriptUtil = new ScriptUtil(); + $modulePaths = $this->scriptUtil->getAllModulePaths(); + $pageXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Page"); + $page = [ + 'DeprecationCheckPage' => '/verification/DeprecationCheckModule/Page/DeprecationCheckPage.xml', + 'DeprecatedPage' => '/verification/TestModule/Page/DeprecatedPage.xml', + 'AdminOneParamPage' => '/verification/TestModule/Page/SamplePage/AdminOneParamPage.xml', + 'AdminPage' => '/verification/TestModule/Page/SamplePage/AdminPage.xml', + 'ExternalPage' => '/verification/TestModule/Page/SamplePage/ExternalPage.xml', + 'NoParamPage' => '/verification/TestModule/Page/SamplePage/NoParamPage.xml' + ]; + $result = $unusedEntityCheck->unusedPageEntity($domDocument, $pageXmlFiles, [], $page, []); + $this->assertIsArray($result); + $this->assertCount(6, $result); + } + + public function testUnusedData() + { + $unusedEntityCheck = new UnusedEntityCheck(); + $domDocument = new \DOMDocument(); + $data = [ + "simpleData" => + [ + "dataFilePath" => "/verification/TestModule/Data/ReplacementData.xml" + ], + + "uniqueData" => [ + + "dataFilePath" => "/verification/TestModule/Data/ReplacementData.xml" + ], + + "offset"=> + [ + "dataFilePath" => "/verification/TestModule/Data/ReplacementData.xml" + ] + ]; + $result=$unusedEntityCheck->unusedPageEntity($domDocument, [], [], $data, []); + $this->assertIsArray($result); + $this->assertCount(3, $result); + } + + public function testUnusedDataReturnedWhenCreateDataEntityAreNotEmpty() + { + $unusedEntityCheck = new UnusedEntityCheck(); + $domDocument = new \DOMDocument(); + $this->scriptUtil = new ScriptUtil(); + $modulePaths = $this->scriptUtil->getAllModulePaths(); + $dataXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Data"); + $data = [ + "simpleData" => + [ + "dataFilePath" => "/verification/TestModule/Data/ReplacementData.xml" + ], + + "uniqueData" => [ + + "dataFilePath" => "/verification/TestModule/Data/ReplacementData.xml" + ], + + "offset" => + [ + "dataFilePath" => "/verification/TestModule/Data/ReplacementData.xml" + ] + ]; + $result = $unusedEntityCheck->unusedPageEntity($domDocument, $dataXmlFiles, [], $data, []); + $this->assertIsArray($result); + $this->assertCount(3, $result); + } +} diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/UnusedEntityCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/UnusedEntityCheck.php index 72c5ea801..50a348db0 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/UnusedEntityCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/UnusedEntityCheck.php @@ -46,24 +46,7 @@ class UnusedEntityCheck implements StaticCheckInterface */ public function execute(InputInterface $input) { - $this->scriptUtil = new ScriptUtil(); - $domDocument = new \DOMDocument(); - $modulePaths = $this->scriptUtil->getAllModulePaths(); - $testXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Test"); - $actionGroupXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "ActionGroup"); - $dataXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Data"); - $pageXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Page"); - $sectionXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Section"); - $suiteXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'Suite'); - $this->errors = $this->unusedEntities( - $domDocument, - $dataXmlFiles, - $actionGroupXmlFiles, - $sectionXmlFiles, - $pageXmlFiles, - $testXmlFiles, - $suiteXmlFiles - ); + $this->errors = $this->unusedEntities(); $this->output = $this->scriptUtil->printErrorsToFile( $this->errors, StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', @@ -73,26 +56,19 @@ public function execute(InputInterface $input) /** * Centralized method to get unused Entities - * - * @param DOMDocument $domDocument - * @param ScriptUtil $dataXmlFiles - * @param ScriptUtil $actionGroupXmlFiles - * @param ScriptUtil $sectionXmlFiles - * @param ScriptUtil $pageXmlFiles - * @param ScriptUtil $testXmlFiles - * @param ScriptUtil $suiteXmlFiles * @return array - * @throws Exception */ - private function unusedEntities( - $domDocument, - $dataXmlFiles, - $actionGroupXmlFiles, - $sectionXmlFiles, - $pageXmlFiles, - $testXmlFiles, - $suiteXmlFiles - ) { + public function unusedEntities() + { + $this->scriptUtil = new ScriptUtil(); + $domDocument = new \DOMDocument(); + $modulePaths = $this->scriptUtil->getAllModulePaths(); + $testXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Test"); + $actionGroupXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "ActionGroup"); + $dataXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Data"); + $pageXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Page"); + $sectionXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Section"); + $suiteXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'Suite'); foreach ($dataXmlFiles as $filePath) { $domDocument->load($filePath); $entityResult = $this->getAttributesFromDOMNodeList( @@ -101,7 +77,7 @@ private function unusedEntities( ); foreach ($entityResult as $entitiesResultData) { $dataNames[$entitiesResultData[key($entitiesResultData)]] = [ - "dataFilePath"=>StaticChecksList::getFilePath($filePath->getRealPath()) + "dataFilePath"=>$filePath->getRealPath() ]; } } @@ -112,21 +88,18 @@ private function unusedEntities( continue; } $allActionGroupFileNames[$actionGroupName ] = - StaticChecksList::getFilePath($filePath->getRealPath()); + $filePath->getRealPath(); } foreach ($sectionXmlFiles as $filePath) { $domDocument->load($filePath); $sectionName = $domDocument->getElementsByTagName("section")->item(0)->getAttribute("name"); - $sectionFileNames[$sectionName] = StaticChecksList::getFilePath($filePath->getRealPath()); + $sectionFileNames[$sectionName] = $filePath->getRealPath(); } - foreach ($pageXmlFiles as $filePath) { $domDocument->load($filePath); $pageName = $domDocument->getElementsByTagName("page")->item(0)->getAttribute("name"); - $pageFiles[$pageName] = StaticChecksList::getFilePath( - $filePath->getRealPath() - ); + $pageFiles[$pageName] = $filePath->getRealPath(); } $actionGroupReferences = $this->unusedActionEntity( $domDocument, @@ -166,6 +139,7 @@ private function unusedEntities( ) ); } + /** * Setting error message * @@ -176,9 +150,11 @@ private function setErrorOutput($unusedFilePath) { $testErrors = []; foreach ($unusedFilePath as $files) { - $errorOutput = " Unused Entity File Path "; - $errorOutput .= "\n\t".$files."\t\n"; - $testErrors[$files][] = $errorOutput; + $contents = file_get_contents($files); + $file = fopen($files, 'a'); + if (!str_contains($contents, '')) { + fwrite($file, ''); + } } return $testErrors; } @@ -194,7 +170,7 @@ private function setErrorOutput($unusedFilePath) * @return array * @throws Exception */ - private function unusedActionEntity( + public function unusedActionEntity( $domDocument, $actionGroupXmlFiles, $testXmlFiles, @@ -244,7 +220,7 @@ private function unusedActionEntity( * @return array * @throws Exception */ - private function unusedPageEntity($domDocument, $actionGroupXmlFiles, $testXmlFiles, $pageNames, $suiteXmlFiles) + public function unusedPageEntity($domDocument, $actionGroupXmlFiles, $testXmlFiles, $pageNames, $suiteXmlFiles) { foreach ($suiteXmlFiles as $filePath) { @@ -366,7 +342,7 @@ private function entityReferencePatternCheck($domDocument, $fileNames, $contents * @return array * @throws Exception */ - private function unusedSectionEntity( + public function unusedSectionEntity( $domDocument, $actionGroupXmlFiles, $testXmlFiles, @@ -504,7 +480,7 @@ private function getUnusedSectionEntitiesReferenceInActionGroupAndTestFiles( * @param DOMDocument $domDocument * @return array */ - private function unusedData( + public function unusedData( $domDocument, $actionGroupXmlFiles, $testXmlFiles, From 75b1e08d203e6075b88cd61ff95140b17b7ef339 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 3 May 2022 20:25:09 +0530 Subject: [PATCH 206/674] MQE-3402 : Updated docs for new location of password (#188) * MQE-3402 : Updated docs for new location of password * updated doc * Updated getting started docs * MQE-3402 : Updated docs for new location of password Co-authored-by: Manjusha.S Co-authored-by: Kevin Kozan --- docs/credentials.md | 10 ++++++++++ docs/getting-started.md | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/credentials.md b/docs/credentials.md index 0c6decb41..56f1ddbc4 100644 --- a/docs/credentials.md +++ b/docs/credentials.md @@ -53,6 +53,16 @@ magento/carriers_usps_password=Lmgxvrq89uPwECeV # Credentials for the DHL service #magento/carriers_dhl_id_us=dhl_test_user #magento/carriers_dhl_password_us=Mlgxv3dsagVeG +.... +``` +### Add key and value pair for admin password . +magento/MAGENTO_ADMIN_PASSWORD must contain the user password required for authorization in the Admin area. Example: magento/MAGENTO_ADMIN_PASSWORD=mycustompassword + +```conf +... +# Admin password +magento/MAGENTO_ADMIN_PASSWORD =123123q + .... ``` diff --git a/docs/getting-started.md b/docs/getting-started.md index ad6fa766a..f895ebe5a 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -205,8 +205,7 @@ Specify the following parameters, which are required to launch tests: - `MAGENTO_ADMIN_USERNAME` must contain the username required for authorization in the Admin area. Example: `MAGENTO_ADMIN_USERNAME=admin` -- `MAGENTO_ADMIN_PASSWORD` must contain the user password required for authorization in the Admin area. - Example: `MAGENTO_ADMIN_PASSWORD=123123q` +- `MAGENTO_ADMIN_PASSWORD` must now be set up in the credentials file. See [Credentials Page][] for details.
If the `MAGENTO_BASE_URL` contains a subdirectory like `http://magento.test/magento2ce`, specify `MAGENTO_CLI_COMMAND_PATH`. @@ -366,3 +365,4 @@ allure serve dev/tests/_output/allure-results/ [Find your version]: introduction.html#find-your-mftf-version [Installation Guide docroot]: https://devdocs.magento.com/guides/v2.4/install-gde/tutorials/change-docroot-to-pub.html [Magento Two-Factor Authentication (2FA) extension]: https://devdocs.magento.com/guides/v2.4/security/two-factor-authentication.html +[Credentials Page]: https://devdocs.magento.com/mftf/docs/credentials.html From 7f8a8c3f64b39e3a27071da06cdfcda4d85c7fe7 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Wed, 4 May 2022 16:51:22 -0500 Subject: [PATCH 207/674] MQE-3447: Remove any remaining usages of Travis CI from MFTF Repo --- .github/CONTRIBUTING.md | 3 +-- .github/PULL_REQUEST_TEMPLATE.md | 2 +- README.md | 2 -- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 9a38dfc65..b037250ef 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -52,7 +52,7 @@ This gives Adobe permission to redistribute your contributions as part of the pr 7. For large features or changes, [open an issue][issue] to discuss first. This may prevent duplicate or unnecessary effort, and it may gain you some additional contributors. 8. To report a bug, [open an issue][issue], and follow [guidelines about bugfix issues][issue reporting]. -9. All automated tests must pass successfully (all builds on [Travis CI] must be green). +9. All automated tests must pass successfully (all builds must be green). ## Fork a repository @@ -179,4 +179,3 @@ Label| Description [Magento Contributor Agreement]: http://www.magento.com/legaldocuments/mca [MFTF repository]: https://github.com/magento/magento2-functional-testing-framework [open new issue]: https://github.com/magento/magento2-functional-testing-framework/issues/new -[Travis CI]: https://travis-ci.com/magento/magento2-functional-testing-framework/pull_requests diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 3ce27ce35..9bcc9ec2b 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -12,5 +12,5 @@ - [ ] Pull request has a meaningful description of its purpose - [ ] All commits are accompanied by meaningful commit messages - [ ] All new or changed code is covered with unit/verification tests (if applicable) - - [ ] All automated tests passed successfully (all builds on Travis CI are green) + - [ ] All automated tests passed successfully (all builds are green) - [ ] Changes to Framework doesn't have backward incompatible changes for tests or have related Pull Request with fixes to tests \ No newline at end of file diff --git a/README.md b/README.md index 5a4bbab11..02a2b0cd5 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # Magento Functional Testing Framework (MFTF) -[![Build Status](https://travis-ci.org/magento/magento2-functional-testing-framework.svg?branch=develop)](https://travis-ci.org/magento/magento2-functional-testing-framework) [![Coverage Status](https://coveralls.io/repos/github/magento/magento2-functional-testing-framework/badge.svg?branch=develop)](https://coveralls.io/github/magento/magento2-functional-testing-framework) - ---- ## Installation From b052e802ecb8f25aa97d7475f701a2eb8ea34252 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 6 May 2022 12:50:30 +0530 Subject: [PATCH 208/674] MQE-3096 : unit tests for GenerateTestFailedCommandTest and RunTestFailedCommandTest --- .../Console/GenerateTestFailedCommandTest.php | 128 +++++++++++++++++- .../Console/RunTestFailedCommandTest.php | 79 +++++++++++ 2 files changed, 206 insertions(+), 1 deletion(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php index a127ea313..cd5ed57fd 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php @@ -15,7 +15,7 @@ class GenerateTestFailedCommandTest extends BaseGenerateCommandTest { - public function testSingleTestNoSuite(): void + public function testSingleTestWithNoSuite(): void { $testFileReturn = [ "tests/functional/tests/MFTF/_generated/default/SingleTestNoSuiteTest.php:SingleTestNoSuiteTest" @@ -38,4 +38,130 @@ public function testSingleTestNoSuite(): void $configuration = $stub->getFailedTestList("", ""); $this->assertEquals($expectedConfiguration, $configuration); } + + public function testMultipleTestsWithSuites(): void + { + $testFileReturn = [ + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/FirstTestSuiteTest.php:SingleTestSuiteTest", + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/SecondTestNoSuiteTest.php:SingleTestNoSuiteTest", + "tests/functional/tests/MFTF/_generated/SomeOtherSuite/SecondTestNoSuiteTest.php:SingleTestNoSuiteTest", + ]; + $expectedConfiguration = '{"tests":null,"suites":{"SomeSpecificSuite":["SingleTestSuiteTest", + "SingleTestNoSuiteTest"],"SomeOtherSuite":["SingleTestNoSuiteTest"]}}'; + + // Create a stub for the SomeClass class. + $stub = $this->getMockBuilder(GenerateTestFailedCommand::class) + ->onlyMethods(["readFailedTestFile", "writeFailedTestToFile"]) + ->getMock(); + // Configure the stub. + $stub + ->method('readFailedTestFile') + ->willReturn($testFileReturn); + $stub + ->method('writeFailedTestToFile') + ->willReturn(null); + + // Run the real code + $configuration = $stub->getFailedTestList("", ""); + $this->assertEquals($expectedConfiguration, $configuration); + } + + public function testMultipleTestFailureWithNoSuites(): void + { + $testFileReturn = [ + "tests/functional/tests/MFTF/_generated/default/SingleTestNoSuiteTest.php:SingleTestNoSuiteTest", + "tests/functional/tests/MFTF/_generated/default/FirstTestSuiteTest.php:SingleTestSuiteTest" + ]; + $expectedConfiguration = '{"tests":["SingleTestNoSuiteTest","SingleTestSuiteTest"],"suites":null}'; + + // Create a stub for the SomeClass class. + $stub = $this->getMockBuilder(GenerateTestFailedCommand::class) + ->onlyMethods(["readFailedTestFile", "writeFailedTestToFile"]) + ->getMock(); + // Configure the stub. + $stub + ->method('readFailedTestFile') + ->willReturn($testFileReturn); + $stub + ->method('writeFailedTestToFile') + ->willReturn(null); + + // Run the real code + $configuration = $stub->getFailedTestList("", ""); + $this->assertEquals($expectedConfiguration, $configuration); + } + + public function testSingleSuiteAndNoTest(): void + { + $testFileReturn = [ + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/", + ]; + $expectedConfiguration = '{"tests":null,"suites":{"SomeSpecificSuite":[null]}}'; + + // Create a stub for the SomeClass class. + $stub = $this->getMockBuilder(GenerateTestFailedCommand::class) + ->onlyMethods(["readFailedTestFile", "writeFailedTestToFile"]) + ->getMock(); + // Configure the stub. + $stub + ->method('readFailedTestFile') + ->willReturn($testFileReturn); + $stub + ->method('writeFailedTestToFile') + ->willReturn(null); + + // Run the real code + $configuration = $stub->getFailedTestList("", ""); + $this->assertEquals($expectedConfiguration, $configuration); + } + + public function testSingleSuiteWithTest(): void + { + $testFileReturn = [ + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/FirstTestSuiteTest.php:SingleTestSuiteTest", + ]; + $expectedConfiguration = '{"tests":null,"suites":{"SomeSpecificSuite":["SingleTestSuiteTest"]}}'; + + // Create a stub for the SomeClass class. + $stub = $this->getMockBuilder(GenerateTestFailedCommand::class) + ->onlyMethods(["readFailedTestFile", "writeFailedTestToFile"]) + ->getMock(); + // Configure the stub. + $stub + ->method('readFailedTestFile') + ->willReturn($testFileReturn); + $stub + ->method('writeFailedTestToFile') + ->willReturn(null); + + // Run the real code + $configuration = $stub->getFailedTestList("", ""); + $this->assertEquals($expectedConfiguration, $configuration); + } + + public function testMultipleSuitesWithNoTests(): void + { + $testFileReturn = [ + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/", + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite1/", + + ]; + $expectedConfiguration = '{"tests":null,"suites":{"SomeSpecificSuite":[null],"SomeSpecificSuite1":[null]}}'; + + // Create a stub for the SomeClass class. + $stub = $this->getMockBuilder(GenerateTestFailedCommand::class) + ->onlyMethods(["readFailedTestFile", "writeFailedTestToFile"]) + ->getMock(); + // Configure the stub. + $stub + ->method('readFailedTestFile') + ->willReturn($testFileReturn); + $stub + ->method('writeFailedTestToFile') + ->willReturn(null); + + // Run the real code + $configuration = $stub->getFailedTestList("", ""); + $this->assertEquals($expectedConfiguration, $configuration); + } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/RunTestFailedCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/RunTestFailedCommandTest.php index 5bba89de1..6d85ed275 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/RunTestFailedCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/RunTestFailedCommandTest.php @@ -50,4 +50,83 @@ private function invokePrivateMethod(&$object, $methodName, array $parameters = $method->setAccessible(true); return $method->invokeArgs($object, $parameters); } + + public function testSingleTestNoSuite(): void + { + $testFailedFile = [ + "tests/functional/tests/MFTF/_generated/default/SingleTestNoSuiteTest.php:SingleTestNoSuiteTest" + ]; + + $expectedResult = [ + 'tests/functional/tests/MFTF/_generated/default/SingleTestNoSuiteTest.php' + ]; + + $runFailed = new RunTestFailedCommand('run:failed'); + $filter = $this->invokePrivateMethod($runFailed, 'filterTestsForExecution', [$testFailedFile]); + $this->assertEquals($expectedResult, $filter); + } + + public function testMultipleTestNoSuite(): void + { + $testFailedFile = [ + "tests/functional/tests/MFTF/_generated/default/SingleTestNoSuiteTest.php:SingleTestNoSuiteTest", + "tests/functional/tests/MFTF/_generated/default/FirstTestSuiteTest.php:SingleTestSuiteTest" + ]; + + $expectedResult = [ + "tests/functional/tests/MFTF/_generated/default/SingleTestNoSuiteTest.php", + "tests/functional/tests/MFTF/_generated/default/FirstTestSuiteTest.php" + ]; + + $runFailed = new RunTestFailedCommand('run:failed'); + $filter = $this->invokePrivateMethod($runFailed, 'filterTestsForExecution', [$testFailedFile]); + $this->assertEquals($expectedResult, $filter); + } + + public function testSingleSuiteNoTest(): void + { + $testFailedFile = [ + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/FirstTestSuiteTest.php:SingleTestSuiteTest", + ]; + + $expectedResult = [ + "-g SomeSpecificSuite" + ]; + + $runFailed = new RunTestFailedCommand('run:failed'); + $filter = $this->invokePrivateMethod($runFailed, 'filterTestsForExecution', [$testFailedFile]); + $this->assertEquals($expectedResult, $filter); + } + + public function testSingleSuiteAndTest(): void + { + $testFailedFile = [ + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/FirstTestSuiteTest.php:SingleTestSuiteTest", + ]; + $expectedResult = [ + "-g SomeSpecificSuite", + ]; + + $runFailed = new RunTestFailedCommand('run:failed'); + $filter = $this->invokePrivateMethod($runFailed, 'filterTestsForExecution', [$testFailedFile]); + $this->assertEquals($expectedResult, $filter); + } + + public function testMultipleSuitesWithNoTest(): void + { + $testFailedFile = [ + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/", + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite1/", + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite2/" + ]; + $expectedResult = [ + "-g SomeSpecificSuite", + "-g SomeSpecificSuite1", + "-g SomeSpecificSuite2", + ]; + + $runFailed = new RunTestFailedCommand('run:failed'); + $filter = $this->invokePrivateMethod($runFailed, 'filterTestsForExecution', [$testFailedFile]); + $this->assertEquals($expectedResult, $filter); + } } From d4f779b520213fe5efd4edeb4333e317141ecd6c Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 6 May 2022 12:58:59 +0530 Subject: [PATCH 209/674] MQE-3096 : unit tests for GenerateTestFailedCommandTest and RunTestFailedCommandTest --- .../Console/RunTestFailedCommandTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/RunTestFailedCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/RunTestFailedCommandTest.php index 6d85ed275..db0c63c61 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/RunTestFailedCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/RunTestFailedCommandTest.php @@ -86,7 +86,7 @@ public function testMultipleTestNoSuite(): void public function testSingleSuiteNoTest(): void { $testFailedFile = [ - "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/FirstTestSuiteTest.php:SingleTestSuiteTest", + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/", ]; $expectedResult = [ From d013074f8ccbd5edc7b7bb9328e26e4c0ec453d7 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 6 May 2022 13:02:51 +0530 Subject: [PATCH 210/674] MQE-3096 : unit tests for GenerateTestFailedCommandTest and RunTestFailedCommandTest --- .../Console/GenerateTestFailedCommandTest.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php index cd5ed57fd..f1ee79128 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php @@ -43,11 +43,8 @@ public function testMultipleTestsWithSuites(): void { $testFileReturn = [ "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/FirstTestSuiteTest.php:SingleTestSuiteTest", - "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/SecondTestNoSuiteTest.php:SingleTestNoSuiteTest", - "tests/functional/tests/MFTF/_generated/SomeOtherSuite/SecondTestNoSuiteTest.php:SingleTestNoSuiteTest", - ]; - $expectedConfiguration = '{"tests":null,"suites":{"SomeSpecificSuite":["SingleTestSuiteTest", - "SingleTestNoSuiteTest"],"SomeOtherSuite":["SingleTestNoSuiteTest"]}}'; + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/SecondTestNoSuiteTest.php:SingleTestNoSuiteTest", ]; + $expectedConfiguration = '{"tests":null,"suites":{"SomeSpecificSuite":["SingleTestSuiteTest","SingleTestNoSuiteTest"]}}'; // Create a stub for the SomeClass class. $stub = $this->getMockBuilder(GenerateTestFailedCommand::class) From 02d4bc696523cc2fe869489eae51e2c78bdd53dd Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 6 May 2022 14:09:07 +0530 Subject: [PATCH 211/674] MQE-3096 : unit tests for GenerateTestFailedCommandTest and RunTestFailedCommandTest --- .../Console/GenerateTestFailedCommandTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php index f1ee79128..675fa8715 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php @@ -93,7 +93,7 @@ public function testSingleSuiteAndNoTest(): void $testFileReturn = [ "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/", ]; - $expectedConfiguration = '{"tests":null,"suites":{"SomeSpecificSuite":[null]}}'; + $expectedConfiguration = '{"tests":null,"suites":{"SomeSpecificSuite":[[]]}}'; // Create a stub for the SomeClass class. $stub = $this->getMockBuilder(GenerateTestFailedCommand::class) @@ -143,7 +143,7 @@ public function testMultipleSuitesWithNoTests(): void "tests/functional/tests/MFTF/_generated/SomeSpecificSuite1/", ]; - $expectedConfiguration = '{"tests":null,"suites":{"SomeSpecificSuite":[null],"SomeSpecificSuite1":[null]}}'; + $expectedConfiguration = '{"tests":null,"suites":{"SomeSpecificSuite":[[]],"SomeSpecificSuite1":[[]]}}'; // Create a stub for the SomeClass class. $stub = $this->getMockBuilder(GenerateTestFailedCommand::class) From c2b1dd021f025f62b71a97b1465ff007fbcdfef9 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 6 May 2022 14:20:23 +0530 Subject: [PATCH 212/674] fixed unit test failure --- .../Console/GenerateTestFailedCommand.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php index 7b6208bd4..6ebae7528 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php @@ -103,9 +103,12 @@ public function getFailedTestList($testsFailedFile, $testsReRunFile) if (!empty($test)) { $this->writeFailedTestToFile($test, $testsReRunFile); $testInfo = explode(DIRECTORY_SEPARATOR, $test); - $testName = explode(":", $testInfo[count($testInfo) - 1])[1]; - $suiteName = $testInfo[count($testInfo) - 2]; - + $testName = isset($testInfo[count($testInfo) - 1][1]) + ? explode(":", $testInfo[count($testInfo) - 1])[1] + : []; + $suiteName = isset($testInfo[count($testInfo) - 2]) + ? $testInfo[count($testInfo) - 2] + : []; if ($suiteName === self::DEFAULT_TEST_GROUP) { array_push($failedTestDetails['tests'], $testName); } else { From 2486bd85b52f6766bb0881179dd35f489cc0473a Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 6 May 2022 14:22:51 +0530 Subject: [PATCH 213/674] fixed unit test failure --- .../Console/GenerateTestFailedCommandTest.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php index 675fa8715..317868300 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestFailedCommandTest.php @@ -43,8 +43,10 @@ public function testMultipleTestsWithSuites(): void { $testFileReturn = [ "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/FirstTestSuiteTest.php:SingleTestSuiteTest", - "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/SecondTestNoSuiteTest.php:SingleTestNoSuiteTest", ]; - $expectedConfiguration = '{"tests":null,"suites":{"SomeSpecificSuite":["SingleTestSuiteTest","SingleTestNoSuiteTest"]}}'; + "tests/functional/tests/MFTF/_generated/SomeSpecificSuite/SecondTestNoSuiteTest.php:SingleTestNoSuiteTest" + ]; + $expectedConfiguration = + '{"tests":null,"suites":{"SomeSpecificSuite":["SingleTestSuiteTest","SingleTestNoSuiteTest"]}}'; // Create a stub for the SomeClass class. $stub = $this->getMockBuilder(GenerateTestFailedCommand::class) From 6b65074bdbdea7e08edca6a907635c67f7a9cff4 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Fri, 6 May 2022 14:31:49 +0530 Subject: [PATCH 214/674] fixed unit test failure --- .../Console/GenerateTestFailedCommand.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php index 6ebae7528..380270969 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestFailedCommand.php @@ -91,6 +91,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int * Returns a json string of tests that failed on the last run * * @return string + * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function getFailedTestList($testsFailedFile, $testsReRunFile) { From bcf0d449afebdd54ac0ec1f22f158fa9155512f0 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Fri, 6 May 2022 22:00:30 +0530 Subject: [PATCH 215/674] MQE-2233 : Support xUnit-compatible Output Format (#187) * MQE-2233 : Support xUnit-compatible Output Format * MQE-2233 : Support xUnit-compatible Output Format * modified testname in doc * added not empty condition * added not empty condition * added doc for new option + Added the right description regarding where file is moved * added doc for new option + Added the right description regarding where file is moved Co-authored-by: Manjusha.S Co-authored-by: Kevin Kozan --- docs/commands/mftf.md | 6 ++- .../Console/BaseGenerateCommand.php | 25 ++++++++++++ .../Console/RunTestCommand.php | 38 ++++++++++++++----- .../Console/RunTestGroupCommand.php | 23 +++++++++-- 4 files changed, 76 insertions(+), 16 deletions(-) diff --git a/docs/commands/mftf.md b/docs/commands/mftf.md index be026cd74..4b4bb4bab 100644 --- a/docs/commands/mftf.md +++ b/docs/commands/mftf.md @@ -353,7 +353,7 @@ Generates and executes the listed groups of tests using Codeception. #### Usage ```bash -vendor/bin/mftf run:group [--skip-generate|--remove] [--] [] +vendor/bin/mftf run:group [--skip-generate|--remove|--xml] [--] [] ``` #### Options @@ -363,6 +363,7 @@ vendor/bin/mftf run:group [--skip-generate|--remove] [--] [] | `-k, --skip-generate` | Skips generating from the source XML. Instead, the command executes previously-generated groups of tests. | | `-r, --remove` | Removes previously generated suites and tests before the actual generation and run. | | `--debug` | Performs schema validations on XML files. `run:group` implicitly performs schema validation on merged files. It does not indicate the file name where the error is encountered. `--debug` performs per-file validation and returns additional debug information (such as the filename where an error occurred).| +| `--xml` | Generate JUnit XML Log (default: "report.xml") | #### Examples @@ -385,7 +386,7 @@ Generates and executes tests by name using Codeception. #### Usage ```bash -vendor/bin/mftf run:test [--skip-generate|--remove] [--] [] +vendor/bin/mftf run:test [--skip-generate|--remove|--xml] [--] [] ``` #### Options @@ -395,6 +396,7 @@ vendor/bin/mftf run:test [--skip-generate|--remove] [--] [] | `-k, --skip-generate` | Skips generating from the source XML. Instead, the command executes previously-generated groups of tests. | | `-r, --remove` | Remove previously generated suites and tests. | | `--debug` | Performs schema validations on XML files. `run:test` implicitly performs schema validation on merged files. It does not indicate the file name where the error is encountered. `--debug` performs per-file validation and returns additional debug information (such as the filename where an error occurred).| +| `--xml` | Generate JUnit XML Log (default: "report.xml") | #### Examples diff --git a/src/Magento/FunctionalTestingFramework/Console/BaseGenerateCommand.php b/src/Magento/FunctionalTestingFramework/Console/BaseGenerateCommand.php index 2d00e0abd..0c209d8f2 100644 --- a/src/Magento/FunctionalTestingFramework/Console/BaseGenerateCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/BaseGenerateCommand.php @@ -364,4 +364,29 @@ protected function applyAllFailed() } catch (TestFrameworkException $e) { } } + /** + * Codeception creates default xml file with name report.xml . + * This function renames default file name with name of the test. + * + * @param string $xml + * @param string $fileName + * @param OutputInterface $output + * @return void + * @throws \Exception + */ + public function movingXMLFileFromSourceToDestination($xml, $fileName, $output) + { + if(!empty($xml) && file_exists($this->getTestsOutputDir().'report.xml')) { + if (!file_exists($this->getTestsOutputDir().'xml')) { + mkdir($this->getTestsOutputDir().'xml' , 0777, true); + } + $fileName = str_replace("Cest.php", "",$fileName); + $existingFileName = $this->getTestsOutputDir().'report.xml'; + $newFileName = $this->getTestsOutputDir().'xml/'.$fileName.'_report.xml'; + $output->writeln( "".sprintf(" report.xml file is moved to ". + $this->getTestsOutputDir().'xml/'. ' location with the new name '.$fileName.'_report.xml')."") ; + rename($existingFileName , $newFileName); + } + } + } diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php index cf58bc050..95c2f563a 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php @@ -41,6 +41,12 @@ protected function configure() { $this->setName("run:test") ->setDescription("generation and execution of test(s) defined in xml") + ->addOption( + 'xml', + 'xml', + InputOption::VALUE_NONE, + "creates xml report for executed test" + ) ->addArgument( 'name', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, @@ -134,11 +140,11 @@ protected function execute(InputInterface $input, OutputInterface $output): int $testConfigArray = json_decode($testConfiguration, true); if (isset($testConfigArray['tests'])) { - $this->runTests($testConfigArray['tests'], $output); + $this->runTests($testConfigArray['tests'], $output, $input); } if (isset($testConfigArray['suites'])) { - $this->runTestsInSuite($testConfigArray['suites'], $output); + $this->runTestsInSuite($testConfigArray['suites'], $output, $input); } // Add all failed tests in 'failed' file @@ -152,12 +158,16 @@ protected function execute(InputInterface $input, OutputInterface $output): int * * @param array $tests * @param OutputInterface $output + * @param InputInterface $input * @return void * @throws TestFrameworkException * @throws \Exception */ - private function runTests(array $tests, OutputInterface $output) + private function runTests(array $tests, OutputInterface $output, InputInterface $input) { + $xml = ($input->getOption('xml')) + ? '--xml' + : ""; if ($this->pauseEnabled()) { $codeceptionCommand = self::CODECEPT_RUN_FUNCTIONAL; } else { @@ -179,16 +189,18 @@ private function runTests(array $tests, OutputInterface $output) } if ($this->pauseEnabled()) { - $fullCommand = $codeceptionCommand . $testsDirectory . $testName . ' --verbose --steps --debug'; + $fullCommand = $codeceptionCommand . $testsDirectory . $testName . ' --verbose --steps --debug '.$xml; if ($i !== count($tests) - 1) { $fullCommand .= self::CODECEPT_RUN_OPTION_NO_EXIT; } $this->returnCode = max($this->returnCode, $this->codeceptRunTest($fullCommand, $output)); } else { - $fullCommand = $codeceptionCommand . $testsDirectory . $testName . ' --verbose --steps'; + $fullCommand = $codeceptionCommand . $testsDirectory . $testName . ' --verbose --steps '.$xml; $this->returnCode = max($this->returnCode, $this->executeTestCommand($fullCommand, $output)); } - + if (!empty($xml)) { + $this->movingXMLFileFromSourceToDestination($xml, $testName, $output); + } // Save failed tests $this->appendRunFailed(); } @@ -199,16 +211,20 @@ private function runTests(array $tests, OutputInterface $output) * * @param array $suitesConfig * @param OutputInterface $output + * @param InputInterface $input * @return void * @throws \Exception */ - private function runTestsInSuite(array $suitesConfig, OutputInterface $output) + private function runTestsInSuite(array $suitesConfig, OutputInterface $output, InputInterface $input) { + $xml = ($input->getOption('xml')) + ? '--xml' + : ""; if ($this->pauseEnabled()) { - $codeceptionCommand = self::CODECEPT_RUN_FUNCTIONAL . '--verbose --steps --debug'; + $codeceptionCommand = self::CODECEPT_RUN_FUNCTIONAL . '--verbose --steps --debug '.$xml; } else { $codeceptionCommand = realpath(PROJECT_ROOT . '/vendor/bin/codecept') - . ' run functional --verbose --steps '; + . ' run functional --verbose --steps '.$xml; } $count = count($suitesConfig); @@ -226,7 +242,9 @@ private function runTestsInSuite(array $suitesConfig, OutputInterface $output) } else { $this->returnCode = max($this->returnCode, $this->executeTestCommand($fullCommand, $output)); } - + if (!empty($xml)) { + $this->movingXMLFileFromSourceToDestination($xml, $suite, $output); + } // Save failed tests $this->appendRunFailed(); } diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php index d9a549627..38e3366d7 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php @@ -29,7 +29,15 @@ class RunTestGroupCommand extends BaseGenerateCommand protected function configure() { $this->setName('run:group') - ->setDescription('Execute a set of tests referenced via group annotations') + ->setDescription( + 'Execute a set of tests referenced via group annotations' + ) + ->addOption( + 'xml', + 'xml', + InputOption::VALUE_NONE, + "creates xml report for executed group" + ) ->addOption( 'skip-generate', 'k', @@ -58,6 +66,9 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output): int { + $xml = ($input->getOption('xml')) + ? '--xml' + : ""; $skipGeneration = $input->getOption('skip-generate'); $force = $input->getOption('force'); $groups = $input->getArgument('groups'); @@ -104,9 +115,11 @@ protected function execute(InputInterface $input, OutputInterface $output): int } if ($this->pauseEnabled()) { - $commandString = self::CODECEPT_RUN_FUNCTIONAL . '--verbose --steps --debug'; + $commandString = self::CODECEPT_RUN_FUNCTIONAL . '--verbose --steps --debug '.$xml; } else { - $commandString = realpath(PROJECT_ROOT . '/vendor/bin/codecept') . ' run functional --verbose --steps'; + $commandString = realpath( + PROJECT_ROOT . '/vendor/bin/codecept' + ) . ' run functional --verbose --steps '.$xml; } $exitCode = -1; @@ -130,7 +143,9 @@ function ($type, $buffer) use ($output) { } ); } - + if (!empty($xml)) { + $this->movingXMLFileFromSourceToDestination($xml, $groups[$i].'_'.'group', $output); + } // Save failed tests $this->appendRunFailed(); } From cbff68a156dcec362fc07308bb673eac5ae24ec2 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 9 May 2022 20:41:56 +0530 Subject: [PATCH 216/674] MQE-3300 : Show credentials in allure report for suite (#186) * MQE-3300 : Show credentials in allure report for suite * MQE-3300 : Show credentials in allure report for suite * fixed verification test failure * fixed verification test failure * fixed verification test failure * added deleted line back * remove new line space from creds * get credentials for hook actions * fix psr * MQE-3300 : Show credentials in allure report for suite - Small change to secret message Co-authored-by: Manjusha.S Co-authored-by: Kevin Kozan Co-authored-by: Kevin Kozan --- .../Test/Objects/ActionGroupObjectTest.php | 118 ++++++++++++++---- .../Test/Objects/ActionObjectTest.php | 53 +++++--- .../Test/Util/ActionMergeUtilTest.php | 22 ++-- .../Resources/BasicFunctionalTest.txt | 2 +- .../Test/Objects/ActionObject.php | 17 +++ .../Test/Objects/TestObject.php | 23 ++++ .../Util/TestGenerator.php | 36 ++++-- 7 files changed, 211 insertions(+), 60 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php index a6df01937..c66303ba6 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php @@ -49,7 +49,7 @@ public function testGetStepsWithDefaultCase(): void $this->setEntityObjectHandlerReturn($entity); $actionGroupUnderTest = (new ActionGroupObjectBuilder())->build(); $steps = $actionGroupUnderTest->getSteps(null, self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'literal']); + $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'literal', 'requiredCredentials' => '']); } /** @@ -67,30 +67,48 @@ public function testGetStepsWithCustomArgs(): void }); $actionGroupUnderTest = (new ActionGroupObjectBuilder()) - ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1.field2}}'])]) - ->withArguments([new ArgumentObject('arg1', null, 'entity')]) - ->build(); + ->withActionObjects([new ActionObject( + 'action1', + 'testAction', + [ + 'userInput' => '{{arg1.field2}}','requiredCredentials' => '' + ] + )]) + ->withArguments([new ArgumentObject('arg1', null, 'entity')]) + ->build(); $steps = $actionGroupUnderTest->getSteps(['arg1' => 'data2'], self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue2']); + $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue2','requiredCredentials' => '']); // entity.field as argument $actionGroupUnderTest = (new ActionGroupObjectBuilder()) - ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1}}'])]) + ->withActionObjects([new ActionObject( + 'action1', + 'testAction', + ['userInput' => '{{arg1}}', + 'requiredCredentials' => '' + ] + )]) ->withArguments([new ArgumentObject('arg1', null, 'entity')]) ->build(); $steps = $actionGroupUnderTest->getSteps(['arg1' => 'data2.field2'], self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue2']); + $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue2', 'requiredCredentials' => '']); // String Data $actionGroupUnderTest = (new ActionGroupObjectBuilder()) - ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{simple}}'])]) + ->withActionObjects([new ActionObject( + 'action1', + 'testAction', + ['userInput' => '{{simple}}', + 'requiredCredentials' => '' + ] + )]) ->withArguments([new ArgumentObject('simple', null, 'string')]) ->build(); $steps = $actionGroupUnderTest->getSteps(['simple' => 'override'], self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'override']); + $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'override', 'requiredCredentials' => '']); } /** @@ -102,21 +120,32 @@ public function testGetStepsWithCustomArgs(): void public function testGetStepsWithPersistedArgs(): void { $actionGroupUnderTest = (new ActionGroupObjectBuilder()) - ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1.field2}}'])]) + ->withActionObjects([new ActionObject( + 'action1', + 'testAction', + ['userInput' => '{{arg1.field2}}', + 'requiredCredentials' => ''] + )]) ->withArguments([new ArgumentObject('arg1', null, 'entity')]) ->build(); $steps = $actionGroupUnderTest->getSteps(['arg1' => '$data3$'], self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => '$data3.field2$']); + $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => '$data3.field2$','requiredCredentials' => '']); // Simple Data $actionGroupUnderTest = (new ActionGroupObjectBuilder()) - ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{simple}}'])]) + ->withActionObjects([new ActionObject( + 'action1', + 'testAction', + ['userInput' => '{{simple}}', + 'requiredCredentials' => '' + ] + )]) ->withArguments([new ArgumentObject('simple', null, 'string')]) ->build(); $steps = $actionGroupUnderTest->getSteps(['simple' => '$data3.field2$'], self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => '$data3.field2$']); + $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => '$data3.field2$','requiredCredentials' => '']); } /** @@ -134,12 +163,18 @@ public function testGetStepsWithNoFieldArg(): void }); $actionGroupUnderTest = (new ActionGroupObjectBuilder()) - ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1}}'])]) + ->withActionObjects([new ActionObject( + 'action1', + 'testAction', + ['userInput' => '{{arg1}}', + 'requiredCredentials' => '' + ] + )]) ->withArguments([new ArgumentObject('arg1', null, 'entity')]) ->build(); $steps = $actionGroupUnderTest->getSteps(['arg1' => 'data2.field2'], self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue2']); + $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue2','requiredCredentials' => '']); } /** @@ -157,11 +192,17 @@ public function testGetStepsWithNoArgs(): void }); $actionGroupUnderTest = (new ActionGroupObjectBuilder()) - ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{data1.field1}}'])]) + ->withActionObjects([new ActionObject( + 'action1', + 'testAction', + ['userInput' => '{{data1.field1}}', + 'requiredCredentials' => '' + ] + )]) ->build(); $steps = $actionGroupUnderTest->getSteps(null, self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue']); + $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue','requiredCredentials' => '']); } /** @@ -199,11 +240,22 @@ public function testGetStepsWithParameterizedArg(): void // XML Data $steps = $actionGroupUnderTest->getSteps(['arg1' => 'data2'], self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector testValue2']); + $this->assertOnMergeKeyAndActionValue($steps, [ + 'selector' => '.selector testValue2', + 'requiredCredentials' => '' + ]); // Persisted Data - $steps = $actionGroupUnderTest->getSteps(['arg1' => '$data2$'], self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector $data2.field2$']); + $steps = $actionGroupUnderTest->getSteps( + ['arg1' => '$data2$'], + self::ACTION_GROUP_MERGE_KEY + ); + $this->assertOnMergeKeyAndActionValue( + $steps, + ['selector' => '.selector $data2.field2$', + 'requiredCredentials' => '' + ] + ); } /** @@ -242,15 +294,28 @@ public function testGetStepsWithParameterizedSimpleArg(): void // String Literal $steps = $actionGroupUnderTest->getSteps(['simple' => 'stringLiteral'], self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector stringLiteral']); + $this->assertOnMergeKeyAndActionValue($steps, [ + 'selector' => '.selector stringLiteral', + 'requiredCredentials' => '' + ]); // String Literal w/ data-like structure $steps = $actionGroupUnderTest->getSteps(['simple' => 'data2.field2'], self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector data2.field2']); + $this->assertOnMergeKeyAndActionValue( + $steps, + ['selector' => '.selector data2.field2', + 'requiredCredentials' => '' + ] + ); // Persisted Data $steps = $actionGroupUnderTest->getSteps(['simple' => '$someData.field1$'], self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector $someData.field1$']); + $this->assertOnMergeKeyAndActionValue( + $steps, + ['selector' => '.selector $someData.field1$', + 'requiredCredentials' => '' + ] + ); } /** @@ -267,7 +332,12 @@ public function testGetStepsWithOuterScopePersistence(): void ->build(); $steps = $actionGroupUnderTest->getSteps(['arg1' => '$$someData$$'], self::ACTION_GROUP_MERGE_KEY); - $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => '$$someData.field1$$']); + $this->assertOnMergeKeyAndActionValue( + $steps, + ['userInput' => '$$someData.field1$$', + 'requiredCredentials' => '' + ] + ); } /** diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php index f3c75a073..d64de1cac 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php @@ -71,7 +71,8 @@ public function testResolveElementInSelector(): void // Set up mocks $actionObject = new ActionObject('merge123', 'fillField', [ 'selector' => '{{SectionObject.elementObject}}', - 'userInput' => 'Hello world' + 'userInput' => 'Hello world', + 'requiredCredentials' => '' ]); $elementObject = new ElementObject('elementObject', 'button', '#replacementSelector', null, '42', false); $this->mockSectionHandlerWithElement($elementObject); @@ -82,7 +83,8 @@ public function testResolveElementInSelector(): void // Verify $expected = [ 'selector' => '#replacementSelector', - 'userInput' => 'Hello world' + 'userInput' => 'Hello world', + 'requiredCredentials' => '' ]; $this->assertEquals($expected, $actionObject->getCustomActionAttributes()); } @@ -98,7 +100,8 @@ public function testResolveSelectorWithOneStringLiteral(): void { $actionObject = new ActionObject('key123', 'fillField', [ 'selector' => "{{SectionObject.elementObject('stringliteral')}}", - 'userInput' => 'Input' + 'userInput' => 'Input', + 'requiredCredentials' => '' ]); $elementObject = new ElementObject('elementObject', 'button', '#{{var1}}', null, '42', true); $this->mockSectionHandlerWithElement($elementObject); @@ -109,7 +112,8 @@ public function testResolveSelectorWithOneStringLiteral(): void // Verify $expected = [ 'selector' => '#stringliteral', - 'userInput' => 'Input' + 'userInput' => 'Input', + 'requiredCredentials' => '' ]; $this->assertEquals($expected, $actionObject->getCustomActionAttributes()); } @@ -125,7 +129,8 @@ public function testResolveSelectorWithOneDataReference(): void { $actionObject = new ActionObject('key123', 'fillField', [ 'selector' => "{{SectionObject.elementObject(dataObject.key)}}", - 'userInput' => 'Input' + 'userInput' => 'Input', + 'requiredCredentials' => '' ]); // Mock SectionHandler @@ -142,7 +147,8 @@ public function testResolveSelectorWithOneDataReference(): void // Verify $expected = [ 'selector' => '#myValue', - 'userInput' => 'Input' + 'userInput' => 'Input', + 'requiredCredentials' => '' ]; $this->assertEquals($expected, $actionObject->getCustomActionAttributes()); } @@ -158,7 +164,8 @@ public function testResolveSelectorWithOnePersistedReference(): void { $actionObject = new ActionObject('key123', 'fillField', [ 'selector' => '{{SectionObject.elementObject($data.key$)}}', - 'userInput' => 'Input' + 'userInput' => 'Input', + 'requiredCredentials' => '' ]); // Mock SectionHandler @@ -171,7 +178,8 @@ public function testResolveSelectorWithOnePersistedReference(): void // Verify $expected = [ 'selector' => '#$data.key$', - 'userInput' => 'Input' + 'userInput' => 'Input', + 'requiredCredentials' => '' ]; $this->assertEquals($expected, $actionObject->getCustomActionAttributes()); } @@ -204,7 +212,8 @@ public function testResolveSelectorWithManyParams(): void // Verify $expected = [ 'selector' => '#stringLiteral[myValue,$data.key$]', - 'userInput' => 'Input' + 'userInput' => 'Input', + 'requiredCredentials' => '' ]; $this->assertEquals($expected, $actionObject->getCustomActionAttributes()); } @@ -260,7 +269,7 @@ public function testResolveUrl(): void // Verify $expected = [ - 'url' => '/replacement/url.html' + 'url' => '/replacement/url.html','requiredCredentials' => '' ]; $this->assertEquals($expected, $actionObject->getCustomActionAttributes()); } @@ -330,7 +339,8 @@ public function testResolveDataInUserInput(): void // Set up mocks $actionObject = new ActionObject('merge123', 'fillField', [ 'selector' => '#selector', - 'userInput' => '{{EntityDataObject.key}}' + 'userInput' => '{{EntityDataObject.key}}', + 'requiredCredentials' => '' ]); $entityDataObject = new EntityDataObject('EntityDataObject', 'test', [ 'key' => 'replacementData' @@ -343,7 +353,8 @@ public function testResolveDataInUserInput(): void // Verify $expected = [ 'selector' => '#selector', - 'userInput' => 'replacementData' + 'userInput' => 'replacementData', + 'requiredCredentials' => '' ]; $this->assertEquals($expected, $actionObject->getCustomActionAttributes()); } @@ -360,7 +371,8 @@ public function testResolveArrayData(): void // Set up mocks $actionObject = new ActionObject('merge123', 'fillField', [ 'selector' => '#selector', - 'userInput' => '{{EntityDataObject.values}}' + 'userInput' => '{{EntityDataObject.values}}', + 'requiredCredentials' => '' ]); $entityDataObject = new EntityDataObject('EntityDataObject', 'test', [ 'values' => [ @@ -373,11 +385,11 @@ public function testResolveArrayData(): void // Call the method under test $actionObject->resolveReferences(); - - // Verify + //Verify $expected = [ 'selector' => '#selector', - 'userInput' => '["value1","value2","\"My\" Value"]' + 'userInput' => '["value1","value2","\"My\" Value"]', + 'requiredCredentials' => '' ]; $this->assertEquals($expected, $actionObject->getCustomActionAttributes()); } @@ -395,7 +407,8 @@ public function testTooFewArgumentException(): void $actionObject = new ActionObject('key123', 'fillField', [ 'selector' => "{{SectionObject.elementObject('arg1')}}", - 'userInput' => 'Input' + 'userInput' => 'Input', + 'requiredCredentials' => '' ]); $elementObject = new ElementObject('elementObject', 'button', '#{{var1}} {{var2}}', null, '42', true); $this->mockSectionHandlerWithElement($elementObject); @@ -417,7 +430,8 @@ public function testTooManyArgumentException(): void $actionObject = new ActionObject('key123', 'fillField', [ 'selector' => "{{SectionObject.elementObject('arg1', 'arg2', 'arg3')}}", - 'userInput' => 'Input' + 'userInput' => 'Input', + 'requiredCredentials' => '' ]); $elementObject = new ElementObject('elementObject', 'button', '#{{var1}}', null, '42', true); $this->mockSectionHandlerWithElement($elementObject); @@ -438,7 +452,8 @@ public function testInvalidTimezoneException(): void $this->expectException(TestReferenceException::class); $actionObject = new ActionObject('key123', 'generateDate', [ - 'timezone' => "INVALID_TIMEZONE" + 'timezone' => "INVALID_TIMEZONE", + 'requiredCredentials' => '' ]); // Call the method under test diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php index 56bb0f0c5..99152b8f0 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php @@ -126,7 +126,7 @@ public function testResolveActionStepEntityData(): void $property->setValue($mockDOHInstance, $mockDOHInstance); // Create test object and action object - $actionAttributes = [$userInputKey => $userInputValue]; + $actionAttributes = [$userInputKey => $userInputValue,'requiredCredentials'=>'']; $actions[$actionName] = new ActionObject($actionName, $actionType, $actionAttributes); $this->assertEquals($userInputValue, $actions[$actionName]->getCustomActionAttributes()[$userInputKey]); @@ -198,7 +198,7 @@ public function testValidFillFieldSecretFunction(): void $actionObjectOne = new ActionObject( 'actionKey1', 'fillField', - ['userInput' => '{{_CREDS.username}}'] + ['userInput' => '{{_CREDS.username}}', 'requiredCredentials' => 'username'] ); $actionObject = [$actionObjectOne]; @@ -208,7 +208,7 @@ public function testValidFillFieldSecretFunction(): void $expectedValue = new ActionObject( 'actionKey1', 'fillSecretField', - ['userInput' => '{{_CREDS.username}}'] + ['userInput' => '{{_CREDS.username}}','requiredCredentials' => 'username'] ); $this->assertEquals($expectedValue, $result['actionKey1']); } @@ -225,7 +225,10 @@ public function testValidMagentoCLISecretFunction(): void $actionObjectOne = new ActionObject( 'actionKey1', 'magentoCLI', - ['command' => 'config:set cms/wysiwyg/enabled {{_CREDS.payment_authorizenet_login}}'] + ['command' => + 'config:set cms/wysiwyg/enabled {{_CREDS.payment_authorizenet_login}}', + 'requiredCredentials' => '' + ] ); $actionObject = [$actionObjectOne]; @@ -235,7 +238,10 @@ public function testValidMagentoCLISecretFunction(): void $expectedValue = new ActionObject( 'actionKey1', 'magentoCLISecret', - ['command' => 'config:set cms/wysiwyg/enabled {{_CREDS.payment_authorizenet_login}}'] + ['command' => + 'config:set cms/wysiwyg/enabled {{_CREDS.payment_authorizenet_login}}', + 'requiredCredentials' => '' + ] ); $this->assertEquals($expectedValue, $result['actionKey1']); } @@ -252,7 +258,7 @@ public function testValidCreateDataSecretFunction(): void $actionObjectOne = new ActionObject( 'actionKey1', 'field', - ['value' => '{{_CREDS.payment_authorizenet_login}}'] + ['value' => '{{_CREDS.payment_authorizenet_login}}','requiredCredentials' => ''] ); $actionObject = [$actionObjectOne]; @@ -262,7 +268,7 @@ public function testValidCreateDataSecretFunction(): void $expectedValue = new ActionObject( 'actionKey1', 'field', - ['value' => '{{_CREDS.payment_authorizenet_login}}'] + ['value' => '{{_CREDS.payment_authorizenet_login}}','requiredCredentials' => ''] ); $this->assertEquals($expectedValue, $result['actionKey1']); } @@ -284,7 +290,7 @@ public function testInvalidSecretFunctions(): void $actionObjectOne = new ActionObject( 'actionKey1', 'click', - ['userInput' => '{{_CREDS.username}}'] + ['userInput' => '{{_CREDS.username}}','requiredCredentials' => 'username'] ); $actionObject = [$actionObjectOne]; diff --git a/dev/tests/verification/Resources/BasicFunctionalTest.txt b/dev/tests/verification/Resources/BasicFunctionalTest.txt index e30f50c34..97403a39a 100644 --- a/dev/tests/verification/Resources/BasicFunctionalTest.txt +++ b/dev/tests/verification/Resources/BasicFunctionalTest.txt @@ -151,7 +151,7 @@ class BasicFunctionalTestCest $I->moveForward(); // stepKey: moveForwardKey1 $I->moveMouseOver(".functionalTestSelector"); // stepKey: moveMouseOverKey1 $I->openNewTab(); // stepKey: openNewTabKey1 - $I->pause(); // stepKey: pauseKey1 + $I->pause(true); // stepKey: pauseKey1 $I->pressKey("#page", "a"); // stepKey: pressKey1 $I->pressKey("#page", ['ctrl', 'a'],'new'); // stepKey: pressKey2 $I->pressKey("#page", ['shift', '111'],'1','x'); // stepKey: pressKey3 diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index aec38c9a5..451b58aa0 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -289,6 +289,7 @@ public function resolveReferences() $this->resolveSelectorReferenceAndTimeout(); $this->resolveUrlReference(); $this->resolveDataInputReferences(); + $this->detectCredentials(); $this->validateTimezoneAttribute(); if ($this->getType() === 'deleteData') { $this->validateMutuallyExclusiveAttributes(self::DELETE_DATA_MUTUAL_EXCLUSIVE_ATTRIBUTES); @@ -417,6 +418,22 @@ private function resolveSelectorReferenceAndTimeout() } } } + /** + * Sets requiredCredentials property + * + * @return void + * @throws TestReferenceException + */ + public function detectCredentials() + { + $requiredCredentials = ""; + $attributes = $this->getCustomActionAttributes(); + if (isset($attributes['userInput']) && stristr($attributes['userInput'], '_CREDS') == true) { + $credentials = explode(".", trim($attributes['userInput'], '{}')); + $requiredCredentials = $credentials[1]; + } + $this->resolvedCustomAttributes['requiredCredentials'] = $requiredCredentials; + } /** * Look up the url for SomePageName and set it, with MAGENTO_BASE_URL prepended, as the url attribute in the diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php index 9da9191cd..86b33285d 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php @@ -259,6 +259,29 @@ public function getEstimatedDuration() } } + /** + * Function to return credentials + * @return array + */ + public function getCredentials() + { + $requiredCredentials = []; + foreach ($this->hooks as $hookObject) { + foreach ($hookObject->getActions() as $action) { + if (isset($action->getCustomActionAttributes()['requiredCredentials']) + && !empty($action->getCustomActionAttributes()['requiredCredentials'])) { + $requiredCredentials[] = $action->getCustomActionAttributes()['requiredCredentials']; + } + } + } + foreach ($this->getOrderedActions() as $action) { + if (isset($action->getCustomActionAttributes()['requiredCredentials']) + && !empty($action->getCustomActionAttributes()['requiredCredentials'])) { + $requiredCredentials[] = $action->getCustomActionAttributes()['requiredCredentials']; + } + } + return array_unique($requiredCredentials); + } /** * Function which takes a set of actions and estimates time for completion based on action type. * diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 0c47036f0..00e58da61 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -273,7 +273,7 @@ public function assembleTestPhp($testObject) } catch (TestReferenceException $e) { throw new TestReferenceException($e->getMessage() . "\n" . $testObject->getFilename()); } - $classAnnotationsPhp = $this->generateAnnotationsPhp($testObject->getAnnotations()); + $classAnnotationsPhp = $this->generateAnnotationsPhp($testObject); $cestPhp = "exportDirName . "\Backend;\n\n"; @@ -449,12 +449,13 @@ private function generateUseStatementsPhp() /** * Generates Annotations PHP for given object, using given scope to determine indentation and additional output. * - * @param array $annotationsObject + * @param array $testObject * @param boolean $isMethod * @return string */ - private function generateAnnotationsPhp($annotationsObject, $isMethod = false) + private function generateAnnotationsPhp($testObject, $isMethod = false) { + $annotationsObject = $testObject->getAnnotations(); //TODO: Refactor to deal with PHPMD.CyclomaticComplexity if ($isMethod) { $indent = "\t"; @@ -470,7 +471,7 @@ private function generateAnnotationsPhp($annotationsObject, $isMethod = false) continue; } if (!$isMethod) { - $annotationsPhp .= $this->generateClassAnnotations($annotationType, $annotationName); + $annotationsPhp .= $this->generateClassAnnotations($annotationType, $annotationName, $testObject); } else { $annotationsPhp .= $this->generateMethodAnnotations($annotationType, $annotationName); } @@ -536,19 +537,39 @@ private function generateMethodAnnotations($annotationType = null, $annotationNa return $annotationToAppend; } + /** + * Returs required credentials to configure + * + * @param TestObject $testObject + * @return string + */ + public function requiredCredentials($testObject) + { + $requiredCredentials = (!empty($testObject->getCredentials())) + ? implode(",", $testObject->getCredentials()) + : ""; + + return $requiredCredentials; + } /** * Method which return formatted class level annotations based on type and name(s). * * @param string $annotationType * @param array $annotationName + * @param array $testObject * @return null|string * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - private function generateClassAnnotations($annotationType, $annotationName) + private function generateClassAnnotations($annotationType, $annotationName, $testObject) { $annotationToAppend = null; - + $requiredCredentialsMessage = $this->requiredCredentials($testObject); + $credMsg = "\n\n"."This test uses the following credentials:"."\n"; + if (!empty($requiredCredentialsMessage) && !empty($annotationName['main'])) { + $annotationName = ['main'=>$annotationName['main'].', '.$credMsg.''.$requiredCredentialsMessage, + 'test_files'=> "\n".$annotationName['test_files'], 'deprecated'=>$annotationName['deprecated']]; + } switch ($annotationType) { case "title": $annotationToAppend = sprintf(" * @Title(\"%s\")\n", $annotationName[0]); @@ -773,7 +794,6 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $selector = $this->addUniquenessFunctionCall($customActionAttributes['selector']); $selector = $this->resolveLocatorFunctionInAttribute($selector); } - if (isset($customActionAttributes['count'])) { $countClickValue = $customActionAttributes['count']; $countValue = $this->addUniquenessFunctionCall($countClickValue); @@ -1855,7 +1875,7 @@ private function generateTestPhp($test) $testName = $test->getName(); $testName = str_replace(' ', '', $testName); - $testAnnotations = $this->generateAnnotationsPhp($test->getAnnotations(), true); + $testAnnotations = $this->generateAnnotationsPhp($test, true); $dependencies = 'AcceptanceTester $I'; if (!$test->isSkipped() || MftfApplicationConfig::getConfig()->allowSkipped()) { try { From 8321d7d6a767320e00173ece557d372e7dc64fe4 Mon Sep 17 00:00:00 2001 From: "Mohit.k.Sharma" Date: Mon, 16 May 2022 20:03:31 +0530 Subject: [PATCH 217/674] MQE-2953 | Get Cookie Expiry in mftf --- dev/.credentials | 1 + docs/test/actions.md | 29 ++++++++++++++++ etc/di.xml | 2 +- .../Module/MagentoWebDriver.php | 33 +++++++++++++++++++ .../Test/Objects/ActionGroupObject.php | 1 + .../Test/etc/Actions/grabActions.xsd | 18 +++++++++- .../Util/TestGenerator.php | 2 ++ 7 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 dev/.credentials diff --git a/dev/.credentials b/dev/.credentials new file mode 100644 index 000000000..50c0c05bf --- /dev/null +++ b/dev/.credentials @@ -0,0 +1 @@ +magento/MAGENTO_ADMIN_PASSWORD=Admin@123456 diff --git a/docs/test/actions.md b/docs/test/actions.md index 993a9ff84..73e3da0d6 100644 --- a/docs/test/actions.md +++ b/docs/test/actions.md @@ -144,6 +144,7 @@ The following test actions return a variable: * [grabAttributeFrom](#grabattributefrom) * [grabCookie](#grabcookie) +* [grabCookieAttributes](#grabCookieAttributes) * [grabFromCurrentUrl](#grabfromcurrenturl) * [grabMultiple](#grabmultiple) * [grabPageSource](#grabpagesource) @@ -1158,6 +1159,34 @@ To access this value, use `{$grabCookieExampleDomain}` in later actions. --> ``` +### grabCookieAttributes + +See [grabCookieAttributes docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabCookieAttributes). + +Attribute|Type|Use|Description +---|---|---|--- +`userInput`|string|optional| Name of the cookie to grab. +`parameterArray`|string|optional| Array of cookie parameters to grab. +`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. + +#### Examples + +```xml + + +``` + +```xml + + +``` + ### grabFromCurrentUrl See [grabFromCurrentUrl docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabFromCurrentUrl).. diff --git a/etc/di.xml b/etc/di.xml index f5184808c..586158286 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 e6276ba10..851543889 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -808,6 +808,39 @@ public function rapidClick($selector, $count) } } + /** + * Grabs a cookie attributes value. + * You can set additional cookie params like `domain`, `path` in array passed as last argument. + * If the cookie is set by an ajax request (XMLHttpRequest), + * there might be some delay caused by the browser, so try `$I->wait(0.1)`. + * @param string $cookie + * @param array $params + * @return mixed + */ + public function grabCookieAttributes(string $cookie, array $params = []): array + { + $params['name'] = $cookie; + $cookieArrays = $this->filterCookies($this->webDriver->manage()->getCookies(), $params); + if (is_array($cookieArrays)) { // Microsoft Edge returns null if there are no cookies... + $cookieAttributes = []; + foreach ($cookieArrays as $cookieArray) { + if ($cookieArray->getName() === $cookie) { + $cookieAttributes['name'] = $cookieArray->getValue(); + $cookieAttributes['path'] = $cookieArray->getPath(); + $cookieAttributes['domain'] = $cookieArray->getDomain(); + $cookieAttributes['secure'] = $cookieArray->isSecure(); + $cookieAttributes['httpOnly'] = $cookieArray->isHttpOnly(); + $cookieAttributes['sameSite'] = $cookieArray->getSameSite(); + $cookieAttributes['expiry'] = date('d/m/Y', $cookieArray->getExpiry()); + + return $cookieAttributes; + } + } + } + + return []; + } + /** * Function used to fill sensitive credentials with user data, data is decrypted immediately prior to fill to avoid * exposure in console or log. diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionGroupObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionGroupObject.php index b608a4846..593320d44 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionGroupObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionGroupObject.php @@ -31,6 +31,7 @@ class ActionGroupObject "createData", "grabAttributeFrom", "grabCookie", + "grabCookieAttributes", "grabFromCurrentUrl", "grabMultiple", "grabPageSource", diff --git a/src/Magento/FunctionalTestingFramework/Test/etc/Actions/grabActions.xsd b/src/Magento/FunctionalTestingFramework/Test/etc/Actions/grabActions.xsd index 9109489aa..993657a86 100644 --- a/src/Magento/FunctionalTestingFramework/Test/etc/Actions/grabActions.xsd +++ b/src/Magento/FunctionalTestingFramework/Test/etc/Actions/grabActions.xsd @@ -13,6 +13,7 @@ + @@ -53,6 +54,21 @@ + + + + Grabs a cookie attributes value. + + + + + + + + + + + @@ -129,4 +145,4 @@ - \ No newline at end of file + diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 0c47036f0..8128f8893 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1100,6 +1100,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $parameterArray ); break; + case "grabCookieAttributes": case "grabCookie": $testSteps .= $this->wrapFunctionCallWithReturnValue( $stepKey, @@ -2371,6 +2372,7 @@ private function validateXmlAttributesMutuallyExclusive($key, $tagName, $attribu 'excludes' => [ 'dontSeeCookie', 'grabCookie', + 'grabCookieAttributes', 'resetCookie', 'seeCookie', 'setCookie', From 9c60f95eeec448026c49cfa6f995ba8effe0c5fb Mon Sep 17 00:00:00 2001 From: "Mohit.k.Sharma" Date: Mon, 16 May 2022 20:06:04 +0530 Subject: [PATCH 218/674] MQE-2953 | Get Cookie Expiry in mftf --- dev/.credentials | 1 - 1 file changed, 1 deletion(-) delete mode 100644 dev/.credentials diff --git a/dev/.credentials b/dev/.credentials deleted file mode 100644 index 50c0c05bf..000000000 --- a/dev/.credentials +++ /dev/null @@ -1 +0,0 @@ -magento/MAGENTO_ADMIN_PASSWORD=Admin@123456 From 9842d5e750b82a3acd03a2f91fba0fe354c8af0d Mon Sep 17 00:00:00 2001 From: "Mohit.k.Sharma" Date: Tue, 17 May 2022 08:30:59 +0530 Subject: [PATCH 219/674] MQE-2953 | Verification Test Added --- .../Resources/ActionGroupWithStepKeyReferences.txt | 1 + dev/tests/verification/Resources/BasicFunctionalTest.txt | 1 + .../FunctionActionGroupWithStepKeyReferencesActionGroup.xml | 1 + .../TestModule/ActionGroup/XmlDuplicateActionGroup.xml | 2 ++ .../Test/BasicFunctionalTest/BasicFunctionalTest.xml | 1 + .../TestModule/Test/XmlDuplicateTest/XmlDuplicateTest.xml | 6 ++++++ 6 files changed, 12 insertions(+) diff --git a/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt b/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt index 04195a1da..0d62a57e3 100644 --- a/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt +++ b/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt @@ -67,6 +67,7 @@ class ActionGroupWithStepKeyReferencesCest $action14ActionGroup = $I->grabMultiple($action14ActionGroup); // stepKey: action14ActionGroup $action15ActionGroup = $I->grabTextFrom($action15ActionGroup); // stepKey: action15ActionGroup $action16ActionGroup = $I->grabValueFrom($action16ActionGroup); // stepKey: action16ActionGroup + $action17ActionGroup = $I->grabCookieAttributes($action17ActionGroup, ['domain' => 'www.google.com']); // stepKey: action17ActionGroup $I->comment("Exiting Action Group [actionGroup] FunctionActionGroupWithStepKeyReferences"); } diff --git a/dev/tests/verification/Resources/BasicFunctionalTest.txt b/dev/tests/verification/Resources/BasicFunctionalTest.txt index e30f50c34..dd78781ba 100644 --- a/dev/tests/verification/Resources/BasicFunctionalTest.txt +++ b/dev/tests/verification/Resources/BasicFunctionalTest.txt @@ -127,6 +127,7 @@ class BasicFunctionalTestCest $getOtpWithInput = $I->getOTP("someInput"); // stepKey: getOtpWithInput $grabAttributeFromKey1 = $I->grabAttributeFrom(".functionalTestSelector", "someInput"); // stepKey: grabAttributeFromKey1 $grabCookieKey1 = $I->grabCookie("grabCookieInput", ['domain' => 'www.google.com']); // stepKey: grabCookieKey1 + $grabCookieAttributesKey1 = $I->grabCookieAttributes("grabCookieAttributesInput", ['domain' => 'www.google.com']); // stepKey: grabCookieAttributesKey1 $grabFromCurrentUrlKey1 = $I->grabFromCurrentUrl("/grabCurrentUrl"); // stepKey: grabFromCurrentUrlKey1 $grabMultipleKey1 = $I->grabMultiple(".functionalTestSelector"); // stepKey: grabMultipleKey1 $grabTextFromKey1 = $I->grabTextFrom(".functionalTestSelector"); // stepKey: grabTextFromKey1 diff --git a/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup/FunctionActionGroupWithStepKeyReferencesActionGroup.xml b/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup/FunctionActionGroupWithStepKeyReferencesActionGroup.xml index 205e32b3a..97f40bafd 100644 --- a/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup/FunctionActionGroupWithStepKeyReferencesActionGroup.xml +++ b/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup/FunctionActionGroupWithStepKeyReferencesActionGroup.xml @@ -28,5 +28,6 @@ + diff --git a/dev/tests/verification/TestModule/ActionGroup/XmlDuplicateActionGroup.xml b/dev/tests/verification/TestModule/ActionGroup/XmlDuplicateActionGroup.xml index 6eefdaf51..14cbd836f 100644 --- a/dev/tests/verification/TestModule/ActionGroup/XmlDuplicateActionGroup.xml +++ b/dev/tests/verification/TestModule/ActionGroup/XmlDuplicateActionGroup.xml @@ -90,6 +90,8 @@ + + diff --git a/dev/tests/verification/TestModule/Test/BasicFunctionalTest/BasicFunctionalTest.xml b/dev/tests/verification/TestModule/Test/BasicFunctionalTest/BasicFunctionalTest.xml index 53bd1f7ef..fa2b5e247 100644 --- a/dev/tests/verification/TestModule/Test/BasicFunctionalTest/BasicFunctionalTest.xml +++ b/dev/tests/verification/TestModule/Test/BasicFunctionalTest/BasicFunctionalTest.xml @@ -72,6 +72,7 @@ + diff --git a/dev/tests/verification/TestModule/Test/XmlDuplicateTest/XmlDuplicateTest.xml b/dev/tests/verification/TestModule/Test/XmlDuplicateTest/XmlDuplicateTest.xml index b24bac3b5..01d7bc88c 100644 --- a/dev/tests/verification/TestModule/Test/XmlDuplicateTest/XmlDuplicateTest.xml +++ b/dev/tests/verification/TestModule/Test/XmlDuplicateTest/XmlDuplicateTest.xml @@ -93,6 +93,8 @@ + + @@ -305,6 +307,8 @@ + + @@ -516,6 +520,8 @@ + + From 71a13bb7e3875fdbaa7face9b9a7f11937b47bfe Mon Sep 17 00:00:00 2001 From: "Mohit.k.Sharma" Date: Tue, 17 May 2022 08:36:19 +0530 Subject: [PATCH 220/674] MQE-2953 | Verification Test FIX --- .../FunctionActionGroupWithStepKeyReferencesActionGroup.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup/FunctionActionGroupWithStepKeyReferencesActionGroup.xml b/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup/FunctionActionGroupWithStepKeyReferencesActionGroup.xml index 97f40bafd..a9275c23b 100644 --- a/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup/FunctionActionGroupWithStepKeyReferencesActionGroup.xml +++ b/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup/FunctionActionGroupWithStepKeyReferencesActionGroup.xml @@ -28,6 +28,6 @@ - + From 4082762101fffbd82a42e09b03b99b5e5b6d05ec Mon Sep 17 00:00:00 2001 From: "Mohit.k.Sharma" Date: Wed, 18 May 2022 10:56:25 +0530 Subject: [PATCH 221/674] MQE-2953 | Fix Code Review Points --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 851543889..4f240a3bd 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -821,8 +821,8 @@ public function grabCookieAttributes(string $cookie, array $params = []): array { $params['name'] = $cookie; $cookieArrays = $this->filterCookies($this->webDriver->manage()->getCookies(), $params); + $cookieAttributes = []; if (is_array($cookieArrays)) { // Microsoft Edge returns null if there are no cookies... - $cookieAttributes = []; foreach ($cookieArrays as $cookieArray) { if ($cookieArray->getName() === $cookie) { $cookieAttributes['name'] = $cookieArray->getValue(); @@ -838,7 +838,7 @@ public function grabCookieAttributes(string $cookie, array $params = []): array } } - return []; + return $cookieAttributes; } /** From 7b039e4efae9b3f61aaa63d4618543ec35373fec Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Mon, 6 Jun 2022 23:15:49 -0500 Subject: [PATCH 222/674] MQE-3520: improve error handling for better error message in ModuleResolver. --- .../FunctionalTestingFramework/Util/ModuleResolver.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php index 434a1cdc3..b330ac84b 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php @@ -7,6 +7,7 @@ namespace Magento\FunctionalTestingFramework\Util; use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; +use Magento\FunctionalTestingFramework\Exceptions\FastFailException; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Util\ModuleResolver\ModuleResolverService; use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; @@ -168,6 +169,7 @@ private function __construct() * * @return array * @throws TestFrameworkException + * @throws FastFailException */ public function getEnabledModules() { @@ -201,7 +203,7 @@ public function getEnabledModules() "MAGENTO_ADMIN_USERNAME" => getenv("MAGENTO_ADMIN_USERNAME"), "MAGENTO_ADMIN_PASSWORD" => getenv("MAGENTO_ADMIN_PASSWORD"), ]; - throw new TestFrameworkException($message, $context); + throw new FastFailException($message, $context); } $this->enabledModules = json_decode($response); @@ -215,6 +217,7 @@ public function getEnabledModules() * @param boolean $verbosePath * @return array * @throws TestFrameworkException + * @throws FastFailException */ public function getModulesPath($verbosePath = false) { From 97f1e5ed0fa025f48e88964cae4d6d706e79aef0 Mon Sep 17 00:00:00 2001 From: Sergiy Vasiutynskyi Date: Tue, 7 Jun 2022 21:43:47 +0300 Subject: [PATCH 223/674] AC-2749 updated 'symfony/console' and 'symfony/process' constraints to support 5.4v, removed PHP 7.3 & PHP 8.0 compatibility --- composer.json | 6 +++--- composer.lock | 6 +++--- etc/config/command.php | 2 +- .../Console/BuildProjectCommand.php | 11 +++++++---- .../Console/CleanProjectCommand.php | 8 ++++++-- .../Console/GenerateDevUrnCommand.php | 13 ++++++++----- .../Console/RunManifestCommand.php | 2 +- .../Console/RunTestCommand.php | 2 +- .../Console/RunTestFailedCommand.php | 7 +------ .../Console/RunTestGroupCommand.php | 6 ++---- .../Console/SetupEnvCommand.php | 8 ++++++-- .../Console/UpgradeTestsCommand.php | 8 ++++++-- 12 files changed, 45 insertions(+), 34 deletions(-) diff --git a/composer.json b/composer.json index 7bd0d3c66..133c8c8e3 100755 --- a/composer.json +++ b/composer.json @@ -12,10 +12,10 @@ "php": ">7.3", "ext-curl": "*", "ext-dom": "*", + "ext-iconv": "*", "ext-intl": "*", "ext-json": "*", "ext-openssl": "*", - "ext-iconv": "*", "allure-framework/allure-codeception": "^1.4", "aws/aws-sdk-php": "^3.132", "codeception/codeception": "^4.1", @@ -31,12 +31,12 @@ "nikic/php-parser": "^4.4", "php-webdriver/webdriver": "^1.9.0", "spomky-labs/otphp": "^10.0", - "symfony/console": "^4.4", + "symfony/console": "^4.4||^5.4", "symfony/dotenv": "^5.3", "symfony/finder": "^5.0", "symfony/http-foundation": "^5.0", "symfony/mime": "^5.0", - "symfony/process": "^4.4", + "symfony/process": "^4.4||^5.4", "weew/helpers-array": "^1.3" }, "require-dev": { diff --git a/composer.lock b/composer.lock index e2834f7ba..12e3144f5 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": "40786b066af41372e12e5af07aeeaf0b", + "content-hash": "69a3d90dcac080bbeb28b46e4533dadb", "packages": [ { "name": "allure-framework/allure-codeception", @@ -7886,10 +7886,10 @@ "php": ">7.3", "ext-curl": "*", "ext-dom": "*", + "ext-iconv": "*", "ext-intl": "*", "ext-json": "*", - "ext-openssl": "*", - "ext-iconv": "*" + "ext-openssl": "*" }, "platform-dev": [], "plugin-api-version": "1.1.0" diff --git a/etc/config/command.php b/etc/config/command.php index 72c6f1a42..0d8fc7997 100644 --- a/etc/config/command.php +++ b/etc/config/command.php @@ -24,7 +24,7 @@ $valid = validateCommand($magentoBinary, $command); if ($valid) { $fullCommand = escapeshellcmd($magentoBinary . " $command" . " $arguments"); - $process = new Symfony\Component\Process\Process($fullCommand); + $process = Symfony\Component\Process\Process::fromShellCommandline($fullCommand); $process->setIdleTimeout($timeout); $process->setTimeout(0); $idleTimeout = false; diff --git a/src/Magento/FunctionalTestingFramework/Console/BuildProjectCommand.php b/src/Magento/FunctionalTestingFramework/Console/BuildProjectCommand.php index afeacaad3..33cc4bc71 100644 --- a/src/Magento/FunctionalTestingFramework/Console/BuildProjectCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/BuildProjectCommand.php @@ -28,7 +28,8 @@ */ class BuildProjectCommand extends Command { - const DEFAULT_YAML_INLINE_DEPTH = 10; + private const SUCCESS_EXIT_CODE = 0; + public const DEFAULT_YAML_INLINE_DEPTH = 10; /** * Env processor manages .env files. @@ -65,11 +66,11 @@ protected function configure() * * @param InputInterface $input * @param OutputInterface $output - * @return void + * @return integer * @throws \Exception * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { $resetCommand = new CleanProjectCommand(); $resetOptions = new ArrayInput([]); @@ -91,7 +92,7 @@ protected function execute(InputInterface $input, OutputInterface $output) // TODO can we just import the codecept symfony command? $codeceptBuildCommand = realpath(PROJECT_ROOT . '/vendor/bin/codecept') . ' build'; - $process = new Process($codeceptBuildCommand); + $process = Process::fromShellCommandline($codeceptBuildCommand); $process->setWorkingDirectory(TESTS_BP); $process->setIdleTimeout(600); $process->setTimeout(0); @@ -112,6 +113,8 @@ function ($type, $buffer) use ($output) { $upgradeOptions = new ArrayInput([]); $upgradeCommand->run($upgradeOptions, $output); } + + return self::SUCCESS_EXIT_CODE; } /** diff --git a/src/Magento/FunctionalTestingFramework/Console/CleanProjectCommand.php b/src/Magento/FunctionalTestingFramework/Console/CleanProjectCommand.php index 641cfe1ed..6517d3ab1 100644 --- a/src/Magento/FunctionalTestingFramework/Console/CleanProjectCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/CleanProjectCommand.php @@ -18,6 +18,8 @@ class CleanProjectCommand extends Command { + private const SUCCESS_EXIT_CODE = 0; + /** * Configures the current command. * @@ -37,11 +39,11 @@ protected function configure() * * @param InputInterface $input * @param OutputInterface $output - * @return void + * @return integer * @throws \Symfony\Component\Console\Exception\LogicException * @throws TestFrameworkException */ - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { $configFiles = [ // codeception.yml file for top level config @@ -97,5 +99,7 @@ protected function execute(InputInterface $input, OutputInterface $output) } $output->writeln('mftf files removed from filesystem.'); + + return self::SUCCESS_EXIT_CODE; } } diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateDevUrnCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateDevUrnCommand.php index 034e6f516..72529158b 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateDevUrnCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateDevUrnCommand.php @@ -19,13 +19,14 @@ class GenerateDevUrnCommand extends Command { + private const SUCCESS_EXIT_CODE = 0; /** * Argument for the path to IDE config file */ - const IDE_FILE_PATH_ARGUMENT = 'path'; + public const IDE_FILE_PATH_ARGUMENT = 'path'; - const PROJECT_PATH_IDENTIFIER = '$PROJECT_DIR$'; - const MFTF_SRC_PATH = 'src/Magento/FunctionalTestingFramework/'; + public const PROJECT_PATH_IDENTIFIER = '$PROJECT_DIR$'; + public const MFTF_SRC_PATH = 'src/Magento/FunctionalTestingFramework/'; /** * Configures the current command. @@ -54,10 +55,10 @@ protected function configure() * * @param InputInterface $input * @param OutputInterface $output - * @return void + * @return int * @throws \Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException */ - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { $miscXmlFilePath = $input->getArgument(self::IDE_FILE_PATH_ARGUMENT); $miscXmlFile = realpath($miscXmlFilePath); @@ -117,6 +118,8 @@ protected function execute(InputInterface $input, OutputInterface $output) //Save output $dom->save($miscXmlFile); $output->writeln("MFTF URN mapping successfully added to {$miscXmlFile}."); + + return self::SUCCESS_EXIT_CODE; } /** diff --git a/src/Magento/FunctionalTestingFramework/Console/RunManifestCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunManifestCommand.php index fbabc5282..3b75cbb87 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunManifestCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunManifestCommand.php @@ -131,7 +131,7 @@ private function runManifestLine($manifestLine, $output, $exit = false) . " run functional --verbose --steps " . $manifestLine; // run the codecept command in a sub process - $process = new Process($codeceptionCommand); + $process = Process::fromShellCommandline($codeceptionCommand); $process->setWorkingDirectory(TESTS_BP); $process->setIdleTimeout(600); $process->setTimeout(0); diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php index 95c2f563a..02e721ae3 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php @@ -261,7 +261,7 @@ private function runTestsInSuite(array $suitesConfig, OutputInterface $output, I */ private function executeTestCommand(string $command, OutputInterface $output) { - $process = new Process($command); + $process = Process::fromShellCommandline($command); $process->setWorkingDirectory(TESTS_BP); $process->setIdleTimeout(600); $process->setTimeout(0); diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index 96b376247..55834ad9b 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -7,14 +7,9 @@ namespace Magento\FunctionalTestingFramework\Console; -use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; -use Magento\FunctionalTestingFramework\Util\Path\FilePathFormatter; -use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Process\Process; -use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; -use Symfony\Component\Console\Input\InputOption; class RunTestFailedCommand extends BaseGenerateCommand { @@ -78,7 +73,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $codeceptionCommand = realpath(PROJECT_ROOT . '/vendor/bin/codecept') . ' run functional '; $codeceptionCommand .= $testManifestList[$i]; - $process = new Process($codeceptionCommand); + $process = Process::fromShellCommandline($codeceptionCommand); $process->setWorkingDirectory(TESTS_BP); $process->setIdleTimeout(600); $process->setTimeout(0); diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php index 38e3366d7..fefbe08f8 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php @@ -7,9 +7,8 @@ namespace Magento\FunctionalTestingFramework\Console; -use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler; use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; -use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputArgument; @@ -17,7 +16,6 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Process\Process; -use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; class RunTestGroupCommand extends BaseGenerateCommand { @@ -133,7 +131,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int } $returnCodes[] = $this->codeceptRunTest($codeceptionCommandString, $output); } else { - $process = new Process($codeceptionCommandString); + $process = Process::fromShellCommandline($codeceptionCommandString); $process->setWorkingDirectory(TESTS_BP); $process->setIdleTimeout(600); $process->setTimeout(0); diff --git a/src/Magento/FunctionalTestingFramework/Console/SetupEnvCommand.php b/src/Magento/FunctionalTestingFramework/Console/SetupEnvCommand.php index 65e8c61e7..258e905d5 100644 --- a/src/Magento/FunctionalTestingFramework/Console/SetupEnvCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/SetupEnvCommand.php @@ -18,6 +18,8 @@ class SetupEnvCommand extends Command { + private const SUCCESS_EXIT_CODE = 0; + /** * Env processor manages .env files. * @@ -47,10 +49,10 @@ protected function configure() * * @param InputInterface $input * @param OutputInterface $output - * @return void + * @return integer * @throws \Symfony\Component\Console\Exception\LogicException */ - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { $config = $this->envProcessor->getEnv(); $userEnv = []; @@ -62,5 +64,7 @@ protected function execute(InputInterface $input, OutputInterface $output) } $this->envProcessor->putEnvFile($userEnv); $output->writeln(".env configuration successfully applied."); + + return self::SUCCESS_EXIT_CODE; } } diff --git a/src/Magento/FunctionalTestingFramework/Console/UpgradeTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/UpgradeTestsCommand.php index 526ab4903..06284605d 100644 --- a/src/Magento/FunctionalTestingFramework/Console/UpgradeTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/UpgradeTestsCommand.php @@ -17,6 +17,8 @@ class UpgradeTestsCommand extends Command { + private const SUCCESS_EXIT_CODE = 0; + /** * Pool of upgrade scripts to run * @@ -46,10 +48,10 @@ protected function configure() * * @param InputInterface $input * @param OutputInterface $output - * @return int|null|void + * @return int * @throws \Exception */ - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { /** @var \Magento\FunctionalTestingFramework\Upgrade\UpgradeInterface[] $upgradeScriptObjects */ $upgradeScriptObjects = $this->upgradeScriptsList->getUpgradeScripts(); @@ -59,5 +61,7 @@ protected function execute(InputInterface $input, OutputInterface $output) LoggingUtil::getInstance()->getLogger(get_class($upgradeScriptObject))->info($upgradeOutput); $output->writeln($upgradeOutput . PHP_EOL); } + + return self::SUCCESS_EXIT_CODE; } } From 62eb19b69ee491299dc6ba6478ff4ebb7e34f5da Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Wed, 22 Jun 2022 13:28:37 +0530 Subject: [PATCH 224/674] 3.10-RC : 3.10 Change log, version bump to develop --- CHANGELOG.md | 10 ++++++++++ composer.json | 2 +- composer.lock | 12 ++++++++++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9688654fb..8ae172d42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ Magento Functional Testing Framework Changelog ================================================ + +3.10 +--------- + +### Enhancements +* Updated symfony/console and symfony/process constraints to support latest Symfony LTS (5.4v) +* Updated Symfony related code to support latest Symfony LTS (5.4v). +* Removed PHP 8.0 & PHP 7.3 compatibility. + + 3.9.0 --------- diff --git a/composer.json b/composer.json index 133c8c8e3..0d67f4738 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": "3.9.0", + "version": "3.10", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 12e3144f5..ad4950066 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": "69a3d90dcac080bbeb28b46e4533dadb", + "content-hash": "592c7edd765aa0e619fc5e5e52e57971", "packages": [ { "name": "allure-framework/allure-codeception", @@ -2224,6 +2224,14 @@ "psr-17", "psr-7" ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-diactoros/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-diactoros/issues", + "rss": "https://github.com/laminas/laminas-diactoros/releases.atom", + "source": "https://github.com/laminas/laminas-diactoros" + }, "funding": [ { "url": "https://funding.communitybridge.org/projects/laminas-project", @@ -7892,5 +7900,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "1.1.0" + "plugin-api-version": "2.1.0" } From 1fb434938bf22588c09cff11ec4454ea41eeadc1 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Wed, 22 Jun 2022 13:45:15 +0530 Subject: [PATCH 225/674] Updated CHANGELOG.md --- CHANGELOG.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ae172d42..1b1d7801f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,19 @@ Magento Functional Testing Framework Changelog 3.10 --------- +### Fixes +* Hashicorp Vault PHP lib being instantiated with wrong params + ### Enhancements * Updated symfony/console and symfony/process constraints to support latest Symfony LTS (5.4v) * Updated Symfony related code to support latest Symfony LTS (5.4v). * Removed PHP 8.0 & PHP 7.3 compatibility. - +* Implement rapid times X clicks on UI element in MFTF +* Log MFTF test dependencies +* Unused entity static check +* Updated docs for new location of password +* Remove any remaining usages of Travis CI from MFTF Repo +* Unit tests for GenerateTestFailedCommandTest and RunTestFailedCommandTest 3.9.0 --------- From f832547f53b0374a14d94d2286d99a41e04b5274 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Thu, 23 Jun 2022 11:08:50 +0530 Subject: [PATCH 226/674] updated mftf version with right format and placed enhancements above fixes in changelog.md file --- CHANGELOG.md | 7 +++---- composer.json | 2 +- composer.lock | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b1d7801f..f3ebe41b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,13 +4,9 @@ Magento Functional Testing Framework Changelog 3.10 --------- -### Fixes -* Hashicorp Vault PHP lib being instantiated with wrong params - ### Enhancements * Updated symfony/console and symfony/process constraints to support latest Symfony LTS (5.4v) * Updated Symfony related code to support latest Symfony LTS (5.4v). -* Removed PHP 8.0 & PHP 7.3 compatibility. * Implement rapid times X clicks on UI element in MFTF * Log MFTF test dependencies * Unused entity static check @@ -18,6 +14,9 @@ Magento Functional Testing Framework Changelog * Remove any remaining usages of Travis CI from MFTF Repo * Unit tests for GenerateTestFailedCommandTest and RunTestFailedCommandTest +### Fixes +* Hashicorp Vault PHP lib being instantiated with wrong params + 3.9.0 --------- diff --git a/composer.json b/composer.json index 0d67f4738..2835da162 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": "3.10", + "version": "3.10.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index ad4950066..3bdb5f12f 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": "592c7edd765aa0e619fc5e5e52e57971", + "content-hash": "fd34c83cd0fc786e9d8d892d1e25b18d", "packages": [ { "name": "allure-framework/allure-codeception", From 9f78ed44e8460d6da05b5b8c1fa9c0fa13b6e50c Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Thu, 23 Jun 2022 11:10:14 +0530 Subject: [PATCH 227/674] updated mftf version with right format and placed enhancements above fixes in changelog.md file --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3ebe41b1..5d75be840 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ Magento Functional Testing Framework Changelog ================================================ -3.10 +3.10.0 --------- ### Enhancements From 400e84b244c0727057351cce0d5f36ba8a77a776 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Thu, 23 Jun 2022 20:32:05 +0530 Subject: [PATCH 228/674] removed extra space --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d75be840..cbc6086a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ Magento Functional Testing Framework Changelog --------- ### Enhancements -* Updated symfony/console and symfony/process constraints to support latest Symfony LTS (5.4v) +* Updated symfony/console and symfony/process constraints to support latest Symfony LTS (5.4v) * Updated Symfony related code to support latest Symfony LTS (5.4v). * Implement rapid times X clicks on UI element in MFTF * Log MFTF test dependencies From 2ff53e7dde573e4278e9516b18fd68759158ac37 Mon Sep 17 00:00:00 2001 From: Faizan Shaikh Date: Thu, 14 Jul 2022 11:31:46 +0530 Subject: [PATCH 229/674] AC-5897:Allure reports are not generated for composer builds when running from repo - Updated composer json --- composer.json | 2 +- composer.lock | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 133c8c8e3..052510251 100755 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ "codeception/module-asserts": "^1.1", "codeception/module-sequence": "^1.0", "codeception/module-webdriver": "^1.0", - "composer/composer": "^1.9||^2.0", + "composer/composer": "^1.9 || ^2.0, !=2.2.16", "csharpru/vault-php": "^4.2.1", "guzzlehttp/guzzle": "^7.3.0", "laminas/laminas-diactoros": "^2.8", diff --git a/composer.lock b/composer.lock index 12e3144f5..19db070e5 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": "69a3d90dcac080bbeb28b46e4533dadb", + "content-hash": "212125f806b6d909aa92f02c3e9d52e9", "packages": [ { "name": "allure-framework/allure-codeception", @@ -2224,6 +2224,14 @@ "psr-17", "psr-7" ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-diactoros/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-diactoros/issues", + "rss": "https://github.com/laminas/laminas-diactoros/releases.atom", + "source": "https://github.com/laminas/laminas-diactoros" + }, "funding": [ { "url": "https://funding.communitybridge.org/projects/laminas-project", @@ -2459,9 +2467,6 @@ "require": { "php": "^7.1 || ^8.0" }, - "replace": { - "myclabs/deep-copy": "self.version" - }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", @@ -7892,5 +7897,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "1.1.0" + "plugin-api-version": "2.3.0" } From c05551b638acdba67700429afc876f1086c4df2c Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Mon, 25 Jul 2022 20:34:03 +0530 Subject: [PATCH 230/674] resolved conflicts --- composer.lock | 4 ---- 1 file changed, 4 deletions(-) diff --git a/composer.lock b/composer.lock index 0ae5ab861..1a8a0b9f3 100644 --- a/composer.lock +++ b/composer.lock @@ -7897,9 +7897,5 @@ "ext-openssl": "*" }, "platform-dev": [], -<<<<<<< HEAD - "plugin-api-version": "2.1.0" -======= "plugin-api-version": "2.3.0" ->>>>>>> 23a85f5a6150fbeec38817a50dc13d0e865b73d8 } From 32938143b83bcf93fd72924518e7193ef9582ebd Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Sat, 30 Jul 2022 19:27:42 +0530 Subject: [PATCH 231/674] MQE-3840 : Fixed allure report not generating issue --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index adaf4a356..2f0959296 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -564,9 +564,9 @@ public function requiredCredentials($testObject) private function generateClassAnnotations($annotationType, $annotationName, $testObject) { $annotationToAppend = null; - $requiredCredentialsMessage = $this->requiredCredentials($testObject); - $credMsg = "\n\n"."This test uses the following credentials:"."\n"; if (!empty($requiredCredentialsMessage) && !empty($annotationName['main'])) { + $requiredCredentialsMessage = $this->requiredCredentials($testObject); + $credMsg = "\n\n"."This test uses the following credentials:"."\n"; $annotationName = ['main'=>$annotationName['main'].', '.$credMsg.''.$requiredCredentialsMessage, 'test_files'=> "\n".$annotationName['test_files'], 'deprecated'=>$annotationName['deprecated']]; } From 0c811dbe8a70385489d0f250f51c361b2ac2cd5f Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Mon, 1 Aug 2022 10:09:09 +0530 Subject: [PATCH 232/674] MQE-3840 : fixed issue --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 2f0959296..1032b9317 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -564,7 +564,7 @@ public function requiredCredentials($testObject) private function generateClassAnnotations($annotationType, $annotationName, $testObject) { $annotationToAppend = null; - if (!empty($requiredCredentialsMessage) && !empty($annotationName['main'])) { + if (!empty($annotationName['main'])) { $requiredCredentialsMessage = $this->requiredCredentials($testObject); $credMsg = "\n\n"."This test uses the following credentials:"."\n"; $annotationName = ['main'=>$annotationName['main'].', '.$credMsg.''.$requiredCredentialsMessage, From 5ad6aca7ead12b5071d5b65ca8a6badbc61bcfc8 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Mon, 1 Aug 2022 10:17:22 +0530 Subject: [PATCH 233/674] fixed issue --- .../FunctionalTestingFramework/Util/TestGenerator.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 1032b9317..d95526676 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -564,11 +564,13 @@ public function requiredCredentials($testObject) private function generateClassAnnotations($annotationType, $annotationName, $testObject) { $annotationToAppend = null; - if (!empty($annotationName['main'])) { + if (!$testObject->isSkipped() && !empty($annotationName['main'])) { $requiredCredentialsMessage = $this->requiredCredentials($testObject); $credMsg = "\n\n"."This test uses the following credentials:"."\n"; - $annotationName = ['main'=>$annotationName['main'].', '.$credMsg.''.$requiredCredentialsMessage, - 'test_files'=> "\n".$annotationName['test_files'], 'deprecated'=>$annotationName['deprecated']]; + $annotationName = (!empty($requiredCredentialsMessage)) ? + ['main'=>$annotationName['main'].', '.$credMsg.''.$requiredCredentialsMessage, + 'test_files'=> "\n".$annotationName['test_files'], 'deprecated'=>$annotationName['deprecated']] + : $annotationName; } switch ($annotationType) { case "title": From 999e98502baa682ba306a34d8ec6267c59ee3771 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" Date: Mon, 1 Aug 2022 11:31:08 +0530 Subject: [PATCH 234/674] verification test --- ...ssueMustGetSkippedWithoutErrorExitCode.txt | 39 +++++++++++++++++++ ...ssueMustGetSkippedWithoutErrorExitCode.xml | 32 +++++++++++++++ .../Tests/SkippedGenerationTest.php | 11 ++++++ 3 files changed, 82 insertions(+) create mode 100644 dev/tests/verification/Resources/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.txt create mode 100644 dev/tests/verification/TestModule/Test/SkippedTest/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.xml diff --git a/dev/tests/verification/Resources/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.txt b/dev/tests/verification/Resources/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.txt new file mode 100644 index 000000000..f35d7ca74 --- /dev/null +++ b/dev/tests/verification/Resources/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.txt @@ -0,0 +1,39 @@ +Test filesverification/TestModule/Test/SkippedTest/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.xml
") + */ +class SkippedTestWithIssueMustGetSkippedWithoutErrorExitCodeCest +{ + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @Stories({"skipped"}) + * @Severity(level = SeverityLevel::MINOR) + * @Features({"TestModule"}) + * @param AcceptanceTester $I + * @return void + * @throws \Exception + */ + public function SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode(AcceptanceTester $I, \Codeception\Scenario $scenario) + { + unlink(__FILE__); + $scenario->skip("This test is skipped due to the following issues:\nSkippedValue"); + } +} diff --git a/dev/tests/verification/TestModule/Test/SkippedTest/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.xml b/dev/tests/verification/TestModule/Test/SkippedTest/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.xml new file mode 100644 index 000000000..b44cd6d81 --- /dev/null +++ b/dev/tests/verification/TestModule/Test/SkippedTest/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.xml @@ -0,0 +1,32 @@ + + + + + + + + <description value=""/> + <severity value="AVERAGE"/> + <skip> + <issueId value="SkippedValue"/> + </skip> + </annotations> + <before> + <createData entity="ReplacementPerson" stepKey="createPersonParam"/> + <actionGroup ref="FunctionalActionGroup" stepKey="beforeGroup"/> + </before> + <createData entity="DefaultPerson" stepKey="createPerson"/> + <actionGroup ref="FunctionalActionGroupWithData" stepKey="actionGroupWithPersistedData1"> + <argument name="person" value="$createPerson$"/> + </actionGroup> + <after> + <actionGroup ref="FunctionalActionGroup" stepKey="afterGroup" after ="notFound"/> + </after> + </test> +</tests> diff --git a/dev/tests/verification/Tests/SkippedGenerationTest.php b/dev/tests/verification/Tests/SkippedGenerationTest.php index 2bc73986a..bfcc5bcc4 100644 --- a/dev/tests/verification/Tests/SkippedGenerationTest.php +++ b/dev/tests/verification/Tests/SkippedGenerationTest.php @@ -41,4 +41,15 @@ public function testMultipleSkippedIssuesGeneration() { $this->generateAndCompareTest('SkippedTestTwoIssues'); } + + /** + * Tests skipped test with multiple issues generation. + * + * @throws \Exception + * @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException + */ + public function testSkippedTestMustNotFailToGenerateWithErrorWhenThereIsIssueWithAnyOfTheStepsAsTheTestIsSkipped() + { + $this->generateAndCompareTest('SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode'); + } } From 082077eb5d38cda378c178b226c6af0d207dc857 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 1 Aug 2022 12:17:10 +0530 Subject: [PATCH 235/674] verification test --- dev/tests/verification/Tests/SkippedGenerationTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/verification/Tests/SkippedGenerationTest.php b/dev/tests/verification/Tests/SkippedGenerationTest.php index bfcc5bcc4..b2d1c8fdc 100644 --- a/dev/tests/verification/Tests/SkippedGenerationTest.php +++ b/dev/tests/verification/Tests/SkippedGenerationTest.php @@ -42,8 +42,8 @@ public function testMultipleSkippedIssuesGeneration() $this->generateAndCompareTest('SkippedTestTwoIssues'); } - /** - * Tests skipped test with multiple issues generation. + /** + * Tests skipped test doesnt fail to generate when there is issue in test * * @throws \Exception * @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException From 4c8f13dcd8273636b809184a9a58fb20067f71da Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 1 Aug 2022 20:16:55 +0530 Subject: [PATCH 236/674] 3.10.1-RC : 3.10.1 Release --- CHANGELOG.md | 8 ++++++++ composer.json | 2 +- composer.lock | 5 ++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbc6086a0..163e71085 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Magento Functional Testing Framework Changelog ================================================ +3.10.1 +--------- + +### Fixes + +* Fixed Allure reports are not generated for composer builds when running from repo +* Fixed All MFTF scheduled build isn't h + 3.10.0 --------- diff --git a/composer.json b/composer.json index 1149253c2..e731e9685 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": "3.10.0", + "version": "3.10.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 1a8a0b9f3..5b52e5956 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": "fd34c83cd0fc786e9d8d892d1e25b18d", + "content-hash": "b504d7cfd0bf4111f83579996edb79ef", "packages": [ { "name": "allure-framework/allure-codeception", @@ -2467,6 +2467,9 @@ "require": { "php": "^7.1 || ^8.0" }, + "replace": { + "myclabs/deep-copy": "self.version" + }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", From 82df8c5f3feb6eb066a1b36a5877298ff4078e44 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 1 Aug 2022 20:37:38 +0530 Subject: [PATCH 237/674] 3.10.1-RC : 3.10.1 Release --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 163e71085..cdd015d32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,8 @@ Magento Functional Testing Framework Changelog ### Fixes -* Fixed Allure reports are not generated for composer builds when running from repo -* Fixed All MFTF scheduled build isn't h +* Fixed Allure reports not generated for composer builds. +* Fixed All MFTF scheduled build isn't generating allure report. 3.10.0 --------- From 9f8abc26b0fee1246eaf115f01842f3bb85e9d74 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 1 Aug 2022 20:38:33 +0530 Subject: [PATCH 238/674] 3.10.1-RC : 3.10.1 Release --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdd015d32..f893ba79c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,8 @@ Magento Functional Testing Framework Changelog ### Fixes -* Fixed Allure reports not generated for composer builds. -* Fixed All MFTF scheduled build isn't generating allure report. +* Fixed allure reports not generating for composer builds. +* Fixed all MFTF scheduled build not generating allure report. 3.10.0 --------- From 6d94d58d67d55bad6e496a976e0f4f2025525b86 Mon Sep 17 00:00:00 2001 From: Dmytro Shevtsov <shevtsov@adobe.com> Date: Mon, 1 Aug 2022 16:43:54 -0500 Subject: [PATCH 239/674] 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/actions.md | 180 +++++++++++++++--------------- docs/test/annotations.md | 4 +- 7 files changed, 98 insertions(+), 98 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index bd48d1554..501b1d5e9 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -443,4 +443,4 @@ MAGENTO_ADMIN_WEBAPI_TOKEN_LIFETIME=10800 [`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 100b95317..721f94a7e 100644 --- a/docs/data.md +++ b/docs/data.md @@ -340,6 +340,6 @@ Attributes|Type|Use|Description [`<required-entities>`]: #requiredentity-tag [`<var>`]: #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 f895ebe5a..87cb04f79 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -347,7 +347,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/ @@ -355,7 +355,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.4/install-gde/system-requirements.html [PhpStorm]: https://www.jetbrains.com/phpstorm/ diff --git a/docs/reporting.md b/docs/reporting.md index 629c3cfd8..225890fcb 100644 --- a/docs/reporting.md +++ b/docs/reporting.md @@ -305,7 +305,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 d2dc9924c..141afc9e6 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 <!-- {% endraw %} --> <!-- Link Definitions --> -[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/actions.md b/docs/test/actions.md index 73e3da0d6..94db9c989 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://codeception.com/docs/modules/WebDriver#Actions). Some actions drive browser elements, while others use REST APIs. ## Common attributes @@ -144,7 +144,7 @@ The following test actions return a variable: * [grabAttributeFrom](#grabattributefrom) * [grabCookie](#grabcookie) -* [grabCookieAttributes](#grabCookieAttributes) +* [grabCookieAttributes](#grabcookieattributes) * [grabFromCurrentUrl](#grabfromcurrenturl) * [grabMultiple](#grabmultiple) * [grabPageSource](#grabpagesource) @@ -188,7 +188,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://codeception.com/docs/modules/WebDriver#acceptPopup). Attribute|Type|Use|Description ---|---|---|--- @@ -207,7 +207,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://codeception.com/docs/modules/WebDriver#amOnPage). Attribute|Type|Use|Description ---|---|---|--- @@ -227,7 +227,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://codeception.com/docs/modules/WebDriver#amOnSubdomain). Attribute|Type|Use|Description ---|---|---|--- @@ -251,7 +251,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://codeception.com/docs/modules/WebDriver#amOnUrl). Attribute|Type|Use|Description ---|---|---|--- @@ -269,7 +269,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://codeception.com/docs/modules/WebDriver#appendField). Attribute|Type|Use|Description ---|---|---|--- @@ -288,7 +288,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://codeception.com/docs/modules/WebDriver#attachFile). Attribute|Type|Use|Description ---|---|---|--- @@ -307,7 +307,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://codeception.com/docs/modules/WebDriver#cancelPopup). Attribute|Type|Use|Description ---|---|---|--- @@ -324,7 +324,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://codeception.com/docs/modules/WebDriver#checkOption). Attribute|Type|Use|Description ---|---|---|--- @@ -361,12 +361,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://codeception.com/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://codeception.com/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. @@ -386,7 +386,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://codeception.com/docs/modules/WebDriver#clickWithLeftButton). Attribute|Type|Use|Description ---|---|---|--- @@ -417,7 +417,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://codeception.com/docs/modules/WebDriver#clickWithRightButton). Attribute|Type|Use|Description ---|---|---|--- @@ -465,7 +465,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://codeception.com/docs/modules/WebDriver#closeTab). Attribute|Type|Use|Description ---|---|---|--- @@ -623,7 +623,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://codeception.com/docs/modules/WebDriver#dontSee). Attribute|Type|Use|Description ---|---|---|--- @@ -643,7 +643,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://codeception.com/docs/modules/WebDriver#dontSeeCheckboxIsChecked). Attribute|Type|Use|Description ---|---|---|--- @@ -661,7 +661,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://codeception.com/docs/modules/WebDriver#dontSeeCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -685,7 +685,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://codeception.com/docs/modules/WebDriver#dontSeeCurrentUrlEquals). Attribute|Type|Use|Description ---|---|---|--- @@ -703,7 +703,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://codeception.com/docs/modules/WebDriver#dontSeeCurrentUrlMatches) Attribute|Type|Use|Description ---|---|---|--- @@ -721,7 +721,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://codeception.com/docs/modules/WebDriver#dontSeeElement). Attribute|Type|Use|Description ---|---|---|--- @@ -740,7 +740,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://codeception.com/docs/modules/WebDriver#dontSeeElementInDOM). Attribute|Type|Use|Description ---|---|---|--- @@ -759,7 +759,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://codeception.com/docs/modules/WebDriver#dontSeeInCurrentUrl). Attribute|Type|Use|Description ---|---|---|--- @@ -777,7 +777,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://codeception.com/docs/modules/WebDriver#dontSeeInField). Attribute|Type|Use|Description ---|---|---|--- @@ -797,7 +797,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://codeception.com/docs/modules/WebDriver#dontSeeInFormFields). Attribute|Type|Use|Description ---|---|---|--- @@ -816,7 +816,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://codeception.com/docs/modules/WebDriver#dontSeeInPageSource). Attribute|Type|Use|Description ---|---|---|--- @@ -834,7 +834,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://codeception.com/docs/modules/WebDriver#dontSeeInSource). Attribute|Type|Use|Description ---|---|---|--- @@ -854,7 +854,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://codeception.com/docs/modules/WebDriver#dontSeeInTitle). Attribute|Type|Use|Description ---|---|---|--- @@ -889,7 +889,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://codeception.com/docs/modules/WebDriver#dontSeeLink). Attribute|Type|Use|Description ---|---|---|--- @@ -913,7 +913,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://codeception.com/docs/modules/WebDriver#dontSeeOptionIsSelected). Attribute|Type|Use|Description ---|---|---|--- @@ -932,7 +932,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://codeception.com/docs/modules/WebDriver#doubleClick). Attribute|Type|Use|Description ---|---|---|--- @@ -950,7 +950,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://codeception.com/docs/modules/WebDriver#dragAndDrop). Attribute|Type|Use|Description ---|---|---|--- @@ -976,7 +976,7 @@ Attribute|Type|Use|Description ### rapidClick -See [rapidClick docs on codeception.com](http://codeception.com/docs/modules/WebDriver#rapidClick). +See [rapidClick docs on codeception.com](https://codeception.com/docs/modules/WebDriver#rapidClick). | Attribute | Type | Use | Description | |------------|--------|----------|-------------------------------------------------| @@ -995,7 +995,7 @@ See [rapidClick docs on codeception.com](http://codeception.com/docs/modules/Web ### executeJS -See [executeJS docs on codeception.com](http://codeception.com/docs/modules/WebDriver#executeJS). +See [executeJS docs on codeception.com](https://codeception.com/docs/modules/WebDriver#executeJS). Attribute|Type|Use|Description ---|---|---|--- @@ -1016,7 +1016,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://codeception.com/docs/modules/WebDriver#fillField). Attribute|Type|Use|Description ---|---|---|--- @@ -1115,7 +1115,7 @@ Attribute|Type|Use|Description ### grabAttributeFrom -See [grabAttributeFrom docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabAttributeFrom). +See [grabAttributeFrom docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabAttributeFrom). Attribute|Type|Use|Description ---|---|---|--- @@ -1135,7 +1135,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://codeception.com/docs/modules/WebDriver#grabCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -1161,7 +1161,7 @@ To access this value, use `{$grabCookieExampleDomain}` in later actions. --> ### grabCookieAttributes -See [grabCookieAttributes docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabCookieAttributes). +See [grabCookieAttributes docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabCookieAttributes). Attribute|Type|Use|Description ---|---|---|--- @@ -1189,7 +1189,7 @@ To access expiry date, use `{$grabCookieExampleDomain.expiry}` in later actions ### grabFromCurrentUrl -See [grabFromCurrentUrl docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabFromCurrentUrl).. +See [grabFromCurrentUrl docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabFromCurrentUrl).. Attribute|Type|Use|Description ---|---|---|--- @@ -1208,7 +1208,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://codeception.com/docs/modules/WebDriver#grabMultiple).. Attribute|Type|Use|Description ---|---|---|--- @@ -1234,7 +1234,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://codeception.com/docs/modules/WebDriver#grabPageSource). Attribute|Type|Use|Description ---|---|---|--- @@ -1252,7 +1252,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://codeception.com/docs/modules/WebDriver#grabTextFrom). Attribute|Type|Use|Description ---|---|---|--- @@ -1307,7 +1307,7 @@ Attribute|Type|Use|Description ### loadSessionSnapshot -See [loadSessionSnapshot docs on codeception.com](http://codeception.com/docs/modules/WebDriver#loadSessionSnapshot). +See [loadSessionSnapshot docs on codeception.com](https://codeception.com/docs/modules/WebDriver#loadSessionSnapshot). Attribute|Type|Use|Description ---|---|---|--- @@ -1368,7 +1368,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://codeception.com/docs/modules/WebDriver#makeScreenshot). Attribute|Type|Use|Description ---|---|---|--- @@ -1391,7 +1391,7 @@ This action does not add a screenshot to the Allure [report](../reporting.md).</ ### maximizeWindow -See [maximizeWindow docs on codeception.com](http://codeception.com/docs/modules/WebDriver#maximizeWindow). +See [maximizeWindow docs on codeception.com](https://codeception.com/docs/modules/WebDriver#maximizeWindow). Attribute|Type|Use|Description ---|---|---|--- @@ -1408,7 +1408,7 @@ Attribute|Type|Use|Description ### moveBack -See [moveBack docs on codeception.com](http://codeception.com/docs/modules/WebDriver#moveBack). +See [moveBack docs on codeception.com](https://codeception.com/docs/modules/WebDriver#moveBack). Attribute|Type|Use|Description ---|---|---|--- @@ -1425,7 +1425,7 @@ Attribute|Type|Use|Description ### moveForward -See [moveForward docs on codeception.com](http://codeception.com/docs/modules/WebDriver#moveForward).. +See [moveForward docs on codeception.com](https://codeception.com/docs/modules/WebDriver#moveForward).. Attribute|Type|Use|Description ---|---|---|--- @@ -1440,7 +1440,7 @@ Attribute|Type|Use|Description ### moveMouseOver -See [moveMouseOver docs on codeception.com](http://codeception.com/docs/modules/WebDriver#moveMouseOver). +See [moveMouseOver docs on codeception.com](https://codeception.com/docs/modules/WebDriver#moveMouseOver). Attribute|Type|Use|Description ---|---|---|--- @@ -1484,7 +1484,7 @@ Attribute|Type|Use|Description ### openNewTab -See [openNewTab docs on codeception.com](http://codeception.com/docs/modules/WebDriver#openNewTab). +See [openNewTab docs on codeception.com](https://codeception.com/docs/modules/WebDriver#openNewTab). Attribute|Type|Use|Description ---|---|---|--- @@ -1529,7 +1529,7 @@ Attribute|Type|Use|Description ### pressKey -See [pressKey docs on codeception.com](http://codeception.com/docs/modules/WebDriver#pressKey). +See [pressKey docs on codeception.com](https://codeception.com/docs/modules/WebDriver#pressKey). Attribute|Type|Use|Description ---|---|---|--- @@ -1557,7 +1557,7 @@ To press more than one key at a time, wrap the keys in secondary `[]`. ### reloadPage -See [reloadPage docs on codeception.com](http://codeception.com/docs/modules/WebDriver#reloadPage). +See [reloadPage docs on codeception.com](https://codeception.com/docs/modules/WebDriver#reloadPage). Attribute|Type|Use|Description ---|---|---|--- @@ -1589,7 +1589,7 @@ Attribute|Type|Use|Description ### resetCookie -See [resetCookie docs on codeception.com](http://codeception.com/docs/modules/WebDriver#resetCookie). +See [resetCookie docs on codeception.com](https://codeception.com/docs/modules/WebDriver#resetCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -1613,7 +1613,7 @@ Attribute|Type|Use|Description ### resizeWindow -See [resizeWindow docs on codeception.com](http://codeception.com/docs/modules/WebDriver#resizeWindow). +See [resizeWindow docs on codeception.com](https://codeception.com/docs/modules/WebDriver#resizeWindow). Attribute|Type|Use|Description ---|---|---|--- @@ -1632,7 +1632,7 @@ Attribute|Type|Use|Description ### saveSessionSnapshot -See [saveSessionSnapshot docs on codeception.com](http://codeception.com/docs/modules/WebDriver#saveSessionSnapshot). +See [saveSessionSnapshot docs on codeception.com](https://codeception.com/docs/modules/WebDriver#saveSessionSnapshot). Attribute|Type|Use|Description ---|---|---|--- @@ -1650,7 +1650,7 @@ Attribute|Type|Use|Description ### scrollTo -See [scrollTo docs on codeception.com](http://codeception.com/docs/modules/WebDriver#scrollTo). +See [scrollTo docs on codeception.com](https://codeception.com/docs/modules/WebDriver#scrollTo). Attribute|Type|Use|Description ---|---|---|--- @@ -1723,7 +1723,7 @@ On this test step the MFTF: ### see -See [see docs on codeception.com](http://codeception.com/docs/modules/WebDriver#see). +See [see docs on codeception.com](https://codeception.com/docs/modules/WebDriver#see). Attribute|Type|Use|Description ---|---|---|--- @@ -1743,7 +1743,7 @@ Attribute|Type|Use|Description ### seeCheckboxIsChecked -See [seeCheckboxIsChecked docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeCheckboxIsChecked). +See [seeCheckboxIsChecked docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeCheckboxIsChecked). Attribute|Type|Use|Description ---|---|---|--- @@ -1761,7 +1761,7 @@ Attribute|Type|Use|Description ### seeCookie -See [seeCookie docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeCookie). +See [seeCookie docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -1785,7 +1785,7 @@ Attribute|Type|Use|Description ### seeCurrentUrlEquals -See [seeCurrentUrlEquals docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeCurrentUrlEquals). +See [seeCurrentUrlEquals docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeCurrentUrlEquals). Attribute|Type|Use|Description ---|---|---|--- @@ -1803,7 +1803,7 @@ Attribute|Type|Use|Description ### seeCurrentUrlMatches -See [seeCurrentUrlMatches docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeCurrentUrlMatches). +See [seeCurrentUrlMatches docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeCurrentUrlMatches). Attribute|Type|Use|Description ---|---|---|--- @@ -1821,7 +1821,7 @@ Attribute|Type|Use|Description ### seeElement -See [seeElement docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeElement). +See [seeElement docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeElement). Attribute|Type|Use|Description ---|---|---|--- @@ -1841,7 +1841,7 @@ Attribute|Type|Use|Description ### seeElementInDOM -See [seeElementInDOM docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeElementInDOM). +See [seeElementInDOM docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeElementInDOM). Attribute|Type|Use|Description ---|---|---|--- @@ -1860,7 +1860,7 @@ Attribute|Type|Use|Description ### seeInCurrentUrl -See [seeInCurrentUrl docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInCurrentUrl). +See [seeInCurrentUrl docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInCurrentUrl). Attribute|Type|Use|Description ---|---|---|--- @@ -1878,7 +1878,7 @@ Attribute|Type|Use|Description ### seeInField -See [seeInField docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInField). +See [seeInField docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInField). Attribute|Type|Use|Description ---|---|---|--- @@ -1898,7 +1898,7 @@ Attribute|Type|Use|Description ### seeInFormFields -See [seeInFormFields docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInFormFields). +See [seeInFormFields docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInFormFields). Attribute|Type|Use|Description ---|---|---|--- @@ -1917,7 +1917,7 @@ Attribute|Type|Use|Description ### seeInPageSource -See [seeInPageSource docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInPageSource). +See [seeInPageSource docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInPageSource). Attribute|Type|Use|Description ---|---|---|--- @@ -1937,7 +1937,7 @@ You must encode the `html` using a tool such as [CyberChef](https://gchq.github. ### seeInPopup -See [seeInPopup docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInPopup). +See [seeInPopup docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInPopup). Attribute|Type|Use|Description ---|---|---|--- @@ -1955,7 +1955,7 @@ Attribute|Type|Use|Description ### seeInSource -See [seeInSource docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInSource). +See [seeInSource docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInSource). Attribute|Type|Use|Description ---|---|---|--- @@ -1975,7 +1975,7 @@ You must encode the `html` using a tool such as [CyberChef](https://gchq.github. ### seeInTitle -See [seeInTitle docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInTitle). +See [seeInTitle docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInTitle). Attribute|Type|Use|Description ---|---|---|--- @@ -1993,7 +1993,7 @@ Attribute|Type|Use|Description ### seeLink -See [seeLink docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeLink). +See [seeLink docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeLink). Attribute|Type|Use|Description ---|---|---|--- @@ -2017,7 +2017,7 @@ Attribute|Type|Use|Description ### seeNumberOfElements -See [seeNumberOfElements docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeNumberOfElements). +See [seeNumberOfElements docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeNumberOfElements). Attribute|Type|Use|Description ---|---|---|--- @@ -2042,7 +2042,7 @@ Attribute|Type|Use|Description ### seeOptionIsSelected -See [seeOptionIsSelected docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeOptionIsSelected). +See [seeOptionIsSelected docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeOptionIsSelected). Attribute|Type|Use|Description ---|---|---|--- @@ -2061,7 +2061,7 @@ Attribute|Type|Use|Description ### selectOption -See [selectOption docs on codeception.com](http://codeception.com/docs/modules/WebDriver#selectOption). +See [selectOption docs on codeception.com](https://codeception.com/docs/modules/WebDriver#selectOption). Attribute|Type|Use|Description ---|---|---|--- @@ -2104,7 +2104,7 @@ It contains a child element `<array>` 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://codeception.com/docs/modules/WebDriver#setCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -2124,7 +2124,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://codeception.com/docs/modules/WebDriver#submitForm). Attribute|Type|Use|Description ---|---|---|--- @@ -2144,7 +2144,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://codeception.com/docs/modules/WebDriver#switchToIFrame). Attribute|Type|Use|Description ---|---|---|--- @@ -2163,7 +2163,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://codeception.com/docs/modules/WebDriver#switchToNextTab). Attribute|Type|Use|Description ---|---|---|--- @@ -2186,7 +2186,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://codeception.com/docs/modules/WebDriver#switchToPreviousTab). Attribute|Type|Use|Description ---|---|---|--- @@ -2209,7 +2209,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://codeception.com/docs/modules/WebDriver#switchToWindow). Attribute|Type|Use|Description ---|---|---|--- @@ -2227,7 +2227,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://codeception.com/docs/modules/WebDriver#typeInPopup). Attribute|Type|Use|Description ---|---|---|--- @@ -2245,7 +2245,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://codeception.com/docs/modules/WebDriver#uncheckOption). Attribute|Type|Use|Description ---|---|---|--- @@ -2263,7 +2263,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://codeception.com/docs/modules/WebDriver#unselectOption). Attribute|Type|Use|Description ---|---|---|--- @@ -2315,7 +2315,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://codeception.com/docs/modules/WebDriver#wait). Attribute|Type|Use|Description ---|---|---|--- @@ -2351,7 +2351,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://codeception.com/docs/modules/WebDriver#waitForElementChange). Attribute|Type|Use|Description ---|---|---|--- @@ -2371,7 +2371,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://codeception.com/docs/modules/WebDriver#waitForElement). Attribute|Type|Use|Description ---|---|---|--- @@ -2390,7 +2390,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://codeception.com/docs/modules/WebDriver#waitForElementNotVisible). Attribute|Type|Use|Description ---|---|---|--- @@ -2409,7 +2409,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://codeception.com/docs/modules/WebDriver#waitForElementVisible). Attribute|Type|Use|Description ---|---|---|--- @@ -2427,7 +2427,7 @@ Attribute|Type|Use|Description ### waitForElementClickable -See [waitForElementClickable docs on codeception.com](http://codeception.com/docs/modules/WebDriver#waitForElementClickable). +See [waitForElementClickable docs on codeception.com](https://codeception.com/docs/modules/WebDriver#waitForElementClickable). Attribute|Type|Use|Description ---|---|---|--- @@ -2446,7 +2446,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://codeception.com/docs/modules/WebDriver#waitForJS). Attribute|Type|Use|Description ---|---|---|--- @@ -2552,7 +2552,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://codeception.com/docs/modules/WebDriver#waitForText). Attribute|Type|Use|Description ---|---|---|--- diff --git a/docs/test/annotations.md b/docs/test/annotations.md index 79cc00e80..cd3a672a1 100644 --- a/docs/test/annotations.md +++ b/docs/test/annotations.md @@ -225,8 +225,8 @@ Attribute|Type|Use [`@Description`]: https://github.com/allure-framework/allure-phpunit#extended-test-class-or-test-method-description [`@Features`]: https://github.com/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://github.com/allure-framework/allure-phpunit#set-test-severity [`@Stories`]: https://github.com/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 From b6ca8a19a97294bb63b965f58b5910df956a17eb Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Sat, 30 Jul 2022 19:27:42 +0530 Subject: [PATCH 240/674] MQE-3840 : Fixed allure report not generating issue --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index adaf4a356..2f0959296 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -564,9 +564,9 @@ public function requiredCredentials($testObject) private function generateClassAnnotations($annotationType, $annotationName, $testObject) { $annotationToAppend = null; - $requiredCredentialsMessage = $this->requiredCredentials($testObject); - $credMsg = "\n\n"."This test uses the following credentials:"."\n"; if (!empty($requiredCredentialsMessage) && !empty($annotationName['main'])) { + $requiredCredentialsMessage = $this->requiredCredentials($testObject); + $credMsg = "\n\n"."This test uses the following credentials:"."\n"; $annotationName = ['main'=>$annotationName['main'].', '.$credMsg.''.$requiredCredentialsMessage, 'test_files'=> "\n".$annotationName['test_files'], 'deprecated'=>$annotationName['deprecated']]; } From b6ac740387d846a523a9be5b485d3abea43e824f Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 1 Aug 2022 10:09:09 +0530 Subject: [PATCH 241/674] MQE-3840 : fixed issue --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 2f0959296..1032b9317 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -564,7 +564,7 @@ public function requiredCredentials($testObject) private function generateClassAnnotations($annotationType, $annotationName, $testObject) { $annotationToAppend = null; - if (!empty($requiredCredentialsMessage) && !empty($annotationName['main'])) { + if (!empty($annotationName['main'])) { $requiredCredentialsMessage = $this->requiredCredentials($testObject); $credMsg = "\n\n"."This test uses the following credentials:"."\n"; $annotationName = ['main'=>$annotationName['main'].', '.$credMsg.''.$requiredCredentialsMessage, From 8ba093c9493bc11e82e40574b74811fb70bdb299 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 1 Aug 2022 10:17:22 +0530 Subject: [PATCH 242/674] fixed issue --- .../FunctionalTestingFramework/Util/TestGenerator.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 1032b9317..d95526676 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -564,11 +564,13 @@ public function requiredCredentials($testObject) private function generateClassAnnotations($annotationType, $annotationName, $testObject) { $annotationToAppend = null; - if (!empty($annotationName['main'])) { + if (!$testObject->isSkipped() && !empty($annotationName['main'])) { $requiredCredentialsMessage = $this->requiredCredentials($testObject); $credMsg = "\n\n"."This test uses the following credentials:"."\n"; - $annotationName = ['main'=>$annotationName['main'].', '.$credMsg.''.$requiredCredentialsMessage, - 'test_files'=> "\n".$annotationName['test_files'], 'deprecated'=>$annotationName['deprecated']]; + $annotationName = (!empty($requiredCredentialsMessage)) ? + ['main'=>$annotationName['main'].', '.$credMsg.''.$requiredCredentialsMessage, + 'test_files'=> "\n".$annotationName['test_files'], 'deprecated'=>$annotationName['deprecated']] + : $annotationName; } switch ($annotationType) { case "title": From 57d643bd5ff174e9da3050fa03659dbb1b76cead Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 1 Aug 2022 11:31:08 +0530 Subject: [PATCH 243/674] verification test --- ...ssueMustGetSkippedWithoutErrorExitCode.txt | 39 +++++++++++++++++++ ...ssueMustGetSkippedWithoutErrorExitCode.xml | 32 +++++++++++++++ .../Tests/SkippedGenerationTest.php | 11 ++++++ 3 files changed, 82 insertions(+) create mode 100644 dev/tests/verification/Resources/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.txt create mode 100644 dev/tests/verification/TestModule/Test/SkippedTest/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.xml diff --git a/dev/tests/verification/Resources/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.txt b/dev/tests/verification/Resources/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.txt new file mode 100644 index 000000000..f35d7ca74 --- /dev/null +++ b/dev/tests/verification/Resources/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.txt @@ -0,0 +1,39 @@ +<?php +namespace Magento\AcceptanceTest\_default\Backend; + +use Magento\FunctionalTestingFramework\AcceptanceTester; +use \Codeception\Util\Locator; +use Yandex\Allure\Adapter\Annotation\Features; +use Yandex\Allure\Adapter\Annotation\Stories; +use Yandex\Allure\Adapter\Annotation\Title; +use Yandex\Allure\Adapter\Annotation\Description; +use Yandex\Allure\Adapter\Annotation\Parameter; +use Yandex\Allure\Adapter\Annotation\Severity; +use Yandex\Allure\Adapter\Model\SeverityLevel; +use Yandex\Allure\Adapter\Annotation\TestCaseId; + +/** + * @Title("[NO TESTCASEID]: skippedTest") + * @Description("<h3>Test files</h3>verification/TestModule/Test/SkippedTest/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.xml<br>") + */ +class SkippedTestWithIssueMustGetSkippedWithoutErrorExitCodeCest +{ + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @Stories({"skipped"}) + * @Severity(level = SeverityLevel::MINOR) + * @Features({"TestModule"}) + * @param AcceptanceTester $I + * @return void + * @throws \Exception + */ + public function SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode(AcceptanceTester $I, \Codeception\Scenario $scenario) + { + unlink(__FILE__); + $scenario->skip("This test is skipped due to the following issues:\nSkippedValue"); + } +} diff --git a/dev/tests/verification/TestModule/Test/SkippedTest/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.xml b/dev/tests/verification/TestModule/Test/SkippedTest/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.xml new file mode 100644 index 000000000..b44cd6d81 --- /dev/null +++ b/dev/tests/verification/TestModule/Test/SkippedTest/SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> + <test name="SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode"> + <annotations> + <stories value="skipped"/> + <title value="skippedTest"/> + <description value=""/> + <severity value="AVERAGE"/> + <skip> + <issueId value="SkippedValue"/> + </skip> + </annotations> + <before> + <createData entity="ReplacementPerson" stepKey="createPersonParam"/> + <actionGroup ref="FunctionalActionGroup" stepKey="beforeGroup"/> + </before> + <createData entity="DefaultPerson" stepKey="createPerson"/> + <actionGroup ref="FunctionalActionGroupWithData" stepKey="actionGroupWithPersistedData1"> + <argument name="person" value="$createPerson$"/> + </actionGroup> + <after> + <actionGroup ref="FunctionalActionGroup" stepKey="afterGroup" after ="notFound"/> + </after> + </test> +</tests> diff --git a/dev/tests/verification/Tests/SkippedGenerationTest.php b/dev/tests/verification/Tests/SkippedGenerationTest.php index 2bc73986a..bfcc5bcc4 100644 --- a/dev/tests/verification/Tests/SkippedGenerationTest.php +++ b/dev/tests/verification/Tests/SkippedGenerationTest.php @@ -41,4 +41,15 @@ public function testMultipleSkippedIssuesGeneration() { $this->generateAndCompareTest('SkippedTestTwoIssues'); } + + /** + * Tests skipped test with multiple issues generation. + * + * @throws \Exception + * @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException + */ + public function testSkippedTestMustNotFailToGenerateWithErrorWhenThereIsIssueWithAnyOfTheStepsAsTheTestIsSkipped() + { + $this->generateAndCompareTest('SkippedTestWithIssueMustGetSkippedWithoutErrorExitCode'); + } } From 8b97663478d587fa86fdc833ac7def12702304b1 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 1 Aug 2022 12:17:10 +0530 Subject: [PATCH 244/674] verification test --- dev/tests/verification/Tests/SkippedGenerationTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/verification/Tests/SkippedGenerationTest.php b/dev/tests/verification/Tests/SkippedGenerationTest.php index bfcc5bcc4..b2d1c8fdc 100644 --- a/dev/tests/verification/Tests/SkippedGenerationTest.php +++ b/dev/tests/verification/Tests/SkippedGenerationTest.php @@ -42,8 +42,8 @@ public function testMultipleSkippedIssuesGeneration() $this->generateAndCompareTest('SkippedTestTwoIssues'); } - /** - * Tests skipped test with multiple issues generation. + /** + * Tests skipped test doesnt fail to generate when there is issue in test * * @throws \Exception * @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException From ad1a2e9f708b0ed6cd46a2827c02f39eb0360d02 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 1 Aug 2022 20:16:55 +0530 Subject: [PATCH 245/674] 3.10.1-RC : 3.10.1 Release --- CHANGELOG.md | 8 ++++++++ composer.json | 2 +- composer.lock | 5 ++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbc6086a0..163e71085 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Magento Functional Testing Framework Changelog ================================================ +3.10.1 +--------- + +### Fixes + +* Fixed Allure reports are not generated for composer builds when running from repo +* Fixed All MFTF scheduled build isn't h + 3.10.0 --------- diff --git a/composer.json b/composer.json index 1149253c2..e731e9685 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": "3.10.0", + "version": "3.10.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 1a8a0b9f3..5b52e5956 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": "fd34c83cd0fc786e9d8d892d1e25b18d", + "content-hash": "b504d7cfd0bf4111f83579996edb79ef", "packages": [ { "name": "allure-framework/allure-codeception", @@ -2467,6 +2467,9 @@ "require": { "php": "^7.1 || ^8.0" }, + "replace": { + "myclabs/deep-copy": "self.version" + }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", From c02cb597bc4fb776817da9283514e1cdb6ab42b2 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 1 Aug 2022 20:37:38 +0530 Subject: [PATCH 246/674] 3.10.1-RC : 3.10.1 Release --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 163e71085..cdd015d32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,8 @@ Magento Functional Testing Framework Changelog ### Fixes -* Fixed Allure reports are not generated for composer builds when running from repo -* Fixed All MFTF scheduled build isn't h +* Fixed Allure reports not generated for composer builds. +* Fixed All MFTF scheduled build isn't generating allure report. 3.10.0 --------- From 8d7db5616c39c6fd44f8b401c091e3090ed26f2f Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 1 Aug 2022 20:38:33 +0530 Subject: [PATCH 247/674] 3.10.1-RC : 3.10.1 Release --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdd015d32..f893ba79c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,8 @@ Magento Functional Testing Framework Changelog ### Fixes -* Fixed Allure reports not generated for composer builds. -* Fixed All MFTF scheduled build isn't generating allure report. +* Fixed allure reports not generating for composer builds. +* Fixed all MFTF scheduled build not generating allure report. 3.10.0 --------- From a8082a145db0d13e6d30994c6e9fe9ef6a1090a5 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 11 Aug 2022 12:34:42 +0530 Subject: [PATCH 248/674] Merging 3.10.1 master back to develop | Admin Credentials being output to console in WebAPIAuth --- .../DataTransport/Auth/WebApiAuth.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php index be29a7e19..f80ffc105 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php @@ -119,8 +119,6 @@ public static function getAdminToken($username = null, $password = null) $message .= Tfa::isEnabled() ? ' and 2FA settings:' : ':' . PHP_EOL; } catch (TestFrameworkException $e) { } - $message .= "username: {$login}" . PHP_EOL; - $message .= "password: {$password}" . PHP_EOL; $message .= $errMessage; $context = ['url' => $authUrl]; throw new FastFailException($message, $context); From 6c5a0dc88be2f247650477fd0b93a789d226271b Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 11 Aug 2022 12:37:30 +0530 Subject: [PATCH 249/674] Merging 3.10.1 master back to develop | Admin Credentials being output to console in WebAPIAuth --- .../DataTransport/Auth/WebApiAuth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php index f80ffc105..bc4e52571 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php @@ -113,7 +113,7 @@ public static function getAdminToken($username = null, $password = null) $errMessage = $e->getMessage(); } - $message = 'Cannot retrieve API token with credentials. Please check the following configurations'; + $message = 'Cannot retrieve API token with credentials.'; try { // No exception will ever throw from here $message .= Tfa::isEnabled() ? ' and 2FA settings:' : ':' . PHP_EOL; From 6241ed1bc0f1b7a456c9023dc3a7a085de58a54a Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 23 Aug 2022 14:42:53 +0530 Subject: [PATCH 250/674] 3.10.2-RC : mftf deployment --- CHANGELOG.md | 8 ++++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f893ba79c..c92fa924f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Magento Functional Testing Framework Changelog ================================================ +3.10.2 +--------- + +### Fixes + +* Fixed admin credentials being output to console in WebAPIAuth + + 3.10.1 --------- diff --git a/composer.json b/composer.json index e731e9685..0161b4883 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": "3.10.1", + "version": "3.10.2", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 5b52e5956..1f79506a8 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": "b504d7cfd0bf4111f83579996edb79ef", + "content-hash": "075f7ef8a19879334ba1e0443f4e9679", "packages": [ { "name": "allure-framework/allure-codeception", From 8905e2a9050012aeb1a213ec56d75de5230fa4ba Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 23 Aug 2022 14:45:40 +0530 Subject: [PATCH 251/674] 3.10.2-RC : mftf deployment --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c92fa924f..3566f8718 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,6 @@ Magento Functional Testing Framework Changelog * Fixed admin credentials being output to console in WebAPIAuth - 3.10.1 --------- From fbc50cf17e0991a707748f2fc800496484c0d9cf Mon Sep 17 00:00:00 2001 From: Dmytro Shevtsov <shevtsov@adobe.com> Date: Mon, 1 Aug 2022 16:43:54 -0500 Subject: [PATCH 252/674] 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/actions.md | 180 +++++++++++++++--------------- docs/test/annotations.md | 4 +- 7 files changed, 98 insertions(+), 98 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index bd48d1554..501b1d5e9 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -443,4 +443,4 @@ MAGENTO_ADMIN_WEBAPI_TOKEN_LIFETIME=10800 [`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 100b95317..721f94a7e 100644 --- a/docs/data.md +++ b/docs/data.md @@ -340,6 +340,6 @@ Attributes|Type|Use|Description [`<required-entities>`]: #requiredentity-tag [`<var>`]: #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 f895ebe5a..87cb04f79 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -347,7 +347,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/ @@ -355,7 +355,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.4/install-gde/system-requirements.html [PhpStorm]: https://www.jetbrains.com/phpstorm/ diff --git a/docs/reporting.md b/docs/reporting.md index 629c3cfd8..225890fcb 100644 --- a/docs/reporting.md +++ b/docs/reporting.md @@ -305,7 +305,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 d2dc9924c..141afc9e6 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 <!-- {% endraw %} --> <!-- Link Definitions --> -[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/actions.md b/docs/test/actions.md index 73e3da0d6..94db9c989 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://codeception.com/docs/modules/WebDriver#Actions). Some actions drive browser elements, while others use REST APIs. ## Common attributes @@ -144,7 +144,7 @@ The following test actions return a variable: * [grabAttributeFrom](#grabattributefrom) * [grabCookie](#grabcookie) -* [grabCookieAttributes](#grabCookieAttributes) +* [grabCookieAttributes](#grabcookieattributes) * [grabFromCurrentUrl](#grabfromcurrenturl) * [grabMultiple](#grabmultiple) * [grabPageSource](#grabpagesource) @@ -188,7 +188,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://codeception.com/docs/modules/WebDriver#acceptPopup). Attribute|Type|Use|Description ---|---|---|--- @@ -207,7 +207,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://codeception.com/docs/modules/WebDriver#amOnPage). Attribute|Type|Use|Description ---|---|---|--- @@ -227,7 +227,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://codeception.com/docs/modules/WebDriver#amOnSubdomain). Attribute|Type|Use|Description ---|---|---|--- @@ -251,7 +251,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://codeception.com/docs/modules/WebDriver#amOnUrl). Attribute|Type|Use|Description ---|---|---|--- @@ -269,7 +269,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://codeception.com/docs/modules/WebDriver#appendField). Attribute|Type|Use|Description ---|---|---|--- @@ -288,7 +288,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://codeception.com/docs/modules/WebDriver#attachFile). Attribute|Type|Use|Description ---|---|---|--- @@ -307,7 +307,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://codeception.com/docs/modules/WebDriver#cancelPopup). Attribute|Type|Use|Description ---|---|---|--- @@ -324,7 +324,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://codeception.com/docs/modules/WebDriver#checkOption). Attribute|Type|Use|Description ---|---|---|--- @@ -361,12 +361,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://codeception.com/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://codeception.com/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. @@ -386,7 +386,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://codeception.com/docs/modules/WebDriver#clickWithLeftButton). Attribute|Type|Use|Description ---|---|---|--- @@ -417,7 +417,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://codeception.com/docs/modules/WebDriver#clickWithRightButton). Attribute|Type|Use|Description ---|---|---|--- @@ -465,7 +465,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://codeception.com/docs/modules/WebDriver#closeTab). Attribute|Type|Use|Description ---|---|---|--- @@ -623,7 +623,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://codeception.com/docs/modules/WebDriver#dontSee). Attribute|Type|Use|Description ---|---|---|--- @@ -643,7 +643,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://codeception.com/docs/modules/WebDriver#dontSeeCheckboxIsChecked). Attribute|Type|Use|Description ---|---|---|--- @@ -661,7 +661,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://codeception.com/docs/modules/WebDriver#dontSeeCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -685,7 +685,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://codeception.com/docs/modules/WebDriver#dontSeeCurrentUrlEquals). Attribute|Type|Use|Description ---|---|---|--- @@ -703,7 +703,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://codeception.com/docs/modules/WebDriver#dontSeeCurrentUrlMatches) Attribute|Type|Use|Description ---|---|---|--- @@ -721,7 +721,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://codeception.com/docs/modules/WebDriver#dontSeeElement). Attribute|Type|Use|Description ---|---|---|--- @@ -740,7 +740,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://codeception.com/docs/modules/WebDriver#dontSeeElementInDOM). Attribute|Type|Use|Description ---|---|---|--- @@ -759,7 +759,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://codeception.com/docs/modules/WebDriver#dontSeeInCurrentUrl). Attribute|Type|Use|Description ---|---|---|--- @@ -777,7 +777,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://codeception.com/docs/modules/WebDriver#dontSeeInField). Attribute|Type|Use|Description ---|---|---|--- @@ -797,7 +797,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://codeception.com/docs/modules/WebDriver#dontSeeInFormFields). Attribute|Type|Use|Description ---|---|---|--- @@ -816,7 +816,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://codeception.com/docs/modules/WebDriver#dontSeeInPageSource). Attribute|Type|Use|Description ---|---|---|--- @@ -834,7 +834,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://codeception.com/docs/modules/WebDriver#dontSeeInSource). Attribute|Type|Use|Description ---|---|---|--- @@ -854,7 +854,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://codeception.com/docs/modules/WebDriver#dontSeeInTitle). Attribute|Type|Use|Description ---|---|---|--- @@ -889,7 +889,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://codeception.com/docs/modules/WebDriver#dontSeeLink). Attribute|Type|Use|Description ---|---|---|--- @@ -913,7 +913,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://codeception.com/docs/modules/WebDriver#dontSeeOptionIsSelected). Attribute|Type|Use|Description ---|---|---|--- @@ -932,7 +932,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://codeception.com/docs/modules/WebDriver#doubleClick). Attribute|Type|Use|Description ---|---|---|--- @@ -950,7 +950,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://codeception.com/docs/modules/WebDriver#dragAndDrop). Attribute|Type|Use|Description ---|---|---|--- @@ -976,7 +976,7 @@ Attribute|Type|Use|Description ### rapidClick -See [rapidClick docs on codeception.com](http://codeception.com/docs/modules/WebDriver#rapidClick). +See [rapidClick docs on codeception.com](https://codeception.com/docs/modules/WebDriver#rapidClick). | Attribute | Type | Use | Description | |------------|--------|----------|-------------------------------------------------| @@ -995,7 +995,7 @@ See [rapidClick docs on codeception.com](http://codeception.com/docs/modules/Web ### executeJS -See [executeJS docs on codeception.com](http://codeception.com/docs/modules/WebDriver#executeJS). +See [executeJS docs on codeception.com](https://codeception.com/docs/modules/WebDriver#executeJS). Attribute|Type|Use|Description ---|---|---|--- @@ -1016,7 +1016,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://codeception.com/docs/modules/WebDriver#fillField). Attribute|Type|Use|Description ---|---|---|--- @@ -1115,7 +1115,7 @@ Attribute|Type|Use|Description ### grabAttributeFrom -See [grabAttributeFrom docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabAttributeFrom). +See [grabAttributeFrom docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabAttributeFrom). Attribute|Type|Use|Description ---|---|---|--- @@ -1135,7 +1135,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://codeception.com/docs/modules/WebDriver#grabCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -1161,7 +1161,7 @@ To access this value, use `{$grabCookieExampleDomain}` in later actions. --> ### grabCookieAttributes -See [grabCookieAttributes docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabCookieAttributes). +See [grabCookieAttributes docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabCookieAttributes). Attribute|Type|Use|Description ---|---|---|--- @@ -1189,7 +1189,7 @@ To access expiry date, use `{$grabCookieExampleDomain.expiry}` in later actions ### grabFromCurrentUrl -See [grabFromCurrentUrl docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabFromCurrentUrl).. +See [grabFromCurrentUrl docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabFromCurrentUrl).. Attribute|Type|Use|Description ---|---|---|--- @@ -1208,7 +1208,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://codeception.com/docs/modules/WebDriver#grabMultiple).. Attribute|Type|Use|Description ---|---|---|--- @@ -1234,7 +1234,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://codeception.com/docs/modules/WebDriver#grabPageSource). Attribute|Type|Use|Description ---|---|---|--- @@ -1252,7 +1252,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://codeception.com/docs/modules/WebDriver#grabTextFrom). Attribute|Type|Use|Description ---|---|---|--- @@ -1307,7 +1307,7 @@ Attribute|Type|Use|Description ### loadSessionSnapshot -See [loadSessionSnapshot docs on codeception.com](http://codeception.com/docs/modules/WebDriver#loadSessionSnapshot). +See [loadSessionSnapshot docs on codeception.com](https://codeception.com/docs/modules/WebDriver#loadSessionSnapshot). Attribute|Type|Use|Description ---|---|---|--- @@ -1368,7 +1368,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://codeception.com/docs/modules/WebDriver#makeScreenshot). Attribute|Type|Use|Description ---|---|---|--- @@ -1391,7 +1391,7 @@ This action does not add a screenshot to the Allure [report](../reporting.md).</ ### maximizeWindow -See [maximizeWindow docs on codeception.com](http://codeception.com/docs/modules/WebDriver#maximizeWindow). +See [maximizeWindow docs on codeception.com](https://codeception.com/docs/modules/WebDriver#maximizeWindow). Attribute|Type|Use|Description ---|---|---|--- @@ -1408,7 +1408,7 @@ Attribute|Type|Use|Description ### moveBack -See [moveBack docs on codeception.com](http://codeception.com/docs/modules/WebDriver#moveBack). +See [moveBack docs on codeception.com](https://codeception.com/docs/modules/WebDriver#moveBack). Attribute|Type|Use|Description ---|---|---|--- @@ -1425,7 +1425,7 @@ Attribute|Type|Use|Description ### moveForward -See [moveForward docs on codeception.com](http://codeception.com/docs/modules/WebDriver#moveForward).. +See [moveForward docs on codeception.com](https://codeception.com/docs/modules/WebDriver#moveForward).. Attribute|Type|Use|Description ---|---|---|--- @@ -1440,7 +1440,7 @@ Attribute|Type|Use|Description ### moveMouseOver -See [moveMouseOver docs on codeception.com](http://codeception.com/docs/modules/WebDriver#moveMouseOver). +See [moveMouseOver docs on codeception.com](https://codeception.com/docs/modules/WebDriver#moveMouseOver). Attribute|Type|Use|Description ---|---|---|--- @@ -1484,7 +1484,7 @@ Attribute|Type|Use|Description ### openNewTab -See [openNewTab docs on codeception.com](http://codeception.com/docs/modules/WebDriver#openNewTab). +See [openNewTab docs on codeception.com](https://codeception.com/docs/modules/WebDriver#openNewTab). Attribute|Type|Use|Description ---|---|---|--- @@ -1529,7 +1529,7 @@ Attribute|Type|Use|Description ### pressKey -See [pressKey docs on codeception.com](http://codeception.com/docs/modules/WebDriver#pressKey). +See [pressKey docs on codeception.com](https://codeception.com/docs/modules/WebDriver#pressKey). Attribute|Type|Use|Description ---|---|---|--- @@ -1557,7 +1557,7 @@ To press more than one key at a time, wrap the keys in secondary `[]`. ### reloadPage -See [reloadPage docs on codeception.com](http://codeception.com/docs/modules/WebDriver#reloadPage). +See [reloadPage docs on codeception.com](https://codeception.com/docs/modules/WebDriver#reloadPage). Attribute|Type|Use|Description ---|---|---|--- @@ -1589,7 +1589,7 @@ Attribute|Type|Use|Description ### resetCookie -See [resetCookie docs on codeception.com](http://codeception.com/docs/modules/WebDriver#resetCookie). +See [resetCookie docs on codeception.com](https://codeception.com/docs/modules/WebDriver#resetCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -1613,7 +1613,7 @@ Attribute|Type|Use|Description ### resizeWindow -See [resizeWindow docs on codeception.com](http://codeception.com/docs/modules/WebDriver#resizeWindow). +See [resizeWindow docs on codeception.com](https://codeception.com/docs/modules/WebDriver#resizeWindow). Attribute|Type|Use|Description ---|---|---|--- @@ -1632,7 +1632,7 @@ Attribute|Type|Use|Description ### saveSessionSnapshot -See [saveSessionSnapshot docs on codeception.com](http://codeception.com/docs/modules/WebDriver#saveSessionSnapshot). +See [saveSessionSnapshot docs on codeception.com](https://codeception.com/docs/modules/WebDriver#saveSessionSnapshot). Attribute|Type|Use|Description ---|---|---|--- @@ -1650,7 +1650,7 @@ Attribute|Type|Use|Description ### scrollTo -See [scrollTo docs on codeception.com](http://codeception.com/docs/modules/WebDriver#scrollTo). +See [scrollTo docs on codeception.com](https://codeception.com/docs/modules/WebDriver#scrollTo). Attribute|Type|Use|Description ---|---|---|--- @@ -1723,7 +1723,7 @@ On this test step the MFTF: ### see -See [see docs on codeception.com](http://codeception.com/docs/modules/WebDriver#see). +See [see docs on codeception.com](https://codeception.com/docs/modules/WebDriver#see). Attribute|Type|Use|Description ---|---|---|--- @@ -1743,7 +1743,7 @@ Attribute|Type|Use|Description ### seeCheckboxIsChecked -See [seeCheckboxIsChecked docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeCheckboxIsChecked). +See [seeCheckboxIsChecked docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeCheckboxIsChecked). Attribute|Type|Use|Description ---|---|---|--- @@ -1761,7 +1761,7 @@ Attribute|Type|Use|Description ### seeCookie -See [seeCookie docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeCookie). +See [seeCookie docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -1785,7 +1785,7 @@ Attribute|Type|Use|Description ### seeCurrentUrlEquals -See [seeCurrentUrlEquals docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeCurrentUrlEquals). +See [seeCurrentUrlEquals docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeCurrentUrlEquals). Attribute|Type|Use|Description ---|---|---|--- @@ -1803,7 +1803,7 @@ Attribute|Type|Use|Description ### seeCurrentUrlMatches -See [seeCurrentUrlMatches docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeCurrentUrlMatches). +See [seeCurrentUrlMatches docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeCurrentUrlMatches). Attribute|Type|Use|Description ---|---|---|--- @@ -1821,7 +1821,7 @@ Attribute|Type|Use|Description ### seeElement -See [seeElement docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeElement). +See [seeElement docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeElement). Attribute|Type|Use|Description ---|---|---|--- @@ -1841,7 +1841,7 @@ Attribute|Type|Use|Description ### seeElementInDOM -See [seeElementInDOM docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeElementInDOM). +See [seeElementInDOM docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeElementInDOM). Attribute|Type|Use|Description ---|---|---|--- @@ -1860,7 +1860,7 @@ Attribute|Type|Use|Description ### seeInCurrentUrl -See [seeInCurrentUrl docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInCurrentUrl). +See [seeInCurrentUrl docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInCurrentUrl). Attribute|Type|Use|Description ---|---|---|--- @@ -1878,7 +1878,7 @@ Attribute|Type|Use|Description ### seeInField -See [seeInField docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInField). +See [seeInField docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInField). Attribute|Type|Use|Description ---|---|---|--- @@ -1898,7 +1898,7 @@ Attribute|Type|Use|Description ### seeInFormFields -See [seeInFormFields docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInFormFields). +See [seeInFormFields docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInFormFields). Attribute|Type|Use|Description ---|---|---|--- @@ -1917,7 +1917,7 @@ Attribute|Type|Use|Description ### seeInPageSource -See [seeInPageSource docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInPageSource). +See [seeInPageSource docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInPageSource). Attribute|Type|Use|Description ---|---|---|--- @@ -1937,7 +1937,7 @@ You must encode the `html` using a tool such as [CyberChef](https://gchq.github. ### seeInPopup -See [seeInPopup docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInPopup). +See [seeInPopup docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInPopup). Attribute|Type|Use|Description ---|---|---|--- @@ -1955,7 +1955,7 @@ Attribute|Type|Use|Description ### seeInSource -See [seeInSource docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInSource). +See [seeInSource docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInSource). Attribute|Type|Use|Description ---|---|---|--- @@ -1975,7 +1975,7 @@ You must encode the `html` using a tool such as [CyberChef](https://gchq.github. ### seeInTitle -See [seeInTitle docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeInTitle). +See [seeInTitle docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInTitle). Attribute|Type|Use|Description ---|---|---|--- @@ -1993,7 +1993,7 @@ Attribute|Type|Use|Description ### seeLink -See [seeLink docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeLink). +See [seeLink docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeLink). Attribute|Type|Use|Description ---|---|---|--- @@ -2017,7 +2017,7 @@ Attribute|Type|Use|Description ### seeNumberOfElements -See [seeNumberOfElements docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeNumberOfElements). +See [seeNumberOfElements docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeNumberOfElements). Attribute|Type|Use|Description ---|---|---|--- @@ -2042,7 +2042,7 @@ Attribute|Type|Use|Description ### seeOptionIsSelected -See [seeOptionIsSelected docs on codeception.com](http://codeception.com/docs/modules/WebDriver#seeOptionIsSelected). +See [seeOptionIsSelected docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeOptionIsSelected). Attribute|Type|Use|Description ---|---|---|--- @@ -2061,7 +2061,7 @@ Attribute|Type|Use|Description ### selectOption -See [selectOption docs on codeception.com](http://codeception.com/docs/modules/WebDriver#selectOption). +See [selectOption docs on codeception.com](https://codeception.com/docs/modules/WebDriver#selectOption). Attribute|Type|Use|Description ---|---|---|--- @@ -2104,7 +2104,7 @@ It contains a child element `<array>` 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://codeception.com/docs/modules/WebDriver#setCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -2124,7 +2124,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://codeception.com/docs/modules/WebDriver#submitForm). Attribute|Type|Use|Description ---|---|---|--- @@ -2144,7 +2144,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://codeception.com/docs/modules/WebDriver#switchToIFrame). Attribute|Type|Use|Description ---|---|---|--- @@ -2163,7 +2163,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://codeception.com/docs/modules/WebDriver#switchToNextTab). Attribute|Type|Use|Description ---|---|---|--- @@ -2186,7 +2186,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://codeception.com/docs/modules/WebDriver#switchToPreviousTab). Attribute|Type|Use|Description ---|---|---|--- @@ -2209,7 +2209,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://codeception.com/docs/modules/WebDriver#switchToWindow). Attribute|Type|Use|Description ---|---|---|--- @@ -2227,7 +2227,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://codeception.com/docs/modules/WebDriver#typeInPopup). Attribute|Type|Use|Description ---|---|---|--- @@ -2245,7 +2245,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://codeception.com/docs/modules/WebDriver#uncheckOption). Attribute|Type|Use|Description ---|---|---|--- @@ -2263,7 +2263,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://codeception.com/docs/modules/WebDriver#unselectOption). Attribute|Type|Use|Description ---|---|---|--- @@ -2315,7 +2315,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://codeception.com/docs/modules/WebDriver#wait). Attribute|Type|Use|Description ---|---|---|--- @@ -2351,7 +2351,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://codeception.com/docs/modules/WebDriver#waitForElementChange). Attribute|Type|Use|Description ---|---|---|--- @@ -2371,7 +2371,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://codeception.com/docs/modules/WebDriver#waitForElement). Attribute|Type|Use|Description ---|---|---|--- @@ -2390,7 +2390,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://codeception.com/docs/modules/WebDriver#waitForElementNotVisible). Attribute|Type|Use|Description ---|---|---|--- @@ -2409,7 +2409,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://codeception.com/docs/modules/WebDriver#waitForElementVisible). Attribute|Type|Use|Description ---|---|---|--- @@ -2427,7 +2427,7 @@ Attribute|Type|Use|Description ### waitForElementClickable -See [waitForElementClickable docs on codeception.com](http://codeception.com/docs/modules/WebDriver#waitForElementClickable). +See [waitForElementClickable docs on codeception.com](https://codeception.com/docs/modules/WebDriver#waitForElementClickable). Attribute|Type|Use|Description ---|---|---|--- @@ -2446,7 +2446,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://codeception.com/docs/modules/WebDriver#waitForJS). Attribute|Type|Use|Description ---|---|---|--- @@ -2552,7 +2552,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://codeception.com/docs/modules/WebDriver#waitForText). Attribute|Type|Use|Description ---|---|---|--- diff --git a/docs/test/annotations.md b/docs/test/annotations.md index 79cc00e80..cd3a672a1 100644 --- a/docs/test/annotations.md +++ b/docs/test/annotations.md @@ -225,8 +225,8 @@ Attribute|Type|Use [`@Description`]: https://github.com/allure-framework/allure-phpunit#extended-test-class-or-test-method-description [`@Features`]: https://github.com/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://github.com/allure-framework/allure-phpunit#set-test-severity [`@Stories`]: https://github.com/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 From 0eb9dacaa8aebb6dc716d899d85a8c64a114e880 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 11 Aug 2022 12:34:42 +0530 Subject: [PATCH 253/674] Merging 3.10.1 master back to develop | Admin Credentials being output to console in WebAPIAuth --- .../DataTransport/Auth/WebApiAuth.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php index be29a7e19..f80ffc105 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php @@ -119,8 +119,6 @@ public static function getAdminToken($username = null, $password = null) $message .= Tfa::isEnabled() ? ' and 2FA settings:' : ':' . PHP_EOL; } catch (TestFrameworkException $e) { } - $message .= "username: {$login}" . PHP_EOL; - $message .= "password: {$password}" . PHP_EOL; $message .= $errMessage; $context = ['url' => $authUrl]; throw new FastFailException($message, $context); From 22f511b09883414ac02202ff2d20937dd3b670f2 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 11 Aug 2022 12:37:30 +0530 Subject: [PATCH 254/674] Merging 3.10.1 master back to develop | Admin Credentials being output to console in WebAPIAuth --- .../DataTransport/Auth/WebApiAuth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php index f80ffc105..bc4e52571 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php @@ -113,7 +113,7 @@ public static function getAdminToken($username = null, $password = null) $errMessage = $e->getMessage(); } - $message = 'Cannot retrieve API token with credentials. Please check the following configurations'; + $message = 'Cannot retrieve API token with credentials.'; try { // No exception will ever throw from here $message .= Tfa::isEnabled() ? ' and 2FA settings:' : ':' . PHP_EOL; From c257e62e9914277d9d094da68756ddb46bd16cd2 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 23 Aug 2022 14:42:53 +0530 Subject: [PATCH 255/674] 3.10.2-RC : mftf deployment --- CHANGELOG.md | 8 ++++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f893ba79c..c92fa924f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Magento Functional Testing Framework Changelog ================================================ +3.10.2 +--------- + +### Fixes + +* Fixed admin credentials being output to console in WebAPIAuth + + 3.10.1 --------- diff --git a/composer.json b/composer.json index e731e9685..0161b4883 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": "3.10.1", + "version": "3.10.2", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 5b52e5956..1f79506a8 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": "b504d7cfd0bf4111f83579996edb79ef", + "content-hash": "075f7ef8a19879334ba1e0443f4e9679", "packages": [ { "name": "allure-framework/allure-codeception", From cf1f8eb39e545e6c0f85d3687d54f95dfa90978d Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 23 Aug 2022 14:45:40 +0530 Subject: [PATCH 256/674] 3.10.2-RC : mftf deployment --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c92fa924f..3566f8718 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,6 @@ Magento Functional Testing Framework Changelog * Fixed admin credentials being output to console in WebAPIAuth - 3.10.1 --------- From 7519463fd057072782001373d0bb7548ca93f8cf Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 24 Aug 2022 16:59:51 +0530 Subject: [PATCH 257/674] updated lock --- composer.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.lock b/composer.lock index 1f79506a8..40205fb9d 100644 --- a/composer.lock +++ b/composer.lock @@ -7755,6 +7755,7 @@ "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1.6|^2" }, + "conflict": { "ext-psr": "<1.1|>=2", "symfony/config": "<5.3", From a3cb74fc4bac550f4fd7affd4821463111be0b7d Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 24 Aug 2022 17:36:20 +0530 Subject: [PATCH 258/674] updated changelog.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3566f8718..071f59887 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ Magento Functional Testing Framework Changelog ### Fixes * Fixed admin credentials being output to console in WebAPIAuth +* Fixed links in docs + 3.10.1 --------- From 8f6167a02be91c856ad5447cbc01bcacea2d97de Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 24 Aug 2022 16:59:51 +0530 Subject: [PATCH 259/674] updated lock --- composer.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.lock b/composer.lock index 1f79506a8..40205fb9d 100644 --- a/composer.lock +++ b/composer.lock @@ -7755,6 +7755,7 @@ "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1.6|^2" }, + "conflict": { "ext-psr": "<1.1|>=2", "symfony/config": "<5.3", From 393a99e0533dff7fe69c8fe9a7b2e99fc351f317 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 24 Aug 2022 17:36:20 +0530 Subject: [PATCH 260/674] updated changelog.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3566f8718..071f59887 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ Magento Functional Testing Framework Changelog ### Fixes * Fixed admin credentials being output to console in WebAPIAuth +* Fixed links in docs + 3.10.1 --------- From a35b728e4bc4102a951db0ec9013ace4df8c8bed Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 24 Aug 2022 20:13:50 +0530 Subject: [PATCH 261/674] fix --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 071f59887..2319ee48c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Magento Functional Testing Framework Changelog * Fixed links in docs + 3.10.1 --------- From 46a70c74cd0a347d08c53d60abc0fae1e265c222 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 24 Aug 2022 20:18:00 +0530 Subject: [PATCH 262/674] removed unwanted file --- composer.lock | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.lock b/composer.lock index 40205fb9d..1f79506a8 100644 --- a/composer.lock +++ b/composer.lock @@ -7755,7 +7755,6 @@ "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1.6|^2" }, - "conflict": { "ext-psr": "<1.1|>=2", "symfony/config": "<5.3", From 7989eb3e40d32c2c9e8ffcbb9e1c5ddbbc9b4188 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 1 Sep 2022 14:57:25 +0530 Subject: [PATCH 263/674] ACQE-3966 : Chrome settings for cost reductions --- 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 d5dbde466..d7809bfcb 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -38,4 +38,4 @@ modules: capabilities: unhandledPromptBehavior: "ignore" chromeOptions: - args: ["--no-sandbox", "--window-size=1280,1024", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--ignore-certificate-errors"] + args: ["--no-sandbox", "--window-size=1280,1024", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--ignore-certificate-errors", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad"] From e10a7ec0687867dcf5c9207c44f96d3c6fee77dd Mon Sep 17 00:00:00 2001 From: Rajesh Kumar <glo71317@adobe.com> Date: Thu, 8 Sep 2022 14:12:05 +0530 Subject: [PATCH 264/674] AC-3005::Investigate drop of composer 1.x support --- composer.json | 2 +- composer.lock | 756 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 596 insertions(+), 162 deletions(-) diff --git a/composer.json b/composer.json index 0161b4883..6135b8339 100755 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ "codeception/module-asserts": "^1.1", "codeception/module-sequence": "^1.0", "codeception/module-webdriver": "^1.0", - "composer/composer": "^1.9 || ^2.0, !=2.2.16", + "composer/composer": "^2.0, !=2.2.16", "csharpru/vault-php": "^4.2.1", "guzzlehttp/guzzle": "^7.3.0", "laminas/laminas-diactoros": "^2.8", diff --git a/composer.lock b/composer.lock index 1f79506a8..0e87804e8 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": "075f7ef8a19879334ba1e0443f4e9679", + "content-hash": "942fc154b2c5fac0a1bf869cb3ced388", "packages": [ { "name": "allure-framework/allure-codeception", @@ -847,16 +847,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.2.11", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582" + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", - "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", "shasum": "" }, "require": { @@ -903,7 +903,7 @@ "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.11" + "source": "https://github.com/composer/ca-bundle/tree/1.3.3" }, "funding": [ { @@ -919,42 +919,124 @@ "type": "tidelift" } ], - "time": "2021-09-25T20:32:43+00:00" + "time": "2022-07-20T07:14:26+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "shasum": "" + }, + "require": { + "composer/pcre": "^2 || ^3", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.6", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/filesystem": "^5.4 || ^6", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + }, + "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": "2022-06-19T11:31:27+00:00" }, { "name": "composer/composer", - "version": "2.1.9", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "e558c88f28d102d497adec4852802c0dc14c7077" + "reference": "777d542e3af65f8e7a66a4d98ce7a697da339414" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/e558c88f28d102d497adec4852802c0dc14c7077", - "reference": "e558c88f28d102d497adec4852802c0dc14c7077", + "url": "https://api.github.com/repos/composer/composer/zipball/777d542e3af65f8e7a66a4d98ce7a697da339414", + "reference": "777d542e3af65f8e7a66a4d98ce7a697da339414", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", + "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", + "composer/pcre": "^2 || ^3", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^2.0", + "composer/spdx-licenses": "^1.5.7", + "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "react/promise": "^1.2 || ^2.7", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "react/promise": "^2.8", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" + "seld/phar-utils": "^1.2", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.11 || ^6.0.11", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/finder": "^5.4 || ^6.0", + "symfony/polyfill-php73": "^1.24", + "symfony/polyfill-php80": "^1.24", + "symfony/process": "^5.4 || ^6.0" }, "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1", + "phpstan/phpstan-symfony": "^1.1", + "symfony/phpunit-bridge": "^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -967,7 +1049,12 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-main": "2.4-dev" + }, + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] } }, "autoload": { @@ -1001,7 +1088,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.1.9" + "source": "https://github.com/composer/composer/tree/2.4.1" }, "funding": [ { @@ -1017,7 +1104,7 @@ "type": "tidelift" } ], - "time": "2021-10-05T07:47:38+00:00" + "time": "2022-08-20T09:44:50+00:00" }, { "name": "composer/metadata-minifier", @@ -1088,25 +1175,96 @@ ], "time": "2021-04-07T13:37:33+00:00" }, + { + "name": "composer/pcre", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.0.0" + }, + "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": "2022-02-25T20:21:48+00:00" + }, { "name": "composer/semver", - "version": "3.2.5", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.54", + "phpstan/phpstan": "^1.4", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", @@ -1151,7 +1309,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.5" + "source": "https://github.com/composer/semver/tree/3.3.2" }, "funding": [ { @@ -1167,27 +1325,28 @@ "type": "tidelift" } ], - "time": "2021-05-24T12:41:47+00:00" + "time": "2022-04-01T19:23:25+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.5", + "version": "1.5.7", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "de30328a7af8680efdc03e396aad24befd513200" + "reference": "c848241796da2abf65837d51dce1fae55a960149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", - "reference": "de30328a7af8680efdc03e396aad24befd513200", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", + "reference": "c848241796da2abf65837d51dce1fae55a960149", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "extra": { @@ -1230,7 +1389,7 @@ "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" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" }, "funding": [ { @@ -1246,7 +1405,7 @@ "type": "tidelift" } ], - "time": "2020-12-03T16:04:16+00:00" + "time": "2022-05-23T07:37:50+00:00" }, { "name": "composer/xdebug-handler", @@ -2073,16 +2232,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.11", + "version": "5.2.12", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, "require": { @@ -2137,9 +2296,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" }, - "time": "2021-07-22T09:24:00+00:00" + "time": "2022-04-13T08:02:27+00:00" }, { "name": "laminas/laminas-diactoros", @@ -3554,20 +3713,20 @@ }, { "name": "psr/container", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", "autoload": { @@ -3596,9 +3755,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/1.1.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:50:12+00:00" }, { "name": "psr/http-client", @@ -4033,23 +4192,23 @@ }, { "name": "react/promise", - "version": "v2.8.0", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", + "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4067,7 +4226,23 @@ "authors": [ { "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com" + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", @@ -4077,9 +4252,19 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.8.0" + "source": "https://github.com/reactphp/promise/tree/v2.9.0" }, - "time": "2020-05-12T15:16:56+00:00" + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-02-11T10:27:51+00:00" }, { "name": "sebastian/cli-parser", @@ -5047,23 +5232,24 @@ }, { "name": "seld/jsonlint", - "version": "1.8.3", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" + "reference": "4211420d25eba80712bff236a98960ef68b866b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", + "reference": "4211420d25eba80712bff236a98960ef68b866b7", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" }, "bin": [ "bin/jsonlint" @@ -5094,7 +5280,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" + "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" }, "funding": [ { @@ -5106,20 +5292,20 @@ "type": "tidelift" } ], - "time": "2020-11-11T09:19:24+00:00" + "time": "2022-04-01T13:37:23+00:00" }, { "name": "seld/phar-utils", - "version": "1.1.2", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0" + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", "shasum": "" }, "require": { @@ -5152,9 +5338,70 @@ ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2" + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" }, - "time": "2021-08-19T21:01:38+00:00" + "time": "2022-08-31T10:31:18+00:00" + }, + { + "name": "seld/signal-handler", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], + "support": { + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" + }, + "time": "2022-07-20T18:31:45+00:00" }, { "name": "spomky-labs/otphp", @@ -5233,43 +5480,46 @@ }, { "name": "symfony/console", - "version": "v4.4.30", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22" + "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a3f7189a0665ee33b50e9e228c46f50f5acbed22", - "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22", + "url": "https://api.github.com/repos/symfony/console/zipball/c072aa8f724c3af64e2c7a96b796a4863d24dba1", + "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", - "symfony/process": "<3.3" + "symfony/process": "<4.4" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5302,8 +5552,14 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/console/tree/v4.4.30" + "source": "https://github.com/symfony/console/tree/v5.4.12" }, "funding": [ { @@ -5319,7 +5575,7 @@ "type": "tidelift" } ], - "time": "2021-08-25T19:27:26+00:00" + "time": "2022-08-17T13:18:05+00:00" }, { "name": "symfony/css-selector", @@ -5389,16 +5645,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { @@ -5407,7 +5663,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5436,7 +5692,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -5452,7 +5708,7 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/dotenv", @@ -5689,21 +5945,22 @@ }, { "name": "symfony/filesystem", - "version": "v5.3.4", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" + "reference": "2d67c1f9a1937406a9be3171b4b22250c0a11447" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/2d67c1f9a1937406a9be3171b4b22250c0a11447", + "reference": "2d67c1f9a1937406a9be3171b4b22250c0a11447", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5732,7 +5989,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.4" + "source": "https://github.com/symfony/filesystem/tree/v5.4.12" }, "funding": [ { @@ -5748,24 +6005,25 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2022-08-02T13:48:16+00:00" }, { "name": "symfony/finder", - "version": "v5.3.7", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5794,7 +6052,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v5.4.11" }, "funding": [ { @@ -5810,7 +6068,7 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2022-07-29T07:37:50+00:00" }, { "name": "symfony/http-foundation", @@ -5970,28 +6228,31 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-ctype": "*" + }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6029,7 +6290,88 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.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": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "433d05519ce6990bf3530fba6957499d327395c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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 grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" }, "funding": [ { @@ -6045,7 +6387,7 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6136,16 +6478,16 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", "shasum": "" }, "require": { @@ -6157,7 +6499,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6200,7 +6542,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" }, "funding": [ { @@ -6216,32 +6558,35 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6280,7 +6625,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" }, "funding": [ { @@ -6296,7 +6641,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php72", @@ -6376,16 +6721,16 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { @@ -6394,7 +6739,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6435,7 +6780,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -6451,20 +6796,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", "shasum": "" }, "require": { @@ -6473,7 +6818,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6518,7 +6863,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" }, "funding": [ { @@ -6534,7 +6879,7 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2022-05-10T07:21:04+00:00" }, { "name": "symfony/polyfill-php81", @@ -6617,20 +6962,20 @@ }, { "name": "symfony/process", - "version": "v4.4.30", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d" + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", + "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -6659,7 +7004,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v4.4.30" + "source": "https://github.com/symfony/process/tree/v5.4.11" }, "funding": [ { @@ -6675,25 +7020,29 @@ "type": "tidelift" } ], - "time": "2021-08-04T20:31:23+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1" + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "suggest": { "symfony/service-implementation": "" @@ -6701,7 +7050,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6738,7 +7087,92 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "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": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/string", + "version": "v6.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "290972cad7b364e3befaa74ba0ec729800fb161c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/290972cad7b364e3befaa74ba0ec729800fb161c", + "reference": "290972cad7b364e3befaa74ba0ec729800fb161c", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.1.4" }, "funding": [ { @@ -6754,7 +7188,7 @@ "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2022-08-12T18:05:43+00:00" }, { "name": "symfony/yaml", From ab5c646627076488e4079532d9de05e20fc699f7 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 1 Sep 2022 14:57:25 +0530 Subject: [PATCH 265/674] ACQE-3966 : Chrome settings for cost reductions --- 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 d5dbde466..d7809bfcb 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -38,4 +38,4 @@ modules: capabilities: unhandledPromptBehavior: "ignore" chromeOptions: - args: ["--no-sandbox", "--window-size=1280,1024", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--ignore-certificate-errors"] + args: ["--no-sandbox", "--window-size=1280,1024", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--ignore-certificate-errors", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad"] From 6eccd5c6d52ea880872bd080861cf3fda40308e3 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Fri, 9 Sep 2022 14:08:32 +0530 Subject: [PATCH 266/674] 3.10.3 Deployment --- CHANGELOG.md | 7 +++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 071f59887..62c181c0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Magento Functional Testing Framework Changelog ================================================ +3.10.3 +--------- + +### Fixes + +* Chrome settings for potential cost reductions + 3.10.2 --------- diff --git a/composer.json b/composer.json index 0161b4883..d5036b9cb 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": "3.10.2", + "version": "3.10.3", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 40205fb9d..f26db7bef 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": "075f7ef8a19879334ba1e0443f4e9679", + "content-hash": "657428977803e30350f9c25ed94c9860", "packages": [ { "name": "allure-framework/allure-codeception", From 1198b2716cfc6790816b700ebc5b73cfda5951b5 Mon Sep 17 00:00:00 2001 From: Global <global@del1-lmc-n71255.local> Date: Wed, 14 Sep 2022 15:03:37 +0530 Subject: [PATCH 267/674] ACQE-4040 | Make dynamic path for dependency file for standalone and embedded mftf --- .../Console/GenerateTestsCommand.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index dc5e18f75..525b4dea3 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -37,7 +37,8 @@ class GenerateTestsCommand extends BaseGenerateCommand const PARALLEL_DEFAULT_TIME = 10; const EXTENDS_REGEX_PATTERN = '/extends=["\']([^\'"]*)/'; const ACTIONGROUP_REGEX_PATTERN = '/ref=["\']([^\'"]*)/'; - const TEST_DEPENDENCY_FILE_LOCATION = 'dev/tests/_output/test-dependencies.json'; + const TEST_DEPENDENCY_FILE_LOCATION_STANDALONE = 'dev/tests/_output/test-dependencies.json'; + const TEST_DEPENDENCY_FILE_LOCATION_EMBEDDED = 'dev/tests/acceptance/tests/_output/test-dependencies.json'; /** * @var ScriptUtil @@ -250,8 +251,12 @@ protected function execute(InputInterface $input, OutputInterface $output) if (!empty($log)) { if ($log === "testEntityJson") { $this->getTestEntityJson($tests); + $testDependencyFileLocation = self::TEST_DEPENDENCY_FILE_LOCATION_EMBEDDED; + if (isset($_ENV['MAGENTO_BP'])) { + $testDependencyFileLocation = self::TEST_DEPENDENCY_FILE_LOCATION_STANDALONE; + } $output->writeln( - "Test dependencies file created, Located in: " . self::TEST_DEPENDENCY_FILE_LOCATION + "Test dependencies file created, Located in: " . $testDependencyFileLocation ); } else { $output->writeln( @@ -555,7 +560,11 @@ private function getExtendedTestDependencies(array $extendedTests): array */ private function array2Json(array $array) { - $file = fopen(self::TEST_DEPENDENCY_FILE_LOCATION, 'w'); + $testDependencyFileLocation = self::TEST_DEPENDENCY_FILE_LOCATION_EMBEDDED; + if (isset($_ENV['MAGENTO_BP'])) { + $testDependencyFileLocation = self::TEST_DEPENDENCY_FILE_LOCATION_STANDALONE; + } + $file = fopen($testDependencyFileLocation, 'w'); $json = json_encode($array, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); fwrite($file, $json); fclose($file); From f64e08b9c55d326be9d3c2ef681b79dcc7a74899 Mon Sep 17 00:00:00 2001 From: Jeff Matthews <matthews.jeffery@gmail.com> Date: Fri, 16 Sep 2022 11:12:02 -0500 Subject: [PATCH 268/674] Removed obsolete docs/ directory --- docs/backward-incompatible-changes.md | 163 -- docs/best-practices.md | 217 -- docs/commands/codeception.md | 93 - docs/commands/mftf.md | 683 ----- docs/configuration.md | 446 --- docs/configure-2fa.md | 53 - docs/credentials.md | 290 -- docs/custom-helpers.md | 129 - docs/data.md | 345 --- docs/debugging.md | 37 - docs/extending.md | 342 --- docs/getting-started.md | 368 --- docs/guides/action-groups.md | 82 - docs/guides/cicd.md | 114 - docs/guides/git-vs-composer-install.md | 83 - docs/guides/selectors.md | 346 --- docs/guides/test-isolation.md | 119 - docs/guides/test-modularity.md | 88 - docs/guides/using-suites.md | 101 - docs/img/action-groups-dia.svg | 516 ---- .../catalogCategoryRepository-operations.png | Bin 15654 -> 0 bytes docs/img/data-dia.svg | 489 ---- docs/img/metadata-dia.svg | 1050 ------- docs/img/mftf-extending-precedence.png | Bin 127088 -> 0 bytes docs/img/mftf-fork.gif | Bin 387415 -> 0 bytes docs/img/page-dia.svg | 290 -- docs/img/section-dia.svg | 296 -- docs/img/test-dia.svg | 1228 -------- docs/interactive-pause.md | 74 - docs/introduction.md | 163 -- docs/merge_points/extend-action-groups.md | 102 - docs/merge_points/extend-data.md | 70 - docs/merge_points/extend-tests.md | 145 - docs/merge_points/introduction.md | 39 - docs/merge_points/merge-action-groups.md | 78 - docs/merge_points/merge-data.md | 56 - docs/merge_points/merge-pages.md | 50 - docs/merge_points/merge-sections.md | 46 - docs/merge_points/merge-tests.md | 102 - docs/merging.md | 569 ---- docs/metadata.md | 587 ---- docs/mftf-tests-packaging.md | 58 - docs/page.md | 174 -- docs/reporting.md | 313 -- docs/section.md | 154 - docs/section/locator-functions.md | 45 - docs/section/parameterized-selectors.md | 155 - docs/selectors.md | 35 - docs/suite.md | 295 -- docs/test-prep.md | 407 --- docs/test.md | 142 - docs/test/action-groups.md | 306 -- docs/test/actions.md | 2571 ----------------- docs/test/annotations.md | 243 -- docs/test/assertions.md | 704 ----- docs/tips-tricks.md | 423 --- docs/troubleshooting.md | 65 - docs/update.md | 53 - docs/versioning.md | 71 - 59 files changed, 16263 deletions(-) delete mode 100644 docs/backward-incompatible-changes.md delete mode 100644 docs/best-practices.md delete mode 100644 docs/commands/codeception.md delete mode 100644 docs/commands/mftf.md delete mode 100644 docs/configuration.md delete mode 100644 docs/configure-2fa.md delete mode 100644 docs/credentials.md delete mode 100644 docs/custom-helpers.md delete mode 100644 docs/data.md delete mode 100644 docs/debugging.md delete mode 100644 docs/extending.md delete mode 100644 docs/getting-started.md delete mode 100644 docs/guides/action-groups.md delete mode 100644 docs/guides/cicd.md delete mode 100644 docs/guides/git-vs-composer-install.md delete mode 100644 docs/guides/selectors.md delete mode 100644 docs/guides/test-isolation.md delete mode 100644 docs/guides/test-modularity.md delete mode 100644 docs/guides/using-suites.md delete mode 100644 docs/img/action-groups-dia.svg delete mode 100644 docs/img/catalogCategoryRepository-operations.png delete mode 100644 docs/img/data-dia.svg delete mode 100644 docs/img/metadata-dia.svg delete mode 100644 docs/img/mftf-extending-precedence.png delete mode 100644 docs/img/mftf-fork.gif delete mode 100644 docs/img/page-dia.svg delete mode 100644 docs/img/section-dia.svg delete mode 100644 docs/img/test-dia.svg delete mode 100644 docs/interactive-pause.md delete mode 100644 docs/introduction.md delete mode 100644 docs/merge_points/extend-action-groups.md delete mode 100644 docs/merge_points/extend-data.md delete mode 100644 docs/merge_points/extend-tests.md delete mode 100644 docs/merge_points/introduction.md delete mode 100644 docs/merge_points/merge-action-groups.md delete mode 100644 docs/merge_points/merge-data.md delete mode 100644 docs/merge_points/merge-pages.md delete mode 100644 docs/merge_points/merge-sections.md delete mode 100644 docs/merge_points/merge-tests.md delete mode 100644 docs/merging.md delete mode 100644 docs/metadata.md delete mode 100644 docs/mftf-tests-packaging.md delete mode 100644 docs/page.md delete mode 100644 docs/reporting.md delete mode 100644 docs/section.md delete mode 100644 docs/section/locator-functions.md delete mode 100644 docs/section/parameterized-selectors.md delete mode 100644 docs/selectors.md delete mode 100644 docs/suite.md delete mode 100644 docs/test-prep.md delete mode 100644 docs/test.md delete mode 100644 docs/test/action-groups.md delete mode 100644 docs/test/actions.md delete mode 100644 docs/test/annotations.md delete mode 100644 docs/test/assertions.md delete mode 100644 docs/tips-tricks.md delete mode 100644 docs/troubleshooting.md delete mode 100644 docs/update.md delete mode 100644 docs/versioning.md diff --git a/docs/backward-incompatible-changes.md b/docs/backward-incompatible-changes.md deleted file mode 100644 index 5ddf1c9cb..000000000 --- a/docs/backward-incompatible-changes.md +++ /dev/null @@ -1,163 +0,0 @@ -# MFTF 3.0.0 backward incompatible changes - -This page highlights backward incompatible changes between releases that have a major impact and require detailed explanation and 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.4 or later. - -## Folder structure changes - -We removed support to read test modules from the deprecated path `dev/tests/acceptance/tests/functional/Magento/FunctionalTest`. If there are test modules in this path, they should be moved to `dev/tests/acceptance/tests/functional/Magento`. - -## XSD schema changes - -- Files under test modules `ActionGroup`, `Page`, `Section`, `Test` and `Suite` only support a single entity per file. -- The `file` attribute from `<module>` has been removed from the suite schema. `<module file=""/>` is no longer supported in suites. -- Metadata filename format changed to ***`*Meta.xml`***. -- Only nested assertion syntax will be supported. See the [assertions page](test/assertions.md) for details. Here is an example of the nested assertion syntax: - ```xml - <assertEquals stepKey="assertAddressOrderPage"> - <actualResult type="const">$billingAddressOrderPage</actualResult> - <expectedResult type="const">$shippingAddressOrderPage</expectedResult> - </assertEquals> - ``` - -### Upgrading tests to the new schema - -The following table lists the upgrade scripts that are available to upgrade tests to the new schema. - -| Script name | Description | -|-----------------------|-----------------------------------------------------------------------------------------------------------| -|`splitMultipleEntitiesFiles`| Splits files that have multiple entities into multiple files with one entity per file. | -|`upgradeAssertionSchema`| Updates assert actions that uses the old assertion syntax into the new nested syntax.| -|`renameMetadataFiles`| Renames Metadata filenames to `*Meta.xml`.| -|`removeModuleFileInSuiteFiles`| Removes occurrences of `<module file=""/>` from all `<suite>`s.| -|`removeUnusedArguments`| Removes unused arguments from action groups.| -|`upgradeTestSchema`| Replaces relative schema paths to URN in test files.| - -To run the upgrade tests: - -1. Run `bin/mftf reset --hard` to remove old generated configurations. -1. Run `bin/mftf build:project` to generate new configurations. -1. Run `bin/mftf upgrade:tests`. [See command page for details](commands/mftf.md#upgradetests). -1. Lastly, try to generate all tests. Tests should all be generated as a result of the upgrades. If not, the most likely issue will be a changed XML schema. Check error messaging and search your codebase for the attributes listed. - -## MFTF commands - -`--debug` option `NONE` removed for strict schema validation. Ensure there are no schema validation errors in test modules before running MFTF commands. - -## MFTF actions - -### `executeInSelenium` and `performOn` removed - -**Action**: Deprecated actions `executeInSelenium` and `performOn` are removed in favor of new action `helper`. - -**Reason**: `executeInSelenium` and `performOn` allowed custom PHP code to be written inline inside of XML files which was difficult to maintain, troubleshoot, and modify. - -**Details**: - -The `helper` allows test writers to solve advanced requirements beyond what MFTF offers out of the box. See [custom-helpers](custom-helpers.md) for more information on usage. - -Here is an example of using `helper` in place of `executeSelenium` to achieve same workflow. - -Old usage: - -```xml -<executeInSelenium function="function ($webdriver) use ($I) { - $heading = $webdriver->findElement(\Facebook\WebDriver\WebDriverBy::xpath('//div[contains(@class, \'inline-wysiwyg\')]//h2')); - $actions = new \Facebook\WebDriver\Interactions\WebDriverActions($webdriver); - $actions->moveToElement($heading, {{TinyMCEPartialHeadingSelection.startX}}, {{TinyMCEPartialHeadingSelection.startY}}) - ->clickAndHold() - ->moveToElement($heading, {{TinyMCEPartialHeadingSelection.endX}}, {{TinyMCEPartialHeadingSelection.endY}}) - ->release() - ->perform(); - }" stepKey="selectHeadingTextInTinyMCE"/> -``` - -New usage: - -```xml -<helper class="\Magento\PageBuilder\Test\Mftf\Helper\SelectText" method="selectText" stepKey="selectHeadingTextInTinyMCE"> - <argument name="context">//div[contains(@class, 'inline-wysiwyg')]//h2</argument> - <argument name="startX">{{TinyMCEPartialHeadingSelection.startX}}</argument> - <argument name="startY">{{TinyMCEPartialHeadingSelection.startY}}</argument> - <argument name="endX">{{TinyMCEPartialHeadingSelection.endX}}</argument> - <argument name="endY">{{TinyMCEPartialHeadingSelection.endY}}</argument> -</helper> -``` - -### `pauseExecution` removed - -**Action**: `pauseExecution` is removed in favor of `pause`. - -**Reason**: `[WebDriver]pauseExecution` is removed in Codeception 3 in favor of `I->pause()`. - -**Details**: - -See the [actions page for details](test/actions.md#pause). Here is a usage example: - -```xml -<pause stepKey="pauseExecutionKey"/> -``` - -### Removed assert actions - -**Action**: Assert actions `assertInternalType`, `assertNotInternalType` and `assertArraySubset` are removed. - -**Reason**: PHPUnit 9 has dropped support for these assertions. - -### Updated assert actions - -**Action**: The `delta` attribute has been removed from `assertEquals` and `assertNotEquals`. Instead, new assert actions have been introduced: - - - `assertEqualsWithDelta` - - `assertNotEqualsWithDelta` - - `assertEqualsCanonicalizing` - - `assertNotEqualsCanonicalizing` - - `assertEqualsIgnoringCase` - - `assertNotEqualsIgnoringCase` - -**Reason**: PHPUnit 9 has dropped support for optional parameters for `assertEquals` and `assertNotEquals` and has introduced these new assertions. - -**Details**: - -Usage of `assertEquals` or `assertNotEquals` with a specified `delta`, should be replaced with appropriate assertion from the above list. - -### `assertContains` supports only iterable haystacks - -**Action**: `assertContains` and `assertNotContains` now only supports iterable haystacks. These assert actions have been added to work with string haystacks: - -- `assertStringContainsString` -- `assertStringNotContainsString` -- `assertStringContainsStringIgnoringCase` -- `assertStringNotContainsStringIgnoringCase` - -**Reason**: With PHPUnit 9, `assertContains` and `assertNotContains` only allows iterable haystacks. New assertions have been introduced to support string haystacks. - -**Details**: - -Usages of `assertContains` and `assertNotContains` with string haystacks should be replaced with appropriate assertion from the above list. - -Usage example for string haystacks: - -```xml -<assertStringContainsString stepKey="assertDiscountOnPrice2"> - <actualResult type="const">$grabSimpleProdPrice2</actualResult> - <expectedResult type="string">$110.70</expectedResult> -</assertStringContainsString> -``` - -### `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 -<formatCurrency userInput="1234.56789000" locale="de_DE" currency="USD" stepKey="usdInDE"/> -``` diff --git a/docs/best-practices.md b/docs/best-practices.md deleted file mode 100644 index 1f3a25e02..000000000 --- a/docs/best-practices.md +++ /dev/null @@ -1,217 +0,0 @@ -# Best practices - -Check out our best practices below to ensure you are getting the absolute most out of the Magento Functional Testing Framework. - -## Focus on reusability - -### Use existing Tests and resources - -Magento offers more than **3000** acceptance tests, **2500** [Action group]s, **750** Page declarations with more than **1500** Section definitions. -It is very probable that behaviour you want to test already exists as a Test or Action Group. -Instead of writing everything by yourself - use `extends` attribute to refer to existing element and customize it. - -**Reusable Resources** - -{%raw%} - -* Tests (reusable with `<test extends="...">` argument) -* Action Group (reusable with including `<actionGroup ref="...">`, or extending `<actionGroup extends="...">`) -* Pages (reusable with reference `{{PageDefinition.url}}`) -* Sections (reusable with reference `{{SectionDefinition.elementDefinition}}`) -* Data Entities (reusable with reference `<createData entity="...">"` or extending `<entity extends="...">`) - -{%endraw%} - -<div class="bs-callout bs-callout-warning" markdown="1"> - -Avoid using resources that are marked as **Deprecated**. Usually there is a replacement provided for a deprecated resource. - -</div> - -### Extract repetitive Actions - -Instead of writing a few of Tests that perform mostly the same actions, you should thing about [Action group] that is a container for repetitive Actions. -If each run needs different data, use `<arguments>` to inject necessary information. - -We recommend to keep Action Groups having single responsibility, for example `AdminLoginActionGroup`, which expected outcome is being logged in as Administrator when [Action group] is executed. - -## Contribute - -Although the Magento Core team and Contributors join forces to cover most of the features with tests, it is impossible to have this done quickly. -If you've covered Magento Core feature with Functional Tests - you are more than welcome to contribute. - -## Action group - -1. [Action group] names should be sufficiently descriptive to inform a test writer of what the action group does and when it should be used. Add additional explanation in annotations if needed. -2. Provide default values for the arguments that apply to your most common case scenarios. -3. One `<actionGroup>` tag is allowed per action group XML file. - -## `actionGroups` vs `extends` - -Use an action group to wrap a set of actions to reuse them multiple times. - -Use an [extension] when a test or action group needs to be repeated with the exception of a few steps. - -### When to use `extends` - -Use `extends` in your new test or action group when at least one of the following conditions is applicable to your case: - -1. You want to keep the original test without any modifications. -2. You want to create a new test that follows the same path as the original test. -3. You want a new action group that behaves similarly to the existing action group, but you do not want to change the functionality of the original action group. - -### When to avoid `extends` - -Do not use `extends` in the following conditions: - -1. You want to change the functionality of the test or action group and do not need to run the original version. -2. You plan to merge the base test or action group. - -The following pattern is used when merging with `extends`: - -1. The original test is merged. -2. The extended test is created from the merged original test. -3. The extended test is merged. - -## Annotation - -1. Use [annotations] in a test. -2. Update your annotations correspondingly when updating tests. - -## Data entity - -1. Keep your testing instance clean. - Remove data after the test if the test required creating any data. - Use a corresponding [`<deleteData>`] test step in your [`<after>`] block when using a [`<createData>`] action in a [`<before>`] block. -2. Make specific data entries under test to be unique. - Enable data uniqueness where data values are required to be unique in a database by test design. - Use `unique=”suffix”` or `unique=”prefix”` to append or prepend a unique value to the [entity] attribute. - This ensures that tests using the entity can be repeated. -3. Do not modify existing data entity fields or merge additional data fields without complete understanding and verifying the usage of existing data in tests. - Create a new data entity for your test if you are not sure. - -## Naming conventions - -### File names - -Name files according to the following patterns to make searching in future more easy: - -<!-- {% raw %} --> - -#### Test file name - -Format: {_Admin_ or _Storefront_}{Functionality}_Test.xml_, where Functionality briefly describes the testing functionality. - -Example: _StorefrontCreateCustomerTest.xml_. - -#### Action Group file name - -Format: {_Admin_ or _Storefront_}{Action Group Summary}ActionGroup.xml`, where Action Group Summary is a short description of what the action group does. - -Example: _AdminCreateStoreActionGroup.xml_ - -#### Section file name - -Format: {_Admin_ or _Storefront_}{UI Description}_Section.xml_, where UI Description briefly describes the testing UI. - -Example: _AdminNavbarSection.xml_. - -#### Data file name - -Format: {Type}_Data.xml_, where Type represents the entity type. - -<!-- {% endraw %} --> - -Example: _ProductData.xml_. - -### Object names - -Use the _Foo.camelCase_ naming convention, which is similar to _Classes_ and _classProperties_ in PHP. - -#### Upper case - -Use an upper case first letter for: - -* File names. Example: _StorefrontCreateCustomerTest.xml_ -* Test name attributes. Example: `<test name="TestAllTheThingsTest">` -* Data entity names. Example: `<entity name="OutOfStockProduct">` -* Page name. Example: `<page name="AdminLoginPage">` -* Section name. Example: `<section name="AdminCategorySidebarActionSection">` -* Action group name. Example: `<actionGroup name="LoginToAdminActionGroup">` - -#### Lower case - -Use a lower case first letter for: - -* Data keys. Example: `<data key="firstName">` -* Element names. Examples: `<element name="confirmDeleteButton"/>` -* Step keys. For example: `<click selector="..." stepKey="clickLogin"/>` - -## Page object - -1. One `<page>` tag is allowed per page XML file. -2. Use [parameterized selectors] for constructing a selector when test-specific or runtime-generated information is needed. -Do not use them for static elements. - -<span class="color:red"> -BAD: -</span> - -<!-- {% raw %} --> - -``` xml -<element name="relatedProductSectionText" type="text" selector=".fieldset-wrapper.admin__fieldset-section[data-index='{{productType}}']" parameterized="true"/> -``` - -<!-- {% endraw %} --> - -<span class="color:green"> -GOOD: -</span> - -Define these three elements and reference them by name in the tests. - -``` xml -<element name="relatedProductSectionText" type="text" selector=".fieldset-wrapper.admin__fieldset-section[data-index='related']"/> -<element name="upSellProductSectionText" type="text" selector=".fieldset-wrapper.admin__fieldset-section[data-index='upsell']"/> -<element name="crossSellProductSectionText" type="text" selector=".fieldset-wrapper.admin__fieldset-section[data-index='crosssell']"/> -``` - -## Test - -1. Use actions such as [`<waitForElementVisible>`], [`<waitForLoadingMaskToDisappear>`], and [`<waitForElement>`] to wait the exact time required for the test step. - Try to avoid using the [`<wait>`] action, because it forces the test to wait for the time you specify. You may not need to wait so long to proceed. -1. Keep your tests short and granular for target testing, easier reviews, and easier merge conflict resolution. - It also helps you to identify the cause of test failure. -1. Use comments to keep tests readable and maintainable: - * Keep the inline `<!-- XML comments -->` and [`<comment>`] tags up to date. - It helps to inform the reader of what you are testing and to yield a more descriptive Allure report. - * Explain in comments unclear or tricky test steps. -1. Refer to [sections] instead of writing selectors. -1. One `<test>` tag is allowed per test XML file. - -## Test step merging order - -When setting a [merging] order for a test step, do not depend on steps from Magento modules that could be disabled by an application. - -For example, when you write a test step to create a gift card product, set your test step **after** simple product creation and let the MFTF handle the merge order. -Since the configurable product module could be disabled, this approach is more reliable than setting the test step **before** creating a configurable product. - -<!-- Link definitions --> - -[`<after>`]: test/actions.html#before-and-after -[`<before>`]: test/actions.html#before-and-after -[`<comment>`]: test/actions.html#comment -[`<createData>`]: test/actions.html#createdata -[`<deleteData>`]: test/actions.html#deletedata -[`<wait>`]: test/actions.html#wait -[`<waitForElement>`]: test/actions.html#waitforelement -[`<waitForElementVisible>`]: test/actions.html#waitforelementvisible -[`<waitForLoadingMaskToDisappear>`]: test/actions.html#waitforloadingmasktodisappear -[Action group]: test/action-groups.html -[annotations]: test/annotations.html -[entity]: data.html -[extension]: extending.html -[merging]: merging.html -[parameterized selectors]: section/parameterized-selectors.html -[sections]: section.html diff --git a/docs/commands/codeception.md b/docs/commands/codeception.md deleted file mode 100644 index 8e6d76c11..000000000 --- a/docs/commands/codeception.md +++ /dev/null @@ -1,93 +0,0 @@ -# CLI commands: vendor/bin/codecept - -<div class="bs-callout bs-callout-warning" markdown="1"> -We do not recommend using Codeception commands directly as they can break MFTF basic workflow. -All the Codeception commands you need are wrapped using the [mftf tool][]. - -To run the Codeception testing framework commands directly, change your directory to the `<Magento root>`. -</div> - -## Usage examples - -Run all the generated tests: - -```bash -vendor/bin/codecept run functional -c dev/tests/acceptance/codeception.yml -``` - -Run all tests without the `<group value="skip"/>` [annotation][]: - -```bash -vendor/bin/codecept run functional --skip-group skip -c dev/tests/acceptance/codeception.yml -``` - -Run all tests with the `<group value="example"/>` [annotation][] but with no `<group value="skip"/>`: - -```bash -vendor/bin/codecept run functional --group example --skip-group skip -c dev/tests/acceptance/codeception.yml -``` - -## `codecept run` - -`codecept run` runs the test suites: - -```bash -vendor/bin/codecept run -``` - -<div class="bs-callout bs-callout-info"> -The following documentation corresponds to Codeception 4.1.4. -</div> - -```bash -Full reference: - -Arguments: - suite suite to be tested - test test to be run - -Options: - -o, --override=OVERRIDE Override config values (multiple values allowed) - -e, --ext=EXT Run with extension enabled (multiple values allowed) - --report Show output in compact style - --html[=HTML] Generate html with results [default: "report.html"] - --xml[=XML] Generate JUnit XML Log [default: "report.xml"] - --phpunit-xml[=PHPUNIT-XML] Generate PhpUnit XML Log [default: "phpunit-report.xml"] - --tap[=TAP] Generate Tap Log [default: "report.tap.log"] - --json[=JSON] Generate Json Log [default: "report.json"] - --colors Use colors in output - --no-colors Force no colors in output (useful to override config file) - --silent Only outputs suite names and final results - --steps Show steps in output - -d, --debug Show debug and scenario output - --bootstrap[=BOOTSTRAP] Execute custom PHP script before running tests. Path can be absolute or relative to current working directory [default: false] - --no-redirect Do not redirect to Composer-installed version in vendor/codeception - --coverage[=COVERAGE] Run with code coverage - --coverage-html[=COVERAGE-HTML] Generate CodeCoverage HTML report in path - --coverage-xml[=COVERAGE-XML] Generate CodeCoverage XML report in file - --coverage-text[=COVERAGE-TEXT] Generate CodeCoverage text report in file - --coverage-crap4j[=COVERAGE-CRAP4J] Generate CodeCoverage report in Crap4J XML format - --coverage-phpunit[=COVERAGE-PHPUNIT] Generate CodeCoverage PHPUnit report in path - --no-exit Don't finish with exit code - -g, --group=GROUP Groups of tests to be executed (multiple values allowed) - -s, --skip=SKIP Skip selected suites (multiple values allowed) - -x, --skip-group=SKIP-GROUP Skip selected groups (multiple values allowed) - --env=ENV Run tests in selected environments. (multiple values allowed) - -f, --fail-fast Stop after first failure - --no-rebuild Do not rebuild actor classes on start - --seed=SEED Define random seed for shuffle setting - --no-artifacts Don't report about artifacts - -h, --help Display this help message - -q, --quiet Do not output any message - -V, --version Display this application version - --ansi Force ANSI output - --no-ansi Disable ANSI output - -n, --no-interaction Do not ask any interactive question - -c, --config[=CONFIG] Use custom path for config - -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug -``` - -<!-- Link definitions --> - -[mftf tool]: mftf.md -[annotation]: ../test/annotations.md \ No newline at end of file diff --git a/docs/commands/mftf.md b/docs/commands/mftf.md deleted file mode 100644 index 4b4bb4bab..000000000 --- a/docs/commands/mftf.md +++ /dev/null @@ -1,683 +0,0 @@ -# CLI commands: vendor/bin/mftf - -The Magento Functional Testing Framework (MFTF) introduces the command line interface (CLI) tool `vendor/bin/mftf` to facilitate your interaction with the framework. - -Note that `mftf` commands replace the `robo` commands that were used in previous releases. - -## Command format - -In the project root directory (where you have installed the framework as a composer dependency), run commands using the following format: - -```bash -vendor/bin/mftf command [options] [<arguments>] [--remove|-r] -``` - -## Useful commands - -Use the following commands to run commonly performed tasks. - -### Apply the configuration parameters - -```bash -vendor/bin/mftf build:project -``` - -### Upgrade the project - -```bash -vendor/bin/mftf build:project --upgrade -``` - -Upgrades all installed MFTF tests after a major MFTF upgrade. - -### Generate all tests - -```bash -vendor/bin/mftf generate:tests -``` - -### Generate tests by test name - -```bash -vendor/bin/mftf generate:tests AdminLoginSuccessfulTest StorefrontPersistedCustomerLoginTest -``` - -### Generate tests by testNames.txt file - -```bash -vendor/bin/mftf generate:tests -p path/to/your/testNames.txt -``` - -This command generate all tests specified in a testNames.txt file. - -#### Example - -```bash -testName1 -testName2 -testNameN -suiteName:testInSuite -``` - -### Generate test by test and suite name - -```bash -vendor/bin/mftf generate:tests WYSIWYGDisabledSuite:AdminCMSPageCreatePageTest -``` - -### Generate test dependencies - -```bash -vendor/bin/mftf generate:tests -l testEntityJson -``` - -This command generate json file consist of all test dependent module. - -### Generate test dependencies by test name - -```bash -vendor/bin/mftf generate:tests testName1 testName2 .. testNameN -l testEntityJson -``` - -### Generate and run the tests for a specified group - -```bash -vendor/bin/mftf run:group product -r -``` - -This command cleans up the previously generated tests; generates and runs tests for the product group (where `group="product"`). - -### Generate and run particular tests - -```bash -vendor/bin/mftf run:test AdminLoginSuccessfulTest StorefrontPersistedCustomerLoginTest -r -``` - -This command cleans up the previously generated tests; generates and runs the `AdminLoginSuccessfulTest` and `StorefrontPersistedCustomerLoginTest` tests. - -### Generate and run particular test in a specific suite's context - -```bash -vendor/bin/mftf run:test WYSIWYGDisabledSuite:AdminCMSPageCreatePageTest -r -``` - -This command cleans up previously generated tests; generates and run `AdminCMSPageCreatePageTest` within the context of the `WYSIWYGDisabledSuite`. - -### Generate and run a testManifest.txt file - -```bash -vendor/bin/mftf run:manifest path/to/your/testManifest.txt -``` - -This command runs all tests specified in a `testManifest.txt` file. When you generate tests, a `testManifest.txt` file is also generated for you. You can pass this file directly to the `run:manifest` command and it will execute all listed tests. You can also create your own file in the same format to execute a subset of tests. Note: This command does not generate tests. - -### Generate previously failed tests - -```bash -vendor/bin/mftf generate:failed -``` - -This command cleans up the previously generated tests; generates the tests listed in `dev/tests/acceptance/tests/_output/failed`. -For more details about `failed`, refer to [Reporting][]. - -### Run previously failed tests - -```bash -vendor/bin/mftf run:failed -``` - -This command runs the tests listed in `dev/tests/acceptance/tests/_output/failed`. -For more details about `failed`, refer to [Reporting][]. - -## Error tolerance during generation - -Starting from version 3.2.0, MFTF will not fail right away when encountering generation errors. -Instead, MFTF will generate as many tests and suites as it can, log errors to `mftf.log`, and exit with a non-zero generation status. - -Note: -- Not all errors are tolerable at generation. For example, schema validation errors, parser errors, and WebApi authentication errors will cause `hard` failures, with no tests or suites being generated. -- Error tolerance in generation is meant to help local test development and testing and is expected to be run locally. All generation errors must be fixed in order to use other framework functionality, pass static checks, and to deliver MFTF tests. - -## Reference - -### `build:project` - -#### Description - -Clone the example configuration files and build the Codeception project. - -#### Usage - -```bash -vendor/bin/mftf build:project [--upgrade] [config_param_options] -``` - -#### Options - -| Option | Description | -| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `-u`, `--upgrade` | Upgrades all installed MFTF tests according to requirements of the last major release. Specifying this flag upgrades only those tests in the default location. Example: `build:project --upgrade`. | - -You can include options to set configuration parameter values for your environment since the project build process also [sets up the environment][setup]. - -```bash -vendor/bin/mftf build:project --MAGENTO_BASE_URL=http://magento.local/ --MAGENTO_BACKEND_NAME=admin214365 -``` - -### `doctor` - -#### Description - -Diagnose MFTF configuration and setup. Currently this command will check the following: -- Verify admin credentials are valid. Allowing MFTF authenticates and runs API requests to Magento through cURL -- Verify that Selenium is up and running and available for MFTF -- Verify that new session of browser can open Magento admin and store front urls -- Verify that MFTF can run MagentoCLI commands - -#### Usage - -```bash -vendor/bin/mftf doctor -``` - -#### Options - -### `generate:tests` - -#### Description - -Perform XML schema validation and generate PHP code from the tests defined in XML files. -The path is set in the `TESTS_MODULE_PATH` [configuration] parameter. - -#### Usage - -```bash -vendor/bin/mftf generate:tests [option] [<test name>] [<test name>] [--remove] -``` - -#### Options - -| Option | Description | -|-----------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `--config=[<default> or <singleRun> or <parallel>]` | Creates a single manifest file with a list of all tests. The default location is `tests/functional/Magento/FunctionalTest/_generated/testManifest.txt`.<br/> 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, ...`.<br/> Available values: `default` (default), `singleRun`(same as `default`), and `parallel`.<br/> Example: `generate:tests --config=parallel`. | -| `--filter` | Option to filter tests to be generated.<br/>Template: '<filterName>:<filterValue>'.<br/>Existing filter types: severity, includeGroup, excludeGroup.<br/>Existing severity values: BLOCKER, CRITICAL, MAJOR, AVERAGE, MINOR.<br/>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. <br/>Example: `generate:tests --config=parallel --time=15` <br/>Option `--time` will be the default and the __default value__ is `10` when neither `--time` nor `--groups` is specified. <br/>Example: `generate:tests --config=parallel` | -| `-g,--groups` | Set number of groups to be split into when `--config=parallel` is used. <br>Example: `generate:tests --config=parallel --groups=300` <br/>Options `--time` and `--groups` are mutually exclusive and only one should be used. | -| `--tests` | Defines the test configuration as a JSON string or JSON file path. | -| `--allow-skipped` | Allows MFTF to generate and run tests marked with `<skip>.` | -| `--debug` | Performs schema validations on XML files. <br/> DEFAULT: `generate:tests` implicitly performs schema validation on merged files. It does not indicate the file name where the error is encountered. <br/> DEVELOPER: `--debug` performs per-file validation and returns additional debug information (such as the filename where an error occurred) when test generation fails because of an invalid XML schema. This option takes extra processing time. Use it after test generation has failed once.<br/> | -| `-r,--remove` | Removes the existing generated suites and tests cleaning up the `_generated` directory before the actual run. For example, `generate:tests SampleTest --remove` cleans up the entire `_generated` directory and generates `SampleTest` only. | -| `-l,--log` | Generate metadata files during test generation. Accepted parameters are: testEntityJson. | - -#### Examples of the JSON configuration - -The configuration to generate a single test with no suites: - -```json -{ - "tests":[ - "general_test1" //Generate the "general_test1" test. - ], - "suites": null -} -``` - -The configuration to generate a single test in the suite: - -```json -{ - "tests": null, // No tests outside the suite configuration will be generated. - "suites":{ - "sample":[ // The suite that contains the test. - "suite_test1" // The test to be generated. - ] - } -} -``` - -Complex configuration to generate a few non-suite tests, a single test in a suite, and an entire suite: - -```json -{ - "tests":[ - "general_test1", - "general_test2", - "general_test3" - ], - "suites":{ //Go to suites. - "sample":[ //Go to the "sample" suite. - "suite_test1" //Generate the "suite_test1" test. - ], - "sample2":[] //Generate all tests in the "sample2" suite. - } -} -``` - -The command that encodes this complex configuration: - -Command to generate test by json string: - -```bash -vendor/bin/mftf generate:tests --tests '{"tests":["general_test1","general_test2","general_test3"],"suites":{"sample":["suite_test1"],"sample2":null}}' -``` - -Note that the strings must be escaped and surrounded in quotes. - -Command to generate test by json file: - -```bash -vendor/bin/mftf generate:tests --tests ./foldername/filename.json -``` - -### `generate:suite` - -#### Description - -Generates one or more suites based on XML declarations. - -#### Usage - -```bash -vendor/bin/mftf generate:suite <suite name> [<suite name>] [--remove] -``` - -#### Options - -| Option | Description | -| --- | --- | -| `-r,--remove` | Removes the existing generated suites and tests cleaning up the `_generated` directory before the actual run. For example, `vendor/bin/mftf generate:suite WYSIWYG --remove` cleans up the entire `_generated` directory and generates `WYSIWYG` only. | - -#### Example - -```bash -vendor/bin/mftf generate:suite suite1 suite2 -``` - -### `generate:urn-catalog` - -#### Description - -Generates a URN catalog, enabling PhpStorm to recognize and highlight URNs. -It also enables auto-completion in PhpStorm. - -#### Usage - -```bash -vendor/bin/mftf generate:urn-catalog [--force] [<path to misc.xml>] -``` - -`misc.xml` is typically located at `<project root>/.idea/misc.xml`. - -#### Options - -| Option | Description | -| ------------- | --------------------------------------------------------------------- | -| `-f, --force` | Creates the `misc.xml` file if it does not exist in the given `path`. | - -#### Example - -```bash -vendor/bin/mftf generate:urn-catalog .idea/misc.xml -``` - -### `reset` - -#### Description - -Cleans any configuration files and generated artifacts from the environment. -The `.env` file is not affected. - -#### Usage - -```bash -vendor/bin/mftf reset [--hard] -``` - -#### Options - -| Option | Description | -| -------- | ------------------------------------------ | -| `--hard` | Forces a reset of the configuration files. | - -#### Example - -```bash -vendor/bin/mftf reset --hard -``` - -### `run:group` - -Generates and executes the listed groups of tests using Codeception. - -#### Usage - -```bash -vendor/bin/mftf run:group [--skip-generate|--remove|--xml] [--] <group1> [<group2>] -``` - -#### Options - -| Option | Description | -| --------------------- | --------------------------------------------------------------------------------------------------------- | -| `-k, --skip-generate` | Skips generating from the source XML. Instead, the command executes previously-generated groups of tests. | -| `-r, --remove` | Removes previously generated suites and tests before the actual generation and run. | -| `--debug` | Performs schema validations on XML files. `run:group` implicitly performs schema validation on merged files. It does not indicate the file name where the error is encountered. `--debug` performs per-file validation and returns additional debug information (such as the filename where an error occurred).| -| `--xml` | Generate JUnit XML Log (default: "report.xml") | - -#### Examples - -Clean up after the last test run; generate from XML and execute the tests with the annotations `group="group1"` and `group="group2"`: - -```bash -vendor/bin/mftf -r -- run:group group1 group2 -``` - -Execute previously generated tests with the annotations `group="group1"` and `group="group2"`, skipping the regeneration of the test: - -```bash -vendor/bin/mftf run:group -k -- group1 group2 -``` - -### `run:test` - -Generates and executes tests by name using Codeception. - -#### Usage - -```bash -vendor/bin/mftf run:test [--skip-generate|--remove|--xml] [--] <name1> [<name2>] -``` - -#### Options - -| Option | Description | -|-----------------------|-----------------------------------------------------------------------------------------------------------| -| `-k, --skip-generate` | Skips generating from the source XML. Instead, the command executes previously-generated groups of tests. | -| `-r, --remove` | Remove previously generated suites and tests. | -| `--debug` | Performs schema validations on XML files. `run:test` implicitly performs schema validation on merged files. It does not indicate the file name where the error is encountered. `--debug` performs per-file validation and returns additional debug information (such as the filename where an error occurred).| -| `--xml` | Generate JUnit XML Log (default: "report.xml") | - -#### Examples - -Generate the `LoginCustomerTest` and `StorefrontCreateCustomerTest` tests from XML and execute all the generated tests: - -```bash -vendor/bin/mftf run:test LoginCustomerTest StorefrontCreateCustomerTest -``` - -### `run:manifest` - -Runs a testManifest.txt file. - -This command runs all tests specified in a testManifest.xml file. It does not generate tests for you. You must do that as first. - -#### Usage - -```bash -vendor/bin/mftf run:manifest path/to/your/testManifest.txt -``` - -#### Example testManifest.xml file - -Each line should contain either: one test path or one group (-g) reference. - -``` -tests/functional/tests/MFTF/_generated/default/AdminLoginSuccessfulTestCest.php --g PaypalTestSuite -tests/functional/tests/MFTF/_generated/default/SomeOtherTestCest.php -tests/functional/tests/MFTF/_generated/default/ThirdTestCest.php --g SomeOtherSuite -``` - -### `run:failed` - -Regenerates and reruns tests that previously failed. - -This command cleans up previously generated tests. It generates and runs the tests listed in `dev/tests/acceptance/tests/_output/failed`. -For more details about `failed`, refer to [Reporting][]. - -#### Usage - -```bash -vendor/bin/mftf run:failed -``` -#### Options - -| Option | Description | -|-----------------------|-----------------------------------------------------------------------------------------------------------| -| `--debug` | Performs schema validations on XML files. `run:failed` implicitly performs schema validation on merged files. It does not indicate the file name where the error is encountered. `--debug` performs per-file validation and returns additional debug information (such as the filename where an error occurred). Use it after test run has failed once.| - -#### Examples - -Run the tests that failed in the previous run: - -```bash -vendor/bin/mftf run:failed -``` - -### `setup:env` - -Updates the [configuration] parameter values in the [`.env`] file. -Creates the `.env` file if it does not exist. - -#### Usage - -```bash -vendor/bin/mftf setup:env [config_param_option1=<value>] [config_param_option2=<value>] -``` - -`config_param` is a configuration parameter from the `.env` file. -The command consumes the parameters in a format of options assigned with values, for example `--MAGENTO_BASE_URL=http://magento.local/`. -If you specify a parameter that the `.env` file does not contain, the command returns an error. - -You can also update configuration parameter values when you use the [`build:project`][build] command. - -#### Examples - -To change values for the `MAGENTO_BASE_URL` and `BROWSER`: - -```bash -vendor/bin/mftf setup:env --MAGENTO_BASE_URL=http://magento.local/ --BROWSER=firefox -``` - -To create a `.env` file with example parameters: - -```bash -vendor/bin/mftf setup:env -``` - -The example parameters are taken from the `etc/config/.env.example` file. - -### `static-checks` - -Runs all or specific MFTF static-checks on the test codebase that MFTF is currently attached to. -Behavior for determining what tests to run is as follows: - -* If test names are specified, only those tests are run. -* If no test names are specified, tests are run according to `staticRuleset.json`. -* If no `staticRuleset.json` is found, all tests are run. - -Static checks errors are written to *.txt files under TEST_BP/tests/_output/static-results/ - -#### Usage - -```bash -vendor/bin/mftf static-checks [<names>]... -``` - -#### Options - -| Option | Description | -|-----------------------|-----------------------------------------------------------------------------------------------------------| -| `-p, --path` | Path to a MFTF test module to run "deprecatedEntityUsage" and "pauseActionUsage" static check scripts. Option is ignored by other static check scripts. - -#### Examples - -To check what existing static check scripts are available - -```bash -vendor/bin/mftf static-checks --help -``` - -To run all existing static check scripts - -```bash -vendor/bin/mftf static-checks -``` - -To run specific static check scripts - -```bash -vendor/bin/mftf static-checks testDependencies -``` - -```bash -vendor/bin/mftf static-checks actionGroupArguments -``` - -```bash -vendor/bin/mftf static-checks deprecatedEntityUsage -``` - -```bash -vendor/bin/mftf static-checks pauseActionUsage -``` - -```bash -vendor/bin/mftf static-checks annotations -``` - -```bash -vendor/bin/mftf static-checks deprecatedEntityUsage -p path/to/mftf/test/module -``` - -```bash -vendor/bin/mftf static-checks pauseActionUsage -p path/to/mftf/test/module -``` - -```bash -vendor/bin/mftf static-checks testDependencies actionGroupArguments -``` - -#### Existing static checks - -| Argument | Description | -|-----------------------|-----------------------------------------------------------------------------------------------------------| -|`testDependencies` | Checks that test dependencies do not violate Magento module's composer dependencies.| -|`actionGroupArguments` | Checks that action groups do not have unused arguments.| -|`deprecatedEntityUsage`| Checks that deprecated test entities are not being referenced.| -|`annotations`| Checks various details of test annotations, such as missing annotations or duplicate annotations.| -|`pauseUsage`| Checks that pause action is not used in action groups, tests or suites.| - -#### Defining ruleset - -The `static-checks` command will look for a `staticRuleset.json` file under either: - -* `dev/tests/acceptance/staticRuleset.json`, if embedded with Magento2 -* `dev/staticRuleset.json`, if standalone - -This file works as the default configuration to easily allow for the integration of `static-checks` in a CI environment. -Currently, the ruleset only defines the tests to run. Here is an example of the expected format: - -```json -{ - "tests": [ - "actionGroupArguments", - "anotherTest" - ] -} -``` - -### `upgrade:tests` - -When the path argument is specified, this `upgrade` command applies all the major version MFTF upgrade scripts to a `Test Module` in the given path. -Otherwise, it will apply all the major version MFTF upgrade scripts to all installed test components. - -`Test Module` should have the directory structure of ActionGroup, Data, Metadata, Page, Section, Test, and Suite. - -**Note**: - -The upgrade scripts are meant to be used for Test Modules under source code control. If you have old versions of test modules under vendor, those test modules will get upgraded - -#### Usage - -```bash -vendor/bin/mftf upgrade:tests [<path>] -``` - -`<path>` is the path to a MFTF `Test Module` that needs to be upgraded. -The command searches recursively for any `*.xml` files to upgrade. - -#### Examples - -To upgrade all installed MFTF tests: - -```bash -vendor/bin/mftf upgrade:tests -``` - -To upgrade all test components inside modules in the `dev/tests/acceptance/tests/` directory: - -```bash -vendor/bin/mftf upgrade:tests /Users/user/magento2/dev/tests/acceptance/tests/ -``` - -To upgrade all test components inside the `Catalog` module: - -```bash -vendor/bin/mftf upgrade:tests /Users/user/magento2/app/code/Magento/Catalog/Test/Mftf/ -``` - -### `codecept:run` - -A MFTF wrapper command that invokes `vendor/bin/codecept run`. This command runs tests in functional suite. Tests must be generated before using this command. - -#### Usage - -See the [Run Command](https://codeception.com/docs/reference/Commands#Run). - -```bash -vendor/bin/mftf codecept:run [<suite|test>] --[<option(s)>] -``` - -#### Examples - -```bash -# Run all tests in functional suite -vendor/bin/mftf codecept:run functional -``` - -```bash -# Run all tests in functional suite with options -vendor/bin/mftf codecept:run functional --verbose --steps --debug -``` - -```bash -# Run one test -vendor/bin/mftf codecept:run functional Magento/_generated/default/AdminCreateCmsPageTestCest.php --debug -``` - -```bash -# Run all tests in default group -vendor/bin/mftf codecept:run functional --verbose --steps -g default -``` - -<div class="bs-callout-warning"> -<p> -Note: You may want to limit the usage of this Codeception command with arguments and options for "acceptance" only, since it is what's supported by MFTF. -When using this command, you should change "acceptance" to "functional" when referring to Codeception documentation. -</p> -</div> - -<!-- LINK DEFINITIONS --> - -[configuration]: ../configuration.md -[Reference]: #reference -[build]: #buildproject -[setup]: #setupenv -[Reporting]: ../reporting.md - -<!-- Abbreviations --> - -*[MFTF]: Magento Functional Testing Framework diff --git a/docs/configuration.md b/docs/configuration.md deleted file mode 100644 index 501b1d5e9..000000000 --- a/docs/configuration.md +++ /dev/null @@ -1,446 +0,0 @@ -# Configuration - -The `*.env` file provides additional configuration for the Magento Functional Testing Framework (MFTF). -To run MFTF on your Magento instance, specify the basic configuration values. -Advanced users can create custom configurations based on requirements and environment. - -## Basic configuration - -These basic configuration values are __required__ and must be set by the user before MFTF can function correctly. - -### MAGENTO_BASE_URL - -The root URL of the Magento application under test. - -Example: - -```conf -MAGENTO_BASE_URL=http://magento2.vagrant251 -``` - -<div class="bs-callout bs-callout-info" markdown="1"> -If the `MAGENTO_BASE_URL` contains a subdirectory (like `http://magento.test/magento2ce`), specify [`MAGENTO_CLI_COMMAND_PATH`][]. -</div> - -### MAGENTO_BACKEND_NAME - -The path to the Magento Admin page. - -Example: - -```conf -MAGENTO_BACKEND_NAME=admin_12346 -``` - -### MAGENTO_BACKEND_BASE_URL - -(Optional) If you are running the Admin Panel on a separate domain, specify this value: - -Example: - -```conf -MAGENTO_BACKEND_BASE_URL=https://admin.magento2.test -``` - -### MAGENTO_ADMIN_USERNAME - -The username that tests can use to access the Magento Admin page - -Example: - -```conf -MAGENTO_ADMIN_USERNAME=admin -``` - -### MAGENTO_ADMIN_PASSWORD - -The password that tests will use to log in to the Magento Admin page. - -Example: - -```conf -MAGENTO_ADMIN_PASSWORD=1234reTyt%$7 -``` - -## Advanced configuration - -Depending on the environment you use, you may need to configure MFTF more precisely by setting additional configuration parameters. -This section describes available configuration parameters and their default values (where applicable). - -### DEFAULT_TIMEZONE - -Sets a default value for the `timezone` attribute of a [`generateDate` action][generateDate]. -This value is applied when a test step does not specify a time zone. -For the complete list of available time zones, refer to [List of Supported Timezones][timezones]. - -Default: `America/Los_Angeles`. - -Example: - -```conf -DEFAULT_TIMEZONE=UTC -``` - -### SELENIUM - -The `SELENIUM_*` values form the URL of a custom Selenium server for running testing. - -Default Selenium URL: `http://127.0.0.1:4444/wd/hub` - -And the default configuration: - -```conf -SELENIUM_HOST=127.0.0.1 -SELENIUM_PORT=4444 -SELENIUM_PROTOCOL=http -SELENIUM_PATH=/wd/hub -``` - -<div class="bs-callout bs-callout-warning" markdown="1"> -`SELENIUM_*` values are required if you are running Selenium on an external system. -If you change the configuration of the external Selenium server, you must update these values. -</div> - -#### SELENIUM_HOST - -Override the default Selenium server host. - -Example: - -```conf -SELENIUM_HOST=user:pass@ondemand.saucelabs.com -``` - -#### SELENIUM_PORT - -Override the default Selenium server port. - -Example: - -```conf -SELENIUM_PORT=443 -``` - -#### SELENIUM_PROTOCOL - -Override the default Selenium server protocol. - -Example: - -```conf -SELENIUM_PROTOCOL=https -``` - -#### SELENIUM_PATH - -Override the default Selenium server path. - -Example: - -```conf -SELENIUM_PATH=/wd/hub -``` - -### MAGENTO_RESTAPI - -These `MAGENTO_RESTAPI_*` values are optional and can be used in cases when your Magento instance has a different API path than the one in `MAGENTO_BASE_URL`. - -```conf -MAGENTO_RESTAPI_SERVER_HOST -MAGENTO_RESTAPI_SERVER_PORT -``` - -#### MAGENTO_RESTAPI_SERVER_HOST - -The protocol and the host of the REST API server path. - -Example: - -```conf -MAGENTO_RESTAPI_SERVER_HOST=http://localhost -``` - -#### MAGENTO_RESTAPI_SERVER_PORT - -The port part of the API path. - -Example: - -```conf -MAGENTO_RESTAPI_SERVER_PORT=5000 -``` - -### \*_BP - -Settings to override base paths for the framework. -You can use it when MFTF is applied as a separate tool. -For example, when you need to place MFTF and the Magento codebase in separate projects. - -```conf -MAGENTO_BP -TESTS_BP -FW_BP -TESTS_MODULES_PATH -``` - -#### MAGENTO_BP - -The path to a local Magento codebase. -It enables the [`bin/mftf`][mftf] commands such as `run` and `generate` to parse all modules of the Magento codebase for MFTF tests. - -```conf -MAGENTO_BP=~/magento2/ -``` - -#### TESTS_BP - -BP is an acronym for _Base Path_. -The path to where MFTF supplementary files are located in the Magento codebase. - -Example: - -```conf -TESTS_BP=~/magento2ce/dev/tests/acceptance -``` - -#### FW_BP - -The path to MFTF. -FW_BP is an acronym for _FrameWork Base Path_. - -Example: - -```conf -FW_BP=~/magento/magento2-functional-testing-framework -``` - -### TESTS_MODULE_PATH - -The path to where the MFTF modules mirror Magento modules. - -Example: - -```conf -TESTS_MODULE_PATH=~/magento2/dev/tests/acceptance/tests/functional/Magento -``` - -### MODULE_ALLOWLIST - -Use for a new module. -When adding a new directory at `tests/functional/Magento`, add the directory name to `MODULE_ALLOWLIST` to enable MFTF to process it. - -Example: - -```conf -MODULE_ALLOWLIST=Magento_Framework,Magento_ConfigurableProductWishlist,Magento_ConfigurableProductCatalogSearch -``` - -### MAGENTO_CLI_COMMAND_PATH - -Path to the Magento CLI command entry point. - -Default: `dev/tests/acceptance/utils/command.php`. -It points to `MAGENTO_BASE_URL` + `dev/tests/acceptance/utils/command.php` - -Modify the default value: - -- for non-default Magento installation -- when using a subdirectory in the `MAGENTO_BASE_URL` - -Example: `dev/tests/acceptance/utils/command.php` - -### BROWSER - -Override the default browser performing the tests. - -Default: Chrome - -Example: - -```conf -BROWSER=firefox -``` - -### CREDENTIAL_VAULT_ADDRESS - -The Api address for a vault server. - -Default: http://127.0.0.1:8200 - -Example: - -```conf -# Default api address for local vault dev server -CREDENTIAL_VAULT_ADDRESS=http://127.0.0.1:8200 -``` - -### CREDENTIAL_VAULT_SECRET_BASE_PATH - -Vault secret engine base path. - -Default: secret - -Example: - -```conf -# Default base path for kv secret engine in local vault dev server -CREDENTIAL_VAULT_SECRET_BASE_PATH=secret -``` - -### CREDENTIAL_AWS_SECRETS_MANAGER_REGION - -The region that AWS Secrets Manager is located. - -Example: - -```conf -# Region of AWS Secrets Manager -CREDENTIAL_AWS_SECRETS_MANAGER_REGION=us-east-1 -``` - -### CREDENTIAL_AWS_SECRETS_MANAGER_PROFILE - -The profile used to connect to AWS Secrets Manager. - -Example: - -```conf -# Profile used to connect to AWS Secrets Manager. -CREDENTIAL_AWS_SECRETS_MANAGER_PROFILE=default -``` - -### VERBOSE_ARTIFACTS - -Determines if passed tests should still have all their Allure artifacts. These artifacts include `.txt` attachments for `dontSee` actions and `createData` actions. - -If enabled, all tests will have all of their normal Allure artifacts. - -If disabled, passed tests will have their Allure artifacts trimmed. Failed tests will still contain all their artifacts. - -This is set `false` by default. - -```conf -VERBOSE_ARTIFACTS=true -``` - -### ENABLE_BROWSER_LOG - -Enables addition of browser logs to Allure steps - -```conf -ENABLE_BROWSER_LOG=true -``` - -### SELENIUM_CLOSE_ALL_SESSIONS - -Forces MFTF to close all Selenium sessions after running a suite. - -Use this if you're having issues with sessions hanging in an MFTF suite. - -```conf -SELENIUM_CLOSE_ALL_SESSIONS=true -``` - -### BROWSER_LOG_BLOCKLIST - -Blocklists types of browser log entries from appearing in Allure steps. - -Denoted in browser log entry as `"SOURCE": "type"`. - -```conf -BROWSER_LOG_BLOCKLIST=other,console-api -``` - -### WAIT_TIMEOUT - -Global MFTF configuration for the default amount of time (in seconds) that a test will wait while loading a page. - -```conf -WAIT_TIMEOUT=30 -``` - -### ENABLE_PAUSE - -Enables the ability to pause test execution at any point, and enter an interactive shell where you can try commands in action. -When pause is enabled, MFTF will generate pause() command in _failed() hook so that test will pause execution when failed. - -```conf -ENABLE_PAUSE=true -``` - -### REMOTE_STORAGE_AWSS3_DRIVER - -The remote storage driver. To enable AWS S3, use `aws-s3`. - -Example: - -```conf -REMOTE_STORAGE_AWSS3_DRIVER=aws-s3 -``` - -### REMOTE_STORAGE_AWSS3_REGION - -The region of S3 bucket. - -Example: - -```conf -REMOTE_STORAGE_AWSS3_REGION=us-west-2 -``` - -### REMOTE_STORAGE_AWSS3_BUCKET - -The name of S3 bucket. - -Example: - -```conf -REMOTE_STORAGE_AWSS3_BUCKET=my-test-bucket -``` - -### REMOTE_STORAGE_AWSS3_PREFIX - -The optional prefix inside S3 bucket. - -Example: - -```conf -REMOTE_STORAGE_AWSS3_PREFIX=local -``` - -### REMOTE_STORAGE_AWSS3_ACCESS_KEY - -The optional access key for the S3 bucket. - -Example: - -```conf -REMOTE_STORAGE_AWSS3_ACCESS_KEY=access-key -``` - -### REMOTE_STORAGE_AWSS3_SECRET_KEY - -The optional secret key for the S3 bucket. - -Example: - -```conf -REMOTE_STORAGE_AWSS3_SECRET_KEY=secret-key -``` - -### MAGENTO_ADMIN_WEBAPI_TOKEN_LIFETIME - -The lifetime (in seconds) of Magento Admin WebAPI token; if token is older than this value a refresh attempt will be made just before the next WebAPI call. - -Example: - -```conf -MAGENTO_ADMIN_WEBAPI_TOKEN_LIFETIME=10800 -``` - -<!-- Link definitions --> - -[`MAGENTO_CLI_COMMAND_PATH`]: #magento_cli_command_path -[generateDate]: test/actions.md#generatedate -[mftf]: commands/mftf.md -[timezones]: https://php.net/manual/en/timezones.php diff --git a/docs/configure-2fa.md b/docs/configure-2fa.md deleted file mode 100644 index 7b01913b9..000000000 --- a/docs/configure-2fa.md +++ /dev/null @@ -1,53 +0,0 @@ -# Configuring MFTF for Two-Factor Authentication (2FA) - -Using two-factor authentication (2FA) with MFTF is possible with some configurations settings in Magento. -In this document, we will use Google as the authentication provider. - -## Configure Magento {#config-magento-2fa} - -To prepare Magento for MFTF testing when 2FA is enabled, set the following configurations through the Magento CLI. - -First, select `Google Authenticator` as Magento's 2FA provider: - -```bash -bin/magento config:set twofactorauth/general/force_providers google -``` - -Now set the OTP window to `60` seconds: - -```bash -bin/magento config:set twofactorauth/google/otp_window 60 -``` - -Set a base32-encoded `secret` for `Google Authenticator` to generate a OTP for the default admin user that you set for `MAGENTO_ADMIN_USERNAME` in `.env`: - -```bash -bin/magento security:tfa:google:set-secret <MAGENTO_ADMIN_USERNAME> <OTP_SHARED_SECRET> -``` - -## Configure the MFTF {#config-mftf-2fa} - -Save the same base32-encoded `secret` in a MFTF credential storage, e.g. `.credentials` file, `HashiCorp Vault` or `AWS Secrets Manager`. -More details are [here](./credentials.md). - -The path of the `secret` should be: - -```conf -magento/tfa/OTP_SHARED_SECRET -``` - -## GetOTP {#getOTP} - -A one-time password (OTP) is required when an admin user logs into the Magento admin. -Use the action `getOTP` [Reference](./test/actions.md#getotp) to generate the code and use it for the `Authenticator code` text field in 2FA - Google Auth page. - -Note: -You will need to set the `secret` for any non-default admin users first, before using `getOTP`. For example: - -{%raw%} - -```xml -<magentoCLI command="security:tfa:google:set-secret admin2 {{_CREDS.magento/tfa/OTP_SHARED_SECRET}}" stepKey="setSecret"/> -``` - -{%endraw%} diff --git a/docs/credentials.md b/docs/credentials.md deleted file mode 100644 index 56f1ddbc4..000000000 --- a/docs/credentials.md +++ /dev/null @@ -1,290 +0,0 @@ -# Credentials - -When you test functionality that involves external services such as UPS, FedEx, PayPal, or SignifyD, -use the MFTF credentials feature to hide sensitive [data][] like integration tokens and API keys. - -Currently MFTF supports three types of credential storage: - -- **.credentials file** -- **HashiCorp Vault** -- **AWS Secrets Manager** - -## Configure File Storage - -MFTF creates a sample file for credentials during [initial setup][]: `magento2/dev/tests/acceptance/.credentials.example`. -The file contains an example list of keys for fields that can require credentials. - -### Create `.credentials` - -To make MFTF process the file with credentials, in the command line, navigate to `magento2/dev/tests/acceptance/` and rename `.credentials.example` to `.credentials`. - -```bash -cd dev/tests/acceptance/ -``` - -```bash -cp .credentials.example .credentials -``` - -### Add `.credentials` to `.gitignore` - -Verify that the file is excluded from tracking by `.gitignore` (unless you need this behavior): - -```bash -git check-ignore .credentials -``` - -The command outputs the path if the file is excluded: - -```terminal -.credentials -``` - -### Define sensitive data in the `.credentials` file - -Open the `.credentials` file and, for Magento core credentials, uncomment the fields you want to use and add your values: - -```conf -... -# Credentials for the USPS service -magento/carriers_usps_userid=usps_test_user -magento/carriers_usps_password=Lmgxvrq89uPwECeV - -# Credentials for the DHL service -#magento/carriers_dhl_id_us=dhl_test_user -#magento/carriers_dhl_password_us=Mlgxv3dsagVeG -.... -``` -### Add key and value pair for admin password . -magento/MAGENTO_ADMIN_PASSWORD must contain the user password required for authorization in the Admin area. Example: magento/MAGENTO_ADMIN_PASSWORD=mycustompassword - -```conf -... -# Admin password -magento/MAGENTO_ADMIN_PASSWORD =123123q - -.... -``` - -Or add new key/value pairs for your own credentials. The keys use the following format: - -```conf -<vendor>/<key_name>=<key_value> -``` - -<div class="bs-callout bs-callout-info" markdown="1"> -The `/` symbol is not supported in a `key_name` other than the one after your vendor or extension name. -</div> - -Otherwise you are free to use any other `key_name` you like, as they are merely the keys to reference from your tests. - -```conf -# Credentials for the MyAwesome service -vendor/my_awesome_service_token=rRVSVnh3cbDsVG39oTMz4A -``` - -## Configure Vault Storage - -Hashicorp vault secures, stores, and tightly controls access to data in modern computing. -It provides advanced data protection for your testing credentials. - -MFTF works with both `vault enterprise` and `vault open source` that use `KV Version 2` secret engine. - -### Install vault CLI - -Download and install vault CLI tool if you want to run or develop MFTF tests locally. [Download Vault][Download Vault] - -### Authenticate to vault via vault CLI - -Authenticate to vault server via the vault CLI tool: [Login Vault][Login Vault]. - -```bash -vault login -method -path -``` - -**Do not** use `-no-store` command option, as MFTF will rely on the persisted token in the token helper (usually the local filesystem) for future API requests. - -### Store secrets in vault - -MFTF uses the `KV Version 2` secret engine for secret storage. -More information for working with `KV Version 2` can be found in [Vault KV2][Vault KV2]. - -#### Secrets path and key convention - -The path and key for secret data must follow the format: - -```conf -<SECRETS_BASE_PATH>/mftf/<VENDOR>/<SECRET_KEY> -``` - -```conf -# Secret path and key for carriers_usps_userid -secret/mftf/magento/carriers_usps_userid - -# Secret path and key for carriers_usps_password -secret/mftf/magento/carriers_usps_password -``` - -#### Write secrets to vault - -You can use vault CLI or API to write secret data (credentials, etc) to vault. Here is a CLI example: - -```bash -vault kv put secret/mftf/magento/carriers_usps_userid carriers_usps_userid=usps_test_user -vault kv put secret/mftf/magento/carriers_usps_password carriers_usps_password=Lmgxvrq89uPwECeV -``` - -### Setup MFTF to use vault - -Add vault configuration environment variables [`CREDENTIAL_VAULT_ADDRESS`][] and [`CREDENTIAL_VAULT_SECRET_BASE_PATH`][] -from `etc/config/.env.example` in `.env`. -Set values according to your vault server configuration. - -```conf -# Default vault dev server -CREDENTIAL_VAULT_ADDRESS=http://127.0.0.1:8200 -CREDENTIAL_VAULT_SECRET_BASE_PATH=secret -``` - -## Configure AWS Secrets Manager - -AWS Secrets Manager offers secret management that supports: -- Secret rotation with built-in integration for Amazon RDS, Amazon Redshift, and Amazon DocumentDB -- Fine-grained policies and permissions -- Audit secret rotation centrally for resources in the AWS Cloud, third-party services, and on-premises - -### Prerequisites - -#### Use AWS Secrets Manager from your own AWS account - -- An AWS account with Secrets Manager service -- An IAM user with AWS Secrets Manager access permission - -#### Use AWS Secrets Manager in CI/CD - -- AWS account ID where the AWS Secrets Manager service is hosted -- Authorized CI/CD EC2 instances with AWS Secrets Manager service access IAM role attached - -### Store secrets in AWS Secrets Manager - -#### Secrets format - -`Secret Name` and `Secret Value` are two key pieces of information for creating a secret. - -`Secret Value` can be either plaintext or key/value pairs in JSON format. - -`Secret Name` must use the following format: - -```conf -mftf/<VENDOR>/<YOUR/SECRET/KEY> -``` - -`Secret Value` can be stored in two different formats: plaintext or key/value pairs. - -For plaintext format, `Secret Value` can be any string you want to secure. - -For key/value pairs format, `Secret Value` is a key/value pair with `key` the same as `Secret Name` without `mftf/<VENDOR>/` prefix, which is `<YOUR/SECRET/KEY>`, and value can be any string you want to secure. - -##### Create Secrets using AWS CLI - -```bash -aws secretsmanager create-secret --name "mftf/magento/shipping/carriers_usps_userid" --description "Carriers USPS user id" --secret-string "1234567" -``` - -##### Create Secrets using AWS Console - -- Sign in to the AWS Secrets Manager console -- Choose Store a new secret -- In the Select secret type section, specify "Other type of secret" -- For `Secret Name`, `Secret Key` and `Secret Value` field, for example, to save the same secret in key/value JSON format, you should use - -```conf -# Secret Name -mftf/magento/shipping/carriers_usps_userid - -# Secret Key -shipping/carriers_usps_userid - -# Secret Value -1234567 -``` - -### Setup MFTF to use AWS Secrets Manager - -To use AWS Secrets Manager, the AWS region to connect to is required. You can set it through environment variable [`CREDENTIAL_AWS_SECRETS_MANAGER_REGION`][] in `.env`. - -MFTF uses the recommended [Default Credential Provider Chain][credential chain] to establish connection to AWS Secrets Manager service. -You can setup credentials according to [Default Credential Provider Chain][credential chain] and there is no MFTF specific setup required. -Optionally, however, you can explicitly set AWS profile through environment variable [`CREDENTIAL_AWS_SECRETS_MANAGER_PROFILE`][] in `.env`. - -```conf -# Sample AWS Secrets Manager configuration -CREDENTIAL_AWS_SECRETS_MANAGER_REGION=us-east-1 -CREDENTIAL_AWS_SECRETS_MANAGER_PROFILE=default -``` - -### Optionally set CREDENTIAL_AWS_ACCOUNT_ID environment variable - -In case AWS credentials cannot resolve to a valid AWS account, full AWS KMS ([Key Management Service][]) key ARN ([Amazon Resource Name][]) is required. -You will also need to set `CREDENTIAL_AWS_ACCOUNT_ID` environment variable so that MFTF can construct the full ARN. This is mostly used for CI/CD. - -```bash -export CREDENTIAL_AWS_ACCOUNT_ID=<Your_12_Digits_AWS_Account_ID> -``` - -## Configure multiple credential storage - -It is possible and sometimes useful to setup and use multiple credential storage at the same time. -In this case, the MFTF tests are able to read secret data at runtime from all storage options. MFTF will use the following precedence: - -``` -.credentials File > HashiCorp Vault > AWS Secrets Manager -``` -<!-- {% raw %} --> - -## Use credentials in a test - -Credentials can be used in actions: [`fillField`][], [`magentoCLI`][], and [`createData`][]. - -Define the value as a reference to the corresponding key in the credentials file or vault such as `{{_CREDS.my_data_key}}`: - -- `_CREDS` is an environment constant pointing to the `.credentials` file -- `my_data_key` is a key in the the `.credentials` file or vault that contains the value to be used in a test step - - for File Storage, ensure your key contains the vendor prefix, which is `vendor/my_data_key` - -For example, to reference secret data in the [`fillField`][] action, use the `userInput` attribute using a typical File Storage: - -```xml -<fillField stepKey="FillApiToken" selector=".api-token" userInput="{{_CREDS.vendor/my_data_key}}" /> -``` - -<!-- {% endraw %} --> - -## Implementation details - -The generated tests do not contain credentials values. -MFTF dynamically retrieves, encrypts, and decrypts the sensitive data during test execution. -Decrypted credentials do not appear in the console, error logs, or [test reports][]. -The decrypted values are only available in the `.credentials` file or within vault. - -<div class="bs-callout bs-callout-info"> -The MFTF tests delivered with Magento application do not use credentials and do not cover external services, because of sensitivity of the data. -</div> - -<!-- Link definitions --> -[`fillField`]: test/actions.md#fillfield -[`magentoCLI`]: test/actions.md#magentocli -[`createData`]: test/actions.md#createdata -[data]: data.md -[initial setup]: getting-started.md -[test reports]: reporting.md -[Download Vault]: https://www.hashicorp.com/products/vault/ -[Login Vault]: https://www.vaultproject.io/docs/commands/login.html -[Vault KV2]: https://www.vaultproject.io/docs/secrets/kv/kv-v2.html -[`CREDENTIAL_VAULT_ADDRESS`]: configuration.md#credential_vault_address -[`CREDENTIAL_VAULT_SECRET_BASE_PATH`]: configuration.md#credential_vault_secret_base_path -[credential chain]: https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html -[`CREDENTIAL_AWS_SECRETS_MANAGER_PROFILE`]: configuration.md#credential_aws_secrets_manager_profile -[`CREDENTIAL_AWS_SECRETS_MANAGER_REGION`]: configuration.md#credential_aws_secrets_manager_region -[Key Management Service]: https://aws.amazon.com/kms/ -[Amazon Resource Name]: https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html diff --git a/docs/custom-helpers.md b/docs/custom-helpers.md deleted file mode 100644 index bf1ebc572..000000000 --- a/docs/custom-helpers.md +++ /dev/null @@ -1,129 +0,0 @@ -# Custom Helpers - -<div class="bs-callout-warning"> -Due to complexity, you should only write new custom helpers as a last resort, after trying to implement your test using built-in actions. -</div> - -Custom Helpers allow test writers to write custom test actions to solve advanced requirements beyond what MFTF offers out of the box. - -In MFTF version 3.0.0, the following test actions were removed: - -* `<executeInSelenium>` -* `<performOn>` - -These actions were removed because they allowed custom PHP code to be written inline inside of XML files. This code was difficult to read. It had no proper syntax highlighting and no linting. It was difficult to maintain, troubleshoot, and modify. - -However, sometimes custom logic beyond what MFTF offers is necessary so we have provided an alternative solution: the `<helper>` action. - -## Example - -Custom helpers are implemented in PHP files that must be placed in this directory: - -```text -<ModuleName>/Test/Mftf/Helper -``` - -This custom helper selects text on the page with this approach: - -1. Move to a very specific X,Y starting position. -1. Click and hold the mouse button down. -1. Move to another specific X,Y position. -1. Release the mouse button. - -This functionality is used to select text on the page and cannot be accomplished using built-in test actions. - -### PHP File - -```php -<?php -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\PageBuilder\Test\Mftf\Helper; - -use Magento\FunctionalTestingFramework\Helper\Helper; - -/** - * Class SelectText provides an ability to select needed text. - */ -class SelectText extends Helper -{ - /** - * Select needed text. - * - * @param string $context - * @param int $startX - * @param int $startY - * @param int $endX - * @param int $endY - * @return void - */ - public function selectText(string $context, int $startX, int $startY, int $endX, int $endY) - { - try { - /** @var \Magento\FunctionalTestingFramework\Module\MagentoWebDriver $webDriver */ - $webDriver = $this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver'); - - $contextElement = $webDriver->webDriver->findElement(\Facebook\WebDriver\WebDriverBy::xpath($context)); - $actions = new \Facebook\WebDriver\Interactions\WebDriverActions($webDriver->webDriver); - $actions->moveToElement($contextElement, $startX, $startY) - ->clickAndHold() - ->moveToElement($contextElement, $endX, $endY) - ->release() - ->perform(); - } catch (\Exception $e) { - $this->fail($e->getMessage()); - } - } -} -``` - -### Notes about this PHP file - -The following details are important about the above file: - -1. The `namespace` must match the file location: `namespace Magento\PageBuilder\Test\Mftf\Helper;` -2. The class must `extends Helper` and have the corresponding `use` statement to match. -3. You may access the WebDriver object via `$this->getModule('\Magento\FunctionalTestingFramework\Module\MagentoWebDriver')`. -4. You may implement multiple related methods within the same class. -5. Specify the correct function argument types to match the type of values you want to pass in. In this case, we specified `string $context, int $startX, int $startY, int $endX, int $endY`. In the XML we will match these types. - -You should follow the same patterns in any custom helpers that you write yourself, but you may implement any logic or iteration that you need to solve for your use case. - -### Referencing in a test - -Once you have implemented something like the above PHP file, reference it in a test: - -```xml -<helper class="\Magento\PageBuilder\Test\Mftf\Helper\SelectText" method="selectText" stepKey="selectHeadingTextInTinyMCE"> - <argument name="context">//div[contains(@class, 'inline-wysiwyg')]//h2</argument> - <argument name="startX">{{TinyMCEPartialHeadingSelection.startX}}</argument> - <argument name="startY">{{TinyMCEPartialHeadingSelection.startY}}</argument> - <argument name="endX">{{TinyMCEPartialHeadingSelection.endX}}</argument> - <argument name="endY">{{TinyMCEPartialHeadingSelection.endY}}</argument> -</helper> -``` - -### Notes about the XML - -1. Specify an argument value for every argument that matches our PHP implementation. This allows us to pass other test data to the Custom Helper. -1. The `class` attribute matches the namespace specified in the PHP file. -1. Specify the method from the class via the `method` attribute. -1. If the function has a return value, it will be assigned to the `stepKey` variable. In this case, `$selectHeadingTextInTinyMCE` holds the return value. -1. The types of argument values must match the PHP implementation's expected types. - -## Key takeaways - -Custom helpers allow you to solve complex use cases such as conditional logic, iteration, or complex WebDriver usage. - -With access to the WebDriver object, you have a lot of flexibility available to you. See the [Codeception WebDriver](https://github.com/Codeception/module-webdriver/blob/master/src/Codeception/Module/WebDriver.php) for technical details and functionality available for use. - -A custom helper is written in a PHP file and then referenced in test XML, like other actions. - -You should only use these as a last resort after trying to implement your test using built-in actions. - -## References - -[Codeception WebDriver source code](https://github.com/Codeception/module-webdriver/blob/master/src/Codeception/Module/WebDriver.php) - Reference for using the WebDriver Object diff --git a/docs/data.md b/docs/data.md deleted file mode 100644 index 721f94a7e..000000000 --- a/docs/data.md +++ /dev/null @@ -1,345 +0,0 @@ -# Input testing data - -MFTF enables you to specify and use `<data>` entities defined in XML. Default `<data>` entities are provided for use and as templates for entity creation and manipulation. -The following diagram shows the XML structure of an MFTF data object: - -![MFTF Data Object](img/data-dia.svg) - -<!-- {% raw %} --> - -The MFTF `<data>` entities are stored in `<module_dir>/Test/Mftf/Data/`. - -## Supply data to test by reference to a data entity - -Test steps requiring `<data>` input in an action, like filling a field with a string, may reference an attribute from a data entity: - -```xml -userInput="{{SimpleSubCategory.name}}" -``` - -In this example: - -* `SimpleSubCategory` is an entity name. -* `name` is a `<data>` key of the entity. The corresponding value will be assigned to `userInput` as a result. - -The following is an example of the usage of `<data>` entity in the `Magento/Customer/Test/Mftf/Test/AdminCustomersAllCustomersNavigateMenuTest.xml` test: - -```xml -<actionGroup ref="AdminNavigateMenuActionGroup" stepKey="navigateToAllCustomerPage"> - <argument name="menuUiId" value="{{AdminMenuCustomers.dataUiId}}"/> - <argument name="submenuUiId" value="{{AdminMenuCustomersAllCustomers.dataUiId}}"/> -</actionGroup> -``` - -In the above example: - -* `AdminMenuCustomers` is an entity name. -* `dataUiId` is a `<data>` key of the entity. - -### Environmental data - -```xml -userInput="{{_ENV.MAGENTO_ADMIN_USERNAME}}" -``` - -In this example: - -* `_ENV` is a reference to the `dev/tests/acceptance/.env` file, where basic environment variables are set. -* `MAGENTO_ADMIN_USERNAME` is a name of an environment variable. - The corresponding value will be assigned to `userInput` as a result. - -The following is an example of the usage of `_ENV` in the `Magento/Braintree/Test/Mftf/ActionGroup/AdminDeleteRoleActionGroup.xml` action group: - -```xml -<fillField stepKey="TypeCurrentPassword" selector="{{AdminDeleteRoleSection.current_pass}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}"/> -``` - -### Sensitive data - -```xml -userInput="{{_CREDS.my_secret_token}}" -``` - -In this example: - -* `_CREDS` is a constant to reference to the `dev/tests/acceptance/.credentials` file, where sensitive data and secrets are stored for use in a test. -* `MY_SECRET_TOKEN` is the name of a key in the credentials variable. - The corresponding value of the credential will be assigned to `userInput` as a result. -* The decrypted values are only available in the `.credentials` file in which they are stored. - -Learn more in [Credentials][]. - -The following is an example of the usage of `_CREDS` in the `Magento/Braintree/Test/Mftf/Data/BraintreeData.xml` data entity: - -```xml -<entity name="MerchantId" type="merchant_id"> - <data key="value">{{_CREDS.magento/braintree_enabled_fraud_merchant_id}}</data> -</entity> -``` - -## Persist a data entity as a prerequisite of a test {#persist-data} - -A test can specify an entity to be persisted (created in the database) so that the test actions could operate on the existing known data. - -Example of referencing `data` in a test: - -```xml -userInput="$createCustomer.email$" -``` - -In this example: - -* `createCustomer` is a step key of the corresponding test step that creates an entity. -* `email` is a data key of the entity. - The corresponding value will be assigned to `userInput` as a result. - -The following is an example of the usage of the persistant data in `Magento/Customer/Test/Mftf/Test/AdminCreateCustomerWithCountryUSATest.xml` test: - -```xml -<actionGroup ref="AdminFilterCustomerByEmail" stepKey="filterTheCustomerByEmail"> - <argument name="email" value="$$createCustomer.email$$"/> -</actionGroup> -``` - -<div class="bs-callout bs-callout-info"> -As of MFTF 2.3.6, you no longer need to differentiate between scopes (a test, a hook, or a suite) for persisted data when referencing it in tests. -</div> - -MFTF now stores the persisted data and attempts to retrieve it using the combination of `stepKey` and the scope of where it has been called. -The current scope is preferred, then widening to _test > hook > suite_ or _hook > test > suite_. - -This emphasizes the practice for the `stepKey` of `createData` to be descriptive and unique, as a duplicated `stepKey` in both a `<test>` and `<before>` prefers the `<test>` data. - -## Use data returned by test actions - -A test can also reference data that was returned as a result of [test actions][], like the action `<grabValueFrom selector="someSelector" stepKey="grabStepKey>`. - -Further in the test, the data grabbed by the `someSelector` selector can be referenced using the `stepKey` value. In this case, it is `grabStepKey`. - -The `stepKey` value can only be referenced within the test scope that it is defined in (`test`, `before/after`). - -The following example shows the usage of `grabValueFrom` in testing, where the returned value is used by action's `stepKey`: - -```xml -<grabValueFrom selector="someSelector" stepKey="grabStepKey"/> -<fillField selector=".functionalTestSelector" userInput="{$grabStepKey}" stepKey="fillFieldKey1"/> -``` - -The following is an example of the `Magento/Catalog/Test/Mftf/ActionGroup/AssertDiscountsPercentageOfProductsActionGroup.xml` test: - -```xml -<grabValueFrom selector="{{AdminProductFormAdvancedPricingSection.productTierPricePercentageValuePriceInput('0')}}" stepKey="grabProductTierPriceInput"/> -<assertEquals stepKey="assertProductTierPriceInput"> - <expectedResult type="string">{{amount}}</expectedResult> - <actualResult type="string">$grabProductTierPriceInput</actualResult> -</assertEquals> -``` - -## Hard-coded data input - -The data to operate against can be included as literals in a test. Hard-coded data input can be useful in assertions. - -See also [Actions][]. - -```xml -userInput="We'll email you an order confirmation with details and tracking info." -``` - -## Format - -The format of the `<data>` entity is: - -```xml -<?xml version="1.0" encoding="UTF-8"?> - -<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd"> - <entity name="" type=""> - <data key=""></data> - </entity> - <entity name="" type=""> - <data key="" unique=""></data> - <var key="" entityType="" entityKey=""/> - </entity> -</entities> -``` - -## Principles - -The following conventions apply to MFTF `<data>`: - -* A `<data>` file may contain multiple data entities. -* Camel case is used for `<data>` elements. The name represents the `<data>` type. For example, a file with customer data is `CustomerData.xml`. A file for simple product would be `SimpleProductData.xml`. -* Camel case is used for the entity name. -* The file name must have the suffix `Data.xml`. - -## Example - -Example (`Magento/Catalog/Test/Mftf/Data/CategoryData.xml` file): - -```xml -<?xml version="1.0" encoding="UTF-8"?> - -<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd"> - <entity name="_defaultCategory" type="category"> - <data key="name" unique="suffix">simpleCategory</data> - <data key="name_lwr" unique="suffix">simplecategory</data> - <data key="is_active">true</data> - </entity> - <entity name="SimpleSubCategory" type="category"> - <data key="name" unique="suffix">SimpleSubCategory</data> - <data key="name_lwr" unique="suffix">simplesubcategory</data> - <data key="is_active">true</data> - <data key="include_in_menu">true</data> - </entity> -</entities> -``` - -This example declares two `<data>` entities: `_defaultCategory` and `SimpleSubCategory`. They set the data required for [category creation][]. - -All entities that have the same name will be merged during test generation. Both entities are of the `category` type. - -`_defaultCategory` sets three data fields: - -* `name` defines the category name as `simpleCategory` with a unique suffix. Example: `simpleCategory598742365`. -* `name_lwr` defines the category name in lowercase format with a unique suffix. Example: `simplecategory697543215`. -* `is_active` sets the enable category to `true`. - -`SimpleSubCategory` sets four data fields: - -* `name` that defines the category name with a unique suffix. Example: `SimpleSubCategory458712365`. -* `name_lwr` that defines the category name in lowercase format with a unique suffix. Example: `simplesubcategory753698741`. -* `is_active` sets the enable category to `true`. -* `include_in_menu` that sets the include in the menu to `true`. - -The following is an example of a call in test: - -```xml -<fillField selector="{{AdminCategoryBasicFieldSection.categoryNameInput}}" userInput="{{_defaultCategory.name}}" stepKey="enterCategoryName"/> -``` - -<!-- {% endraw %} --> - -This action inputs data from the `name` of the `_defaultCategory` entity (for example, `simpleCategory598742365`) into the field with the locator defined in the selector of the `categoryNameInput` element of the `AdminCategoryBasicFieldSection`. - -You can also call data from the xml definition of a `data` tag directly: - -```xml -<entity name="NewAdminUser" type="user"> - <data key="username" unique="suffix">admin</data> - <data key="current_password">{{AnotherUser.current_password}}</data> <!-- Data from another entity --> - <data key="current_password">{{_ENV.MAGENTO_ADMIN_PASSWORD}}</data> <!-- ENV file reference --> -</entity> -``` - -## Reference - -### entities {#entities-tag} - -`<entities>` is an element that contains all `<entity>` elements. - -### entity {#entity-tag} - -`<entity>` is an element that contains `<data>` elements. - -Attributes|Type|Use|Description ----|---|---|--- -`name`|string|optional|Name of the `<entity>`. Use camel case for entity names. -`type`|string|optional|Node containing the exact name of `<entity>` type. Used later to find specific Persistence Layer Model class. `type` in `<data>` can be whatever the user wants; There are no constraints. It is important when persisting data, depending on the `type` given, as it will try to match a metadata definition with the operation being done. Example: A `myCustomer` entity with `type="customer"`, calling `<createData entity="myCustomer"/>`, will try to find a metadata entry with the following attributes: `<operation dataType="customer" type="create">`. -`deprecated`|string|optional|Used to warn about the future deprecation of the data entity. String will appear in Allure reports and console output at runtime. - -`<entity>` may contain one or more [`<data>`][], [`<var>`][], [`<required-entities>`][], or [`<array>`][] elements in any sequence. - -### data {#data-tag} - -`<data>` is an element containing a data/value pair. - -Attributes|Type|Use|Description ----|---|---|--- -`key`|string|optional|Key attribute of data/value pair. -`unique`|enum: `"prefix"`, `"suffix"`|optional|Add suite or test wide unique sequence as "prefix" or "suffix" to the data value if specified. - -Example: - -```xml -<data key="name" unique="suffix">simpleCategory</data> -``` - -### var {#var-tag} - -`<var>` is an element that can be used to grab a key value from another entity. For example, when creating a customer with the `<createData>` action, the server responds with the auto-incremented ID of that customer. Use `<var>` to access that ID and use it in another data entity. - -Attributes|Type|Use|Description ----|---|---|--- -`key`|string|optional|Key attribute of this entity to assign a value to. -`entityType`|string|optional|Type attribute of referenced entity. -`entityKey`|string|optional|Key attribute of the referenced entity from which to get a value. -`unique`|--|--|*This attribute hasn't been implemented yet.* - -Example: - -```xml -<var key="parent_id" entityType="category" entityKey="id" /> -``` - -### requiredEntity {#requiredentity-tag} - -`<requiredEntity>` is an element that specifies the parent/child relationship between complex types. - -Example: You have customer address info. To specify that relationship: - -```xml -<entity name="CustomerEntity" type="customer"> - ... - <requiredEntity type="address">AddressEntity</requiredEntity> - ... -</entity> -``` - -Attributes|Type|Use|Description ----|---|---|--- -`type`|string|optional|Type attribute of `<requiredEntity>`. - -### array {#array-tag} - -`<array>` is an element that contains a reference to an array of values. - -Example: - -```xml -<entity name="AddressEntity" type="address"> - ... - <array key="street"> - <item>7700 W Parmer Ln</item> - <item>Bld D</item> - </array> - ... -</entity> -``` - -Attributes|Type|Use|Description ----|---|---|--- -`key`|string|required|Key attribute of this entity in which to assign a value. - -`<array>` may contain [`<item>`][] elements. - -### item {#item-tag} - -`<item>` is an individual piece of data to be passed in as part of the parent `<array>` type. - -Attributes|Type|Use|Description ----|---|---|--- -`name`|string|optional|Key attribute of <item/> entity in which to assign a value. By default numeric key will be generated. - - -<!-- Link Definitions --> -[`<array>`]: #array-tag -[`<data>`]: #data-tag -[`<item>`]: #item-tag -[`<required-entities>`]: #requiredentity-tag -[`<var>`]: #var-tag -[Actions]: ./test/actions.md -[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/debugging.md b/docs/debugging.md deleted file mode 100644 index be17e952a..000000000 --- a/docs/debugging.md +++ /dev/null @@ -1,37 +0,0 @@ -# Debugging - -Debugging within the Magento Functional Testing Framework is helpful in identifying test bugs by allowing you to pause execution so that you may: - -- Examine the page. -- Check returned data and other variables being used during run-time. - -This is straightforward to do once you create a basic Debug Configuration. - -## Prerequisites - -- [Xdebug][] -- PHPUnit configured for use in [PHPStorm][] - -## Creating Debug Configuration with PHPStorm - -1. If not already installed, download the Codeception Framework plugin for PHPStorm (`PhpStorm->Preferences->Plugins`). -1. Click `Edit Configurations` on the configuration dropdown. -1. Click `+` and select `Codeception` from the available types. -1. Change `Test Scope` to `Type` and select `functional` from the `Type:` dropdown. -1. Find the `Custom Working Directory` option and set the path to your `dev/tests/acceptance/` directory. - -If you get a warning `Path to Codeception for local machine is not configured.`: - -1. Click `Fix`, then `+`, and select `Codeception Local`. -1. Click `...` and locate `/vendor/bin/codecept` in your Magento installation folder. - -The easiest method of tagging a test for debugging is the following: - -- In your Debug configuration, locate `Test Runner options:` and set `--group testDebug`. -- When you want to debug a test you are working on, simply add `<group value="testDebug"/>` to the annotations. Be sure to remove this after done debugging. - -Your Debug Configuration should now be able to run your test and pause execution on any breakpoints you have set in the generated `.php` file under the `_generated` folder. - -<!-- Link definitions --> -[Xdebug]: https://xdebug.org/docs/install -[PHPStorm]: https://www.jetbrains.com/phpstorm/ diff --git a/docs/extending.md b/docs/extending.md deleted file mode 100644 index 576bfdb24..000000000 --- a/docs/extending.md +++ /dev/null @@ -1,342 +0,0 @@ -# Extending - -There are cases when you need to create many tests that are very similar to each other. -For example, only one or two parameters (for example, URL) might vary between tests. -To avoid copy-pasting and to save some time the Magento Functional Testing Framework (MFTF) enables you to extend test components such as [test], [data], and [action group]. -You can create or update any component of the parent body in your new test/action group/entity. - -* A test starting with `<test name="SampleTest" extends="ParentTest">` creates a test `SampleTest` that takes body of existing test `ParentTest` and adds to it the body of `SampleTest`. -* An action group starting with `<actionGroup name="SampleActionGroup" extends="ParentActionGroup">` creates an action group based on the `ParentActionGroup`, but with the changes specified in `SampleActionGroup`. -* An entity starting with `<entity name="SampleEntity" extends="ParentEntity">` creates an entity `SampleEntity` that is equivalent to merging the `SampleEntity` with the `ParentEntity`. - -Specify needed variations for a parent object and produce a copy of the original that incorporates the specified changes (the "delta"). - -<div class="bs-callout bs-callout-info"> -Unlike merging, the parent test (or action group) will still exist after the test generation. -</div> - -<div class="bs-callout-warning" markdown="1"> -<br> -Note: The extended test will be skipped if the parent test is skipped. -</div> - -## Extending tests - -### Update a test step - -<!-- {% raw %} --> - -__Use case__: Create two similar tests with a different action group reference by overwriting a `stepKey`. - -> Test with "extends": - -```xml -<tests> - <test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> - <test name="AdminLoginAsOtherUserSuccessfulTest" extends="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginAsOtherUserActionGroup" stepKey="loginAsAdmin"/> - </test> -</tests> -``` - -> Test without "extends": - -```xml -<tests> - <test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> - <test name="AdminLoginAsOtherUserSuccessfulTest"> - <actionGroup ref="AdminLoginAsOtherUserActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> -</tests> -``` - -### Add a test step - -__Use case__: Create two similar tests where the second test contains two additional steps specified to occur `before` or `after` other `stepKeys`. - -> Tests with "extends": - -```xml -<tests> - <test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> - <test name="AdminLoginCheckRememberMeSuccessfulTest" extends="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminCheckRememberMeActionGroup" stepKey="checkRememberMe" after="loginAsAdmin"/> - <actionGroup ref="AssertAdminRememberMeActionGroup" stepKey="assertRememberMe" before="logoutFromAdmin"/> - </test> -</tests> -``` - -> Tests without "extends": - -```xml -<tests> - <test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> - <test name="AdminLoginCheckRememberMeSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AdminCheckRememberMeActionGroup" stepKey="checkRememberMe"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AssertAdminRememberMeActionGroup" stepKey="assertRememberMe"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> -</tests> -``` - -### Update a test before hook - -__Use case__: Create two similar tests where the second test contains an additional action in the `before` hook. - -> Tests with "extends": - -```xml -<tests> - <test name="AdminLoginSuccessfulTest"> - <before> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - </before> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> - <test name="AdminLoginCheckRememberMeSuccessfulTest" extends="AdminLoginSuccessfulTest"> - <before> - <actionGroup ref="AdminCheckRememberMeActionGroup" stepKey="checkRememberMe" after="loginAsAdmin"/> - </before> - </test> -</tests> -``` - -> Tests without "extends": - -```xml -<tests> - <test name="AdminLoginSuccessfulTest"> - <before> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - </before> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> - <test name="AdminLoginCheckRememberMeSuccessfulTest"> - <before> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AdminCheckRememberMeActionGroup" stepKey="checkRememberMe"/> - </before> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> -</tests> -``` - -## Extending action groups - -Extend an [action group] to add or update [actions] in your module. - -### Update an action - -__Use case__: The `AssertAdminCountProductActionGroup` action group counts the particular product. -Modify the action group to use another product. - -> Action groups with "extends": - -```xml -<actionGroups> - <actionGroup name="AssertAdminCountProductActionGroup"> - <arguments> - <argument name="count" type="string"/> - </arguments> - <grabMultiple selector="selectorForProductA" stepKey="grabProducts"/> - <assertCount stepKey="assertCount"> - <expectedResult type="int">{{count}}</expectedResult> - <actualResult type="variable">grabProducts</actualResult> - </assertCount> - </actionGroup> - - <actionGroup name="AssertAdminOtherCountProductActionGroup" extends="AssertAdminCountProductActionGroup"> - <grabMultiple selector="selectorForProductB" stepKey="grabProducts"/> - </actionGroup> -</actionGroups> -``` - -> Action groups without "extends": - -```xml -<actionGroups> - <actionGroup name="AssertAdminCountProductActionGroup"> - <arguments> - <argument name="count" type="string"/> - </arguments> - <grabMultiple selector="selectorForProductA" stepKey="grabProducts"/> - <assertCount stepKey="assertCount"> - <expectedResult type="int">{{count}}</expectedResult> - <actualResult type="variable">grabProducts</actualResult> - </assertCount> - </actionGroup> - - <actionGroup name="AssertAdminOtherCountProductActionGroup"> - <arguments> - <argument name="count" type="string"/> - </arguments> - <grabMultiple selector="selectorForProductB" stepKey="grabProducts"/> - <assertCount stepKey="assertCount"> - <expectedResult type="int">{{count}}</expectedResult> - <actualResult type="variable">grabProducts</actualResult> - </assertCount> - </actionGroup> -</actionGroups> -``` - -### Add an action - -__Use case__: The `AdminGetProductCountActionGroup` action group returns the count of products. -Add a new test `AssertAdminVerifyProductCountActionGroup` that asserts the count of products: - -> Action groups with "extends": - -```xml -<actionGroups> - <actionGroup name="AdminGetProductCountActionGroup"> - <arguments> - <argument name="productSelector" type="string"/> - </arguments> - <grabMultiple selector="{{productSelector}}" stepKey="grabProducts"/> - </actionGroup> - - <actionGroup name="AssertAdminVerifyProductCountActionGroup" extends="AdminGetProductCountActionGroup"> - <arguments> - <argument name="count" type="string"/> - </arguments> - <assertCount stepKey="assertCount" after="grabProducts"> - <expectedResult type="int">{{count}}</expectedResult> - <actualResult type="variable">grabProducts</actualResult> - </assertCount> - </actionGroup> -</actionGroups> -``` - -> Action groups without "extends": - -```xml -<actionGroups> - <actionGroup name="AdminGetProductCountActionGroup"> - <arguments> - <argument name="productSelector" type="string"/> - </arguments> - <grabMultiple selector="{{productSelector}}" stepKey="grabProducts"/> - </actionGroup> - - <actionGroup name="AssertAdminVerifyProductCountActionGroup"> - <arguments> - <argument name="count" type="string"/> - <argument name="productSelector" type="string"/> - </arguments> - <grabMultiple selector="{{productSelector}}" stepKey="grabProducts"/> - <assertCount stepKey="assertCount"> - <expectedResult type="int">{{count}}</expectedResult> - <actualResult type="variable">grabProducts</actualResult> - </assertCount> - </actionGroup> -</actionGroups> -``` - -<!-- {% endraw %} --> - -## Extending data - -Extend data to reuse entities in your module. - -### Update a data entry - -__Use case__: Create an entity named `DivPanelGreen`, which is similar to the `DivPanel` entity, except that it is green. - -> Entities with "extends": - -```xml -<entities> - <entity name="DivPanel"> - <data key="divColor">Red</data> - <data key="divSize">80px</data> - <data key="divWidth">100%</data> - </entity> - <entity name="DivPanelGreen" extends="DivPanel"> - <data key="divColor">Green</data> - </entity> -</entities> -``` - -> Entities without "extends": - -```xml -<entities> - <entity name="DivPanel"> - <data key="divColor">Red</data> - <data key="divSize">80px</data> - <data key="divWidth">100%</data> - </entity> - <entity name="DivPanelGreen" extends="DivPanel"> - <data key="divColor">Green</data> - <data key="divSize">80px</data> - <data key="divWidth">100%</data> - </entity> -</entities> -``` - -### Add a data entry - -__Use case__: Create an entity named `DivPanelGreen`, which is similar to the `DivPanel` entity, except that it has a specific panel color. - -> Entities with "extends": - -```xml -<entities> - <entity name="DivPanel"> - <data key="divColor">Red</data> - <data key="divSize">80px</data> - <data key="divWidth">100%</data> - </entity> - <entity name="DivPanelGreen" extends="DivPanel"> - <data key="divColor">#000000</data> - <data key="AttributeHidden">True</data> - </entity> -</entities> -``` - -> Entities without "extends": - -```xml -<entities> - <entity name="DivPanel"> - <data key="divColor">Red</data> - <data key="divSize">80px</data> - <data key="divWidth">100%</data> - </entity> - <entity name="DivPanelGreen" extends="DivPanel"> - <data key="divColor">#000000</data> - <data key="divSize">80px</data> - <data key="divWidth">100%</data> - <data key="AttributeHidden">True</data> - </entity> -</entities> -``` - -<!-- Link definitions --> -[test]: ./test.md -[data]: ./data.md -[action group]: ./test/action-groups.md -[actions]: ./test/actions.md diff --git a/docs/getting-started.md b/docs/getting-started.md deleted file mode 100644 index 87cb04f79..000000000 --- a/docs/getting-started.md +++ /dev/null @@ -1,368 +0,0 @@ -# Getting started - -<div class="bs-callout bs-callout-info" markdown="1"> -[Find your version] of MFTF. -The latest Magento 2.3.x release supports MFTF 2.6.4. -The latest Magento 2.2.x release supports MFTF 2.5.3. -</div> - -## Prepare environment {#prepare-environment} - -Make sure that you have the following software installed and configured on your development environment: - -- [PHP version supported by the Magento instance under test][php] -- [Composer 1.3 or later][composer] -- [Java 1.8 or later][java] -- [Selenium Server Standalone 3.1 or later][selenium server] and [ChromeDriver 2.33 or later][chrome driver] or other webdriver in the same directory - -<div class="bs-callout bs-callout-tip" markdown="1"> -[PhpStorm] supports [Codeception test execution][], which is helpful when debugging. -</div> - -## Install Magento {#install-magento} - -Use instructions below to install Magento. - -### Step 1. Clone the `magento2` source code repository {#clone-magento} - -```bash -git clone https://github.com/magento/magento2.git -``` - -or - -```bash -git clone git@github.com:magento/magento2.git -``` - -### Step 2. Install dependencies {#install-dependencies} - -Checkout the Magento version that you are going to test. - -```bash -cd magento2/ -``` - -```bash -git checkout 2.4-develop -``` - -Install the Magento application. - -```bash -composer install -``` - -## Prepare Magento {#prepare-magento} - -Configure the following settings in Magento as described below. - -### WYSIWYG settings {#wysiwyg-settings} - -A Selenium web driver cannot enter data to fields with WYSIWYG. - -To disable the WYSIWYG and enable the web driver to process these fields as simple text areas: - -1. Log in to the Magento Admin as an administrator. -2. Navigate to **Stores** > **Settings** > **Configuration** > **General** > **Content Management**. -3. In the WYSIWYG Options section set the **Enable WYSIWYG Editor** option to **Disabled Completely**. -4. Click **Save Config**. - -or via command line: - -```bash -bin/magento config:set cms/wysiwyg/enabled disabled -``` - -Clean the cache after changing the configuration values: - -```bash -bin/magento cache:clean config full_page -``` - -<div class="bs-callout bs-callout-tip"> -When you want to test the WYSIWYG functionality, re-enable WYSIWYG in your test suite. -</div> - -### Security settings {#security-settings} - -To enable the **Admin Account Sharing** setting, to avoid unpredictable logout during a testing session, and disable the **Add Secret Key in URLs** setting, to open pages using direct URLs: - -1. Navigate to **Stores** > **Settings** > **Configuration** > **Advanced** > **Admin** > **Security**. -2. Set **Admin Account Sharing** to **Yes**. -3. Set **Add Secret Key to URLs** to **No**. -4. Click **Save Config**. - -or via command line: - -```bash -bin/magento config:set admin/security/admin_account_sharing 1 -``` - -```bash -bin/magento config:set admin/security/use_form_key 0 -``` - -Clean the cache after changing the configuration values: - -```bash -bin/magento cache:clean config full_page -``` - -### Testing with the Magento Two-Factor Authentication (2FA) extension {#2fa} - -If the Magento instance under test has the [Magento Two-Factor Authentication (2FA) extension][] installed and enabled, additional configurations is needed to run MFTF tests. Learn more in [Configure MFTF for Magento with Two-Factor Authentication (2FA)](./configure-2fa.md). - -### Webserver configuration {#web-server-configuration} - -MFTF does not support executing CLI commands if your web server points to `<MAGE_ROOT_DIR>/pub` directory as recommended in the [Installation Guide][Installation Guide docroot]. For MFTF to execute the CLI commands, the web server must point to the Magento root directory. - -### Nginx settings {#nginx-settings} - -If the Nginx Web server is used on your development environment, then **Use Web Server Rewrites** setting in **Stores** > Settings > **Configuration** > **General** > **Web** > **Search Engine Optimization** must be set to **Yes**. - -Or via command line: - -```bash -bin/magento config:set web/seo/use_rewrites 1 -``` - -You must clean the cache after changing the configuration values: - -```bash -bin/magento cache:clean config full_page -``` - -To be able to run Magento command line commands in tests, add the following location block to the Nginx configuration file in the Magento root directory: - -```conf -location ~* ^/dev/tests/acceptance/utils($|/) { - root $MAGE_ROOT; - location ~ ^/dev/tests/acceptance/utils/command.php { - fastcgi_pass fastcgi_backend; - fastcgi_index index.php; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - include fastcgi_params; - } -} -``` - -## Set up an embedded MFTF {#setup-framework} - -This is the default setup of MFTF that you would need to cover your Magento project with functional tests. -It installs the framework using an existing Composer dependency such as `magento/magento2-functional-testing-framework`. -If you want to set up MFTF as a standalone tool, refer to [Set up a standalone MFTF][]. - -Install MFTF. - -```bash -composer install -``` - -### Step 1. Build the project {#build-project} - -In the Magento project root, run: - -```bash -vendor/bin/mftf build:project -``` - -If you use PhpStorm, generate a URN catalog: - -```bash -vendor/bin/mftf generate:urn-catalog .idea/misc.xml -``` - -If the file does not exist, add the `--force` option to create it: - -```bash -vendor/bin/mftf generate:urn-catalog --force .idea/misc.xml -``` - -See [`generate:urn-catalog`][] for more details. - -<div class="bs-callout bs-callout-tip" markdown="1"> -You can simplify command entry by adding the absolute path to the `vendor/bin` directory path to your PATH environment variable. -After adding the path, you can run `mftf` without having to include `vendor/bin`. -</div> - -### Step 2. Edit environmental settings {#environment-settings} - -In the `magento2/dev/tests/acceptance/` directory, edit the `.env` file to match your system. - -```bash -vim dev/tests/acceptance/.env -``` - -Specify the following parameters, which are required to launch tests: - -- `MAGENTO_BASE_URL` must contain a domain name of the Magento instance that will be tested. - Example: `MAGENTO_BASE_URL=http://magento.test` - -- `MAGENTO_BACKEND_NAME` must contain the relative path for the Admin area. - Example: `MAGENTO_BACKEND_NAME=admin` - -- `MAGENTO_ADMIN_USERNAME` must contain the username required for authorization in the Admin area. - Example: `MAGENTO_ADMIN_USERNAME=admin` - -- `MAGENTO_ADMIN_PASSWORD` must now be set up in the credentials file. See [Credentials Page][] for details. - -<div class="bs-callout bs-callout-info" markdown="1"> -If the `MAGENTO_BASE_URL` contains a subdirectory like `http://magento.test/magento2ce`, specify `MAGENTO_CLI_COMMAND_PATH`. -</div> - -Learn more about environmental settings in [Configuration][]. - -### Step 3. Enable the Magento CLI commands - -In the Magento project root, run the following command to enable MFTF to send Magento CLI commands to your Magento instance. - - ```bash -cp dev/tests/acceptance/.htaccess.sample dev/tests/acceptance/.htaccess -``` - -### Step 4. Generate and run tests {#run-tests} - -To run tests, you need a running Selenium server and [`mftf`][] commands. - -#### Run the Selenium server {#selenium-server} - -Run the Selenium server in the terminal. -For example, the following commands download and run the Selenium server for Google Chrome: - -```bash -curl -O http://selenium-release.storage.googleapis.com/3.14/selenium-server-standalone-3.14.0.jar -``` - -```bash -java -Dwebdriver.chrome.driver=chromedriver -jar selenium-server-standalone-3.14.0.jar -``` - -#### Generate and run all tests {#run-all-tests} - -```bash -vendor/bin/mftf generate:tests -``` - -```bash -vendor/bin/codecept run functional -c dev/tests/acceptance/codeception.yml -``` - -See more commands in [`codecept`][]. - -#### Run a simple test {#run-test} - -To clean up the previously generated tests, and then generate and run a single test `AdminLoginSuccessfulTest`, run: - -```bash -vendor/bin/mftf run:test AdminLoginSuccessfulTest --remove -``` - -See more commands in [`mftf`][]. - -### Step 5. Generate reports {#reports} - -During testing, MFTF generates test reports in CLI. You can generate visual representations of the report data using the [Allure Framework][]. To view the reports in a GUI: - -- [Install Allure][] -- Run the tool to serve the artifacts in `dev/tests/acceptance/tests/_output/allure-results/`: - -```bash -allure serve dev/tests/acceptance/tests/_output/allure-results/ -``` - -Learn more about Allure in the [official documentation][allure docs]. - -## Set up a standalone MFTF - -MFTF is a root level Magento dependency, but it is also available for use as a standalone application. You may want to use a standalone application when you develop for or contribute to MFTF, which facilitates debugging and tracking changes. These guidelines demonstrate how to set up and run Magento acceptance functional tests using standalone MFTF. - -### Prerequisites - -This installation requires a local instance of the Magento application. -MFTF uses the [tests from Magento modules][mftf tests] as well as the `app/autoload.php` file. - -### Step 1. Clone the MFTF repository - -If you develop or contribute to MFTF, it makes sense to clone your fork of the MFTF repository. -For contribution guidelines, refer to the [Contribution Guidelines for the Magento Functional Testing Framework][contributing]. - -### Step 2. Install the MFTF - -```bash -cd magento2-functional-testing-framework -``` - -```bash -composer install -``` - -### Step 3. Build the project - -```bash -bin/mftf build:project -``` - -### Step 4. Edit environment settings - -In the `dev/.env` file, define the [basic configuration][] and [`MAGENTO_BP`][] parameters. - -### Step 5. Enable the Magento CLI commands {#add-cli-commands} - -Copy the `etc/config/command.php` file into your Magento installation at `<magento root directory>/dev/tests/acceptance/utils/`. -Create the `utils/` directory, if you didn't find it. - -### Step 6. Remove the MFTF package dependency in Magento - -MFTF uses the Magento `app/autoload.php` file to read Magento modules. -The MFTF dependency in Magento supersedes the standalone registered namespaces unless it is removed at a Composer level. - -```bash -composer remove magento/magento2-functional-testing-framework --dev -d <path to the Magento root directory> -``` - -### Step 7. Run a simple test - -Generate and run a single test that will check your logging to the Magento Admin functionality: - -```bash -bin/mftf run:test AdminLoginSuccessfulTest -``` - -You can find the generated test at `dev/tests/functional/tests/MFTF/_generated/default/`. - -### Step 8. Generate Allure reports - -The standalone MFTF generates Allure reports at `dev/tests/_output/allure-results/`. -Run the Allure server pointing to this directory: - -```bash -allure serve dev/tests/_output/allure-results/ -``` - -<!-- Link definitions --> - -[`codecept`]: commands/codeception.html -[`generate:urn-catalog`]: commands/mftf.html#generateurn-catalog -[`MAGENTO_BP`]: configuration.html#magento_bp -[`mftf`]: commands/mftf.html -[allure docs]: https://docs.qameta.io/allure/ -[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/ -[composer]: https://getcomposer.org/download/ -[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]: https://www.oracle.com/java/technologies/downloads/ -[mftf tests]: introduction.html#mftf-tests -[php]: https://devdocs.magento.com/guides/v2.4/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 -[test suite]: suite.html -[Find your version]: introduction.html#find-your-mftf-version -[Installation Guide docroot]: https://devdocs.magento.com/guides/v2.4/install-gde/tutorials/change-docroot-to-pub.html -[Magento Two-Factor Authentication (2FA) extension]: https://devdocs.magento.com/guides/v2.4/security/two-factor-authentication.html -[Credentials Page]: https://devdocs.magento.com/mftf/docs/credentials.html diff --git a/docs/guides/action-groups.md b/docs/guides/action-groups.md deleted file mode 100644 index 30c531e4e..000000000 --- a/docs/guides/action-groups.md +++ /dev/null @@ -1,82 +0,0 @@ -# Action Group Best Practices - -We strive to write tests using only action groups. Fortunately, we have built up a large set of action groups to get started. We can make use of them and extend them for our own specific needs. In some cases, we may never even need to write action groups of our own. We may be able to simply chain together calls to existing action groups to implement our new test case. - -## Why use Action Groups? - -Action groups simplify maintainability by reducing duplication. Because they are re-usable building blocks, odds are that they are already made use of by existing tests in the Magento codebase. This proves their stability through real-world use. Take for example, the action group named `LoginAsAdmin`: - -```xml -<actionGroup name="LoginAsAdmin"> - <annotations> - <description>Login to Backend Admin using provided User Data. PLEASE NOTE: This Action Group does NOT validate that you are Logged In.</description> - </annotations> - <arguments> - <argument name="adminUser" type="entity" defaultValue="DefaultAdminUser"/> - </arguments> - - <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/> - <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{adminUser.username}}" stepKey="fillUsername"/> - <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{adminUser.password}}" stepKey="fillPassword"/> - <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickLogin"/> - <closeAdminNotification stepKey="closeAdminNotification"/> -</actionGroup> -``` - -Logging in to the admin panel is one of the most used action groups. It is used around 1,500 times at the time of this writing. - -Imagine if this was not an action group and instead we were to copy and paste these 5 actions every time. In that scenario, if a small change was needed, it would require a lot of work. But with the action group, we can make the change in one place. - -## How to extend action groups - -Again using `LoginAsAdmin` as our example, we trim away metadata to clearly reveal that this action group performs 5 actions: - -```xml -<actionGroup name="LoginAsAdmin"> - ... - <amOnPage url="{{AdminLoginPage.url}}" .../> - <fillField selector="{{AdminLoginFormSection.username}}" .../> - <fillField selector="{{AdminLoginFormSection.password}}" .../> - <click selector="{{AdminLoginFormSection.signIn}}" .../> - <closeAdminNotification .../> -</actionGroup> -``` - -This works against the standard Magento admin panel login page. Bu imagine we are working on a Magento extension that adds a CAPTCHA field to the login page. If we create and activate this extension and then run all existing tests, we can expect almost everything to fail because the CAPTCHA field is left unfilled. - -We can overcome this by making use of MFTF's extensibility. All we need to do is to provide a "merge" that modifies the existing `LoginAsAdmin` action group. Our merge file will look like: - -```xml -<actionGroup name="LoginAsAdmin"> - <fillField selector="{{CaptchaSection.captchaInput}}" before="signIn" .../> -</actionGroup> -``` - -Because the name of this merge is also `LoginAsAdmin`, the two get merged together and an additional step happens everytime this action group is used. - -To continue this example, imagine someone else is working on a 'Two-Factor Authentication' extension and they also provide a merge for the `LoginAsAdmin` action group. Their merge looks similar to what we have already seen. The only difference is that this time we fill a different field: - -```xml -<actionGroup name="LoginAsAdmin"> - <fillField selector="{{TwoFactorSection.twoFactorInput}}" before="signIn" .../> -</actionGroup> -``` - -Bringing it all together, our resulting `LoginAsAdmin` action group becomes this: - -```xml -<actionGroup name="LoginAsAdmin"> - ... - <amOnPage url="{{AdminLoginPage.url}}" .../> - <fillField selector="{{AdminLoginFormSection.username}}" .../> - <fillField selector="{{AdminLoginFormSection.password}}" .../> - <fillField selector="{{CaptchaSection.captchaInput}}" .../> - <fillField selector="{{TwoFactorSection.twoFactorInput}}" .../> - <click selector="{{AdminLoginFormSection.signIn}}" .../> - <closeAdminNotification .../> -</actionGroup> -``` - -No one file contains this exact content as above, but instead all three files come together to form this action group. - -This extensibility can be applied in many ways. We can use it to affect existing Magento entities such as tests, action groups, and data. Not so obvious is that this tehcnique can be used within your own entities to make them more maintainable as well. diff --git a/docs/guides/cicd.md b/docs/guides/cicd.md deleted file mode 100644 index 80cf134d8..000000000 --- a/docs/guides/cicd.md +++ /dev/null @@ -1,114 +0,0 @@ -# How to use MFTF in CICD - -To integrate MFTF tests into your CICD pipeline, it is best to start with the conceptual flow of the pipeline code. - -## Concept - -The overall workflow that tests should follow is: - -- Obtain a Magento instance + install pre-requisites. -- Generate the tests. - - Set options for single or parallel running. -- Delegate and run tests and gather test-run artifacts. - - Re-run options. -- Generate the Allure reports from the results. - -## Obtain a Magento instance - -To start, we need a Magento instance to operate against for test generation and execution. - -```bash -git clone https://github.com/magento/magento2 -``` - -or - -```bash -composer create-project --repository=https://repo.magento.com/ magento/project-community-edition magento2ce -``` - -For more information on installing magento see [Install Magento using Composer][]. - -After installing the Magento instance, set a couple of configurations to the Magento instance: - -```bash -bin/magento config:set general/locale/timezone America/Los_Angeles -bin/magento config:set admin/security/admin_account_sharing 1 -bin/magento config:set admin/security/use_form_key 0 -bin/magento config:set cms/wysiwyg/enabled disabled -``` - -These set the default state of the Magento instance. If you wish to change the default state of the application (and have updated your tests sufficiently to account for it), this is the step to do it. - -If your magento instance has Two-Factor Authentication enabled, see [Configure 2FA][] to configure MFTF tests. - -## Install Allure - -This is required for generating the report after your test runs. See [Allure][] for details. - -## Generate tests - -### Single execution - -Generate tests based on what you want to run: - -```bash -vendor/bin/mftf generate:tests -``` - -This will generate all tests and a single manifest file under `dev/tests/acceptance/tests/functional/Magento/_generated/testManifest.txt`. - -### Parallel execution - -To generate all tests for use in parallel nodes: - -```bash -vendor/bin/mftf generate:tests --config parallel -``` - -This generates a folder under `dev/tests/acceptance/tests/functional/Magento/_generated/groups`. This folder contains several `group#.txt` files that can be used later with the `mftf run:manifest` command. - -## Delegate and run tests - -### Single execution - -If you are running on a single node, call: - -```bash -vendor/bin/mftf run:manifest dev/tests/acceptance/tests/functional/Magento/_generated/testManifest.txt -``` - -### Parallel execution - -You can optimize your pipeline by running tests in parallel across multiple nodes. - -Tests can be split up into roughly equal running groups using `--config parallel`. - -You do not want to perform installations on each node again and build it. So, to save time, stash pre-made artifacts from earlier steps and un-stash on the nodes. - -The groups can be then distributed on each of the nodes and run separately in an isolated environment. - -- Stash artifacts from main node and un-stash on current node. -- Run `vendor/bin/mftf run:manifest <current_group.txt>` on current node. -- Gather artifacts from `dev/tests/acceptance/tests/_output` from current node to main node. - -### Rerun options - -In either single or parallel execution, to re-run failed tests, simply add the `run:failed` command after executing a manifest: - -```bash -vendor/bin/mftf run:failed -``` - -### Generate Allure report - -In the main node, generate reports using your `<path_to_results>` into a desired output path: - -```bash -allure generate <path_to_results> -c -o <path_to_output> -``` - -<!-- Link definitions --> -[Install Magento using Composer]: https://devdocs.magento.com/guides/v2.4/install-gde/composer.html -[Configure 2FA]: ../configure-2fa.md -[Allure]: https://docs.qameta.io/allure/ diff --git a/docs/guides/git-vs-composer-install.md b/docs/guides/git-vs-composer-install.md deleted file mode 100644 index fd9006cc1..000000000 --- a/docs/guides/git-vs-composer-install.md +++ /dev/null @@ -1,83 +0,0 @@ -# Git vs Composer installation of Magento with MFTF - -Depending on how you plan to use Magnto code, there are different options for installing Magento. - -## GitHub Installation - -If you are contributing a pull request to the Magento 2 codebase, download Magento 2 from our GitHub repository. Contribution to the codebase is done using the 'fork and pull' model where contributors maintain their own fork of the repo. This repo is then used to submit a pull request to the base repo. - -Install guide: [GitHub Installation][] - -## Composer based Installation - -A Composer install downloads released packages of Magento 2 from the composer repo [https://repo.magento.com](https://repo.magento.com). - -All Magento modules and their MFTF tests are put under `<vendor>` directory, for convenience of 3rd party developers. With this setup, you can keep your custom modules separate from core modules. You can also develop modules in a separate VCS repository and add them to your `composer.json` which installs them into the `vendor` directory. - -Install guide: [Composer based Installation][] - -## MFTF Installation - -After installing your Magento project in either of the above ways, the composer dependency `magento/magento2-functional-testing-framework` downloads and installs MFTF. MFTF is embedded in your Magento 2 installation and will cover your project with functional tests. - -If you want to contribute a pull request into MFTF codebase, you will need to install MFTF in the [Standalone][] mode. - -## Managing modules - Composer vs GitHub - -### Via GitHub - -Cloning the Magento 2 git repository is a way of installing where you do not have to worry about matching your codebase with production. Your version control system generally holds and manages your `app/code` folder and you can do manual, ad-hoc development here. - -### Via Composer - -Magento advocates the use of composer for managing modules. When you install a module through composer, it is added to `vendor/<vendor-name>/<module>`. - -When developing your own module or adding MFTF tests to a module, you should not edit in `vendor` because a composer update could overwrite your changes. Instead, overwrite a module under `vendor` by adding files or cloning your module-specific Git repo to `app/code/<vendor-name>/<module>`. - -To distribute the module and its tests, you can initialize a git repo and create a [composer package][]. In this way others will be able to download and install your module and access your tests as a composer package, in their `<vendor>` folder. - -## MFTF test materials location - -- For GitHub installations, MFTF test materials are located in `<magento_root>/app/code/<vendor_name>/<module_name>/Test/Mftf/`. This is the directory for new tests or to maintain existing ones. -- For Composer-based installations, MFTF test materials are located at `<magento_root>/vendor/<vendor_name>/<module_name>/Test/Mftf/`. This is the directory to run tests fetched by Composer. - -The file structure under both paths is the same: - -```tree -<Path> -├── ActionGroup -│   └── ... -├── Data -│   └── ... -├── Metadata -│   └── ... -├── Page -│   └── ... -├── Section -│   └── ... -├── Suite -│   └── ... -└── Test - └── ... -``` - -## How ModuleResolver reads modules - -With either type of installation, all tests and test data are read and merged by MFTF's ModuleResolver in this order: - -1. `<magento_root>/app/code/<vendor_name>/<module_name>/Test/Mftf/` -1. `<magento_root>/vendor/<vendor_name>/<module_name>/Test/Mftf/` -1. `<magento_root>/dev/tests/acceptance/tests/functional/<vendor_name>/<module_name>/` - -## Conclusion - -There is no difference between having the test materials in `app/code` or in `/vendor`: it works the same. Composer-based installs may benefit teams when there is a need to match file systems in `development` and `production`. - -If you are a contributing developer with an understanding of Git and Composer commands, you can choose the GitHub installation method instead. - -<!-- Link definitions --> - -[Composer based Installation]: https://devdocs.magento.com/guides/v2.3/install-gde/composer.html -[GitHub Installation]: https://devdocs.magento.com/guides/v2.3/install-gde/prereq/dev_install.html -[Standalone]: ../getting-started.html#set-up-a-standalone-mftf -[composer package]: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/package/package_module.html diff --git a/docs/guides/selectors.md b/docs/guides/selectors.md deleted file mode 100644 index d1441865a..000000000 --- a/docs/guides/selectors.md +++ /dev/null @@ -1,346 +0,0 @@ -# How To write good selectors - -Selectors are the atomic unit of test writing. They fit into the hierarchy like this: MFTF tests make use of action groups > which are made up of actions > which interact with page objects > which contain elements > which are specified by selectors. Because they are fundamental building blocks, we must take care when writing them. - -## What is a selector? - -A "selector" works like an address to an element in the Document Object Model (DOM). It specifies page elements and allows MFTF to interact with them. -By 'element' we mean things such as input fields, buttons, tables, divs, etc. -By 'interact' we mean actions such as click, fill field, etc. - -Selectors live inside of MFTF page objects and are meant to be highly re-usable amongst all tests. They can be written in either CSS or XPath. - -## Why are good selectors important? - -Good selectors are important because they are the most re-used component of functional testing. They are the lowest building blocks of tests; the foundation. If they are unstable then everything else built on top of them will inherit that instability. - -## How do I write good selectors? - -We could cover this subject with an infinite amount of documentation and some lessons only come from experience. This guide explains some DOs and DONTs to help you along the way towards selector mastery. - -### Inspecting the DOM - -To write a selector you need to be able to see the DOM and find the element within it. Fortunately you do not have to look at the entire DOM every time. Nor do you have to read it from top to bottom. Instead you can make use of your browsers built-in developer tools or go a step further and try out some popular browser extensions. - -See these links for more information about built-in browser developer tools: - -* [Chrome Developer Tools](https://developers.google.com/web/tools/chrome-devtools/) -* [Firefox Developer Tools](https://developer.mozilla.org/en-US/docs/Tools) - -See these links for common browser addons that may offer advantages over browser developer tools: - -* [Live editor for CSS, Less & Sass - Magic CSS](https://chrome.google.com/webstore/detail/live-editor-for-css-less/ifhikkcafabcgolfjegfcgloomalapol?hl=en) -* [XPath Helper](https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl?hl=en) - -### CSS vs XPath - -There are similarities and differences between CSS and XPath. Both are powerful and complex in ways that are outside of the scope of this document. -In general: - -* CSS is more stable, easier to read, and easier to maintain (typically). -* XPath provides several powerful tools and it has been around the longest so it is well documented. -* XPath can be less stable and potentially unsupported by certain actions in Selenium. - -### Priority - -The best and most simple selector will always be to use an element ID: `#some-id-here`. If only we were so lucky to have this every time. - -When writing selectors, you should prioritize finding in this order: - -1. ID, name, class, or anything else that is unique to the element -2. Complex CSS selectors -3. XPath selectors -4. If none of the above work for you, then the last resort is to ask a developer to add a unique ID or class to the element you are trying to select. - -We suggest the use of CSS selectors above XPath selectors when possible. - -### Writing proper selectors - -There are correct ways of writing selectors and incorrect ways. These suggestions will help you write better selectors. - -#### Incorrect - copy selector/xpath - -DO NOT right click on an element in your browser developer tools and select "Copy selector" or "Copy XPath" and simply use that as your selector. These auto-generated selectors are prime examples of what not to do. - -These are bad: - -```css -#html-body > section > div > div > div > div -``` - -```xpath -//*[@id='html-body']/section/div/div/div/div -``` - -Both include unnecessary hierarchical details. As written, we are looking for a `div` inside of a `div` inside of a `div` inside of... you get the picture. If an application developer adds another `div` parent tomorrow, for whatever reason, this selector will break. Furthermore, when reading it, it is not clear what the intended target is. It may also grab other elements that were not intended. - -#### Do not be too general - -DO NOT make your selectors too generic. If a selector is too generic, there is a high probability that it will match multiple elements on the page. Maybe not today, but perhaps tomorrow when the application being tested changes. - -These are bad: - -```html -input[name*='firstname'] -``` - -The `*=` means `contains`. The selector is saying 'find an input whose name contains the string "firstname"'. But if a future change adds a new element to the page whose name also contains "firstname", then this selector will match two elements and that is bad. - -```css -.add -``` - -Similarly here, this will match all elements which contains the class `.add`. This is brittle and susceptible to breaking when new elements/styles are added to the page. - -#### Avoid being too specific - -DO NOT make your selectors too specific either. If a selector is too specific, there is a high probability that it will break due to even minor changes to the application being tested. - -These are bad: - -```css -#container .dashboard-advanced-reports .dashboard-advanced-reports-description .dashboard-advanced-reports-title -``` - -This selector is too brittle. It would break very easily if an application developer does something as simple as adding a parent container for style reasons. - -```xpath -//*[@id='container']/*[@class='dashboard-advanced-reports']/*[@class='dashboard-advanced-reports-description']/*[@class='dashboard-advanced-reports-title'] -``` - -This is the same selector as above, but represented in XPath instead of CSS. It is brittle for the same reasons. - -#### XPath selectors should not use @attribute="foo" - -This XPath is fragile. It would fail if the attribute was `attribute="foo bar"`. Instead you should use `contains(@attribute, "foo")` where @attribute is any valid attribute such as @text or @class. - -#### CSS and XPath selectors should avoid making use of hardcoded indices - -Hardcoded values are by definition not flexible. A hardcoded index may change if new code is introduced. Instead, parameterize the selector. - -GOOD: .foo:nth-of-type({{index}}) - -BAD: .foo:nth-of-type(1) - -GOOD: button[contains(@id, "foo")][{{index}}] - -BAD: button[contains(@id, "foo")][1] - -GOOD: #actions__{{index}}__aggregator - -BAD: #actions__1__aggregator - -#### CSS and XPath selectors MUST NOT reference the @data-bind attribute - -The @data-bind attribute is used by KnockoutJS, a framework Magento uses to create dynamic Javascript pages. Since this @data-bind attribute is tied to a specific framework, it should not be used for selectors. If Magento decides to use a different framework then these @data-bind selectors would break. - -#### Use isolation - -You should think in terms of "isolation" when writing new selectors. - -For example, say you have a login form that contains a username field, a password field, and a 'Sign In' button. First isolate the parent element. Perhaps it's `#login-form`. Then target the child element under that parent element: `.sign-in-button` The result is `#login-form .sign-in-button`. - -Using isolation techniques reduces the amount of DOM that needs to be processed. This makes the selector both accurate and efficient. - -#### Use advanced notation - -If you need to interact with the parent element but it is too generic, and the internal contents are unique then you need to: - -1. Target the unique internal contents first. -1. Then jump to the parent element using `::parent`. - -Imagine you want to find a table row that contains the string "Jerry Seinfeld". You can use the following XPath selector: - -```xpath -//div[contains(text(), 'Jerry Seinfeld')]/parent::td/parent::tr -``` - -Note in this instance that CSS does not have an equivalent to `::parent`, so XPath is a better choice. - -### CSS Examples - -Examples of common HTML elements and the corresponding selector to find that element in the DOM: - -Type|HTML|Selector ----|---|--- -IDs|`<div id="idname"/>`|`#idname` -Classes|`<div class="classname"/>`|`.classname` -HTML Tags|`<div/>`|`div` -HTML Tag & ID|`<div id="idname"/>`|`div#idname` -HTML Tag & Class|`<div class="classname"/>`|`div.classname` -ID & Class|`<div id="idname" class="classname"/>`|`#idname.classname` -HTML Tag & ID & Class|`<div id="idname" class="classname"/>`|`div#idname.classname` - -Examples of common CSS selector operators and their purpose: - -Symbol|Name|Purpose|Selector ----|---|---|--- -`*`|Universal Selector|Allows you to select ALL ELEMENTS on the Page. Wild Card.|`*` -Whitespace|Descendant Combinator|Allows you to combine 2 or more selectors.|`#idname .classname` -`>`|Child Combinator|Allows you to select the top-level elements THAT FOLLOWS another specified element.|`#idname > .classname` -`+`|Adjacent Sibling Combinator|Allows you to select an element THAT FOLLOWS DIRECTLY AFTER another specified element.|`#idname + .classname` -`~`|General Sibling Combinator|Allows you to select an element THAT FOLLOWS (directly or indirectly) another specified element.|`#idname ~ .classname` - -Examples of CSS attribute operators and their purpose: - -Symbol|Purpose|Example ----|---|--- -`=`|Returns all elements that CONTAIN the EXACT string in the value.|`[attribute='value']` -`*=`|Returns all elements that CONTAINS the substring in the value.|`[attribute*='value']` -`~=`|Returns all elements that CONTAINS the given words delimited by spaces in the value.|`[attribute~='value']` -`$=`|Returns all elements that ENDS WITH the substring in the value.|`[attribute$='value']` -`^=`|Returns all elements that BEGIN EXACTLY WITH the substring in the value.|`[attribute^='value']` -`!=`|Returns all elements that either DOES NOT HAVE the given attribute or the value of the attribute is NOT EQUAL to the value.|`[attribute!='value']` - -### XPath Examples - -#### `/` vs `//` - -The absolute XPath selector is a single forward slash `/`. It is used to provide a direct path to the element from the root element. - -WARNING: The `/` selector is brittle and should be used sparingly. - -Here is an example of what NOT to do, but this demonstrates how the selector works: - -```xpath -/html/body/div[2]/div/div[2]/div[1]/div[2]/form/div/input -``` - -In the BAD example above, we are specifying a very precise path to an input element in the DOM, starting from the very top of the document. - -Similarly, the relative XPath selector is a double forward slash `//`. It is used to start searching for an element anywhere in the DOM starting from the specified element. If no element is defined, the entire DOM is searched. - -Example: - -```xpath -//div[@class=’form-group’]//input[@id='user-message'] -``` - -In the `GOOD` example above, all `<div class='form-group'/>` elements in the DOM are matched first. Then all `<input id='user-message'/>` with `<div class='form-group'/>` as one of its parents are matched. The parent does not have to immediately precede it since it uses another double forward slash `//`. - -#### Parent Selectors - -The parent selector (`..`) allows you to jump to the parent element. - -Example #1: - -Given this HTML: - -```html -<tr> - <td> - <div>Unique Value</div> - </td> -</tr> -``` - -We can locate the `<tr>` element with this selector: - -```xpath -//*[text()='Unique Value']/../.. -``` - -Example #2: - -Given this HTML: - -```html -<tr> - <td> - <a href=“#”>Edit</a> - </td> - <td> - <div>Unique Value</div> - </td> -</tr> -``` - -We can locate the `<a>` element with this selector: - -```xpath -//div[text()='Unique Value']/../..//a -``` - -#### Attribute Selectors - -Attribute selectors allow you to select elements that match a specific attribute value. - -Examples: - -Attribute|HTML|Selector ----|---|--- -id|`<div id='idname'/>`|`//*[@id='idname']` -class|`<div class='classname'/>`|`//*[@class='classname']` -type|`<button type='submit'/>`|`//*[@type='submit']` -value|`<input value='value'/>`|`//*[@value='value']` -href|`<a href='https://google.com'/>`|`//*[@href='https://google.com']` -src|`<img src='/img.png'/>`|`//*[@src='/img.png']` - -#### `contains()` Selector - -The `contains()` selector allows you to select an element that contains an attribute value string. - -Examples: - -Attribute|HTML|Selector ----|---|--- -`text()`|`<p>Hello World!</p>`|`[contains(text(), 'Hello')]` -`@id`|`<div id='idname1234abcd'/>`|`[contains(@id, 'idname')]` -`@class`|`<div class='classname1 classname2'/>`|`[contains(@class, 'classname1')]` -`@name`|`<input name='inputname'/>`|`[contains(@name, 'name')]` -`@value`|`<input value='value'/>`|`[contains(@value, 'value')]` -`@href`|`<a href='https://google.com'/>`|`[contains(@href, 'google.com')]` - -#### `text()` Selector - -The `text()` selector allows you to select an element that contains a specific string. - -Examples: - -Type|HTML|Selector ----|---|--- -Exact Match|`<p>Hello World!!</p>`|`//p[text()='Hello World!!']` -Substring Match|`<p>Hello World!!</p>`|`//p[contains(text(), 'Hello')]` - -#### `starts-with()` Selector - -The `starts-with()` selector allows you to select an element whose attribute or text starts with a search string. - -Examples: - -Attribute|HTML|Selector ----|---|--- -`@id`|`<div id='unique_id_abcd1234'/>`|`//*[starts-with(@id, 'unique_id')]` -`@class`|`<div class='unique_class_abcd1234'/>`|`//*[starts-with(@class, 'unique_class')]` -`@href`|`<a href='https://www.google.com/'/>`|`//a[starts-with(@href, 'https://')]` -`text()`|`<p>Hello World!</p>`|`//p[starts-with(text(), 'Hello ')]` - -#### `ends-with()` Selector - -The `ends-with()` selector allows you to select an element whose attribute or text ends with a search string. - -Examples: - -Attribute|HTML|Selector ----|---|--- -`@id`|`<div id='abcd1234_unique_id'/>`|`//*[ends-with(@id, 'unique_id')]` -`@class`|`<div class='abcd1234_unique_class'/>`|`//*[ends-with(@class, 'unique_class')]` -`@href`|`<a href='https://www.google.com'/>`|`//a[ends-with(@href, 'google.com')]` -`text()`|`<p>Hello World!</p>`|`//p[ends-with(text(), 'World!')]` - -### Translating Between CSS and XPath - -Most of the time it is possible to translate from CSS to XPath and vice versa. Here are some examples: - -Type|CSS|XPath ----|---|--- -IDs|`#idname`|`//*[@id='idname']` -Classes|`.classname`|`//*[@class='classname']` -HTML Tags|`div`|`//div` -HTML Tag & ID|`div#idname`|`//div[@id='idname']` -HTML Tag & Class|`div.classname`|`//div[@class='classname']` -Universal|`*`|`//*` -Descendant|`#idname .classname`|`//*[@id='idname']//*[@class='classname']` -Child|`#idname > .classname`|`//*[@id='idname']/*[@class='classname']` -Adjacent Sibling|`#idname + .classname`|`//*[@id='idname']/following-sibling::*[@class='classname'][1]` -General Sibling|`#idname ~ .classname`|`//*[@id='idname']/following-sibling::*[@class='classname']` diff --git a/docs/guides/test-isolation.md b/docs/guides/test-isolation.md deleted file mode 100644 index 474867ff2..000000000 --- a/docs/guides/test-isolation.md +++ /dev/null @@ -1,119 +0,0 @@ -# Test Isolation - -Because MFTF is a framework for testing a highly customizable and ever changing application, MFTF tests need to be properly isolated. - -## What is test isolation? - -Test isolation refers to a test that does not leave behind any data or configuration changes in the Magento instance. - -An MFTF test is considered fully isolated if: - -1. It does not leave data behind. -1. It does not leave Magento configured in a different state than when the test started. -1. It does not affect a following test's outcome. -1. It does not rely on an irregular configuration to start its preconditions. - -### Deleting versus restoring - -In the above list, points 1 and 2 refer to leaving things behind during test execution. This means you are either deleting or restoring entities in Magento after your test's execution. - -Some examples of entities to be deleted include: - -1. Products -2. Categories -3. Rules (Price, Related Products) - -The list of entities to restore is much simpler: - -1. Application Configuration - -The distinction above is because MFTF tests expect the environment to be in a completely clean state, outside of a test or suite's preconditions. Data must be cleaned up and any application configuration must go back to the default. - -## Why is isolation important? - -As mentioned above, isolation is important because poor isolation can lead to other test failures. For a test to be useful, you must have high confidence in the test's outcome, and by introducing test isolation issues it can invalidate a test's result. - -## How can I achieve test isolation? - -This is difficult to do given how large the Magento application is, but a systematic approach can ensure a high level of confidence in you test's isolation. - -### Cleaning up data - -If your test creates any data via `<createData>` then a subsequent `<deleteData>` action *must* exist in the test's `<after>` block. - -This includes both `<createData>` actions in the test's `<before>` as well as in the test body. - -```xml -<test name="SampleTest"> - <before> - <createData entity="SimpleSubCategory" stepKey="category"/> - </before> - <after> - <deleteData createDataKey="category" stepKey="deleteCategory"/> - <deleteData createDataKey="entityCreatedDuringWorkflow" stepKey="deleteCategory"/> - </after> - ... - <createData entity="SimpleSubCategory" stepKey="entityCreatedDuringWorkflow"/> - ... -</test> -``` - -Other test data can be more difficult to detect, and requires an understanding of what the test does in its workflow. - -```xml -<test name="AdminAddImageForCategoryTest"> - <before> - <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> - </before> - <after> - <actionGroup ref="DeleteCategory" stepKey="DeleteCategory"> - <argument name="categoryEntity" value="SimpleSubCategory"/> - </actionGroup> - <actionGroup ref="logout" stepKey="logout"/> - </after> - <!-- Go to create a new category with image --> - <actionGroup ref="goToCreateCategoryPage" stepKey="goToCreateCategoryPage"/> - ... -</test> -``` - -Note that the test contains a context setting comment describing the workflow; this is very helpful in determining that a new category will be created, which will need to be cleaned up in the test `<after>` block. - -### Cleaning up configuration - -Similarly, configuration changes can be easily identified by `<magentoCLI>` actions. - -```xml -<test name="AddOutOfStockProductToCompareListTest"> - <before> - <magentoCLI command="config:set cataloginventory/options/show_out_of_stock 0" stepKey="displayOutOfStockNo"/> - ... - </before> - <after> - <magentoCLI command="config:set cataloginventory/options/show_out_of_stock 1" stepKey="displayOutOfStockNo"/> - ... - </after> - ... -</test> -``` - -Configuration changes can also be done via `<createData>` actions, but that is not recommended as it is much easier to identify `<magentoCLI>` commands. - -A test's workflow can also alter the application's configuration, and much like data cleanup, this can only be identified by understanding a test's workflow: - -```xml -<test name="AdminMoveProductBetweenCategoriesTest"> - ... - <!-- Enable `Use Categories Path for Product URLs` on Stores -> Configuration -> Catalog -> Catalog -> Search Engine Optimization --> - <amOnPage url="{{AdminCatalogSearchConfigurationPage.url}}" stepKey="onConfigPage"/> - <waitForPageLoad stepKey="waitForLoading"/> - <conditionalClick selector="{{AdminCatalogSearchEngineConfigurationSection.searchEngineOptimization}}" dependentSelector="{{AdminCatalogSearchEngineConfigurationSection.openedEngineOptimization}}" visible="false" stepKey="clickEngineOptimization"/> - <uncheckOption selector="{{AdminCatalogSearchEngineConfigurationSection.systemValueUseCategoriesPath}}" stepKey="uncheckDefault"/> - <selectOption userInput="Yes" selector="{{AdminCatalogSearchEngineConfigurationSection.selectUseCategoriesPatForProductUrls}}" stepKey="selectYes"/> - <click selector="{{AdminConfigSection.saveButton}}" stepKey="saveConfig"/> - <waitForPageLoad stepKey="waitForSaving"/> - ... -</test> -``` - -One thing to note, unless a test is specifically testing the configuration page's frontend capabilities, configuring the application should always be done with a `<magentoCLI>` action. diff --git a/docs/guides/test-modularity.md b/docs/guides/test-modularity.md deleted file mode 100644 index ed182313e..000000000 --- a/docs/guides/test-modularity.md +++ /dev/null @@ -1,88 +0,0 @@ -# Test Modularity - -One of MFTF's most distinguishing functionalities is the framework's modularity. - -## What is test modularity - -Within MFTF, test modularity can refer to two different concepts: - -### Test material merging - -Test material merging is covered extensively in the [merging] topic, so it will not be our focus in this guide. - -### Modular test materials - -This refers to test materials being correctly owned by the right Magento module, and for tests to have references to only what their parent Magento module has a dependency on. - -Since MFTF queries the Magento instance for enabled modules, MFTF test materials are included or excluded from the merging process dynamically, making proper ownership and dependencies a must. - -Consider the following scenario: - -* TestA in ModuleA is using materials form ModuleB -* In Magento, I now disable ModuleB -* TestA will try to use ModuleB materials, which are no longer being read by MFTF since the Magento instance has it disable - -Since TestA's dependencies are out of sync with ModuleA, the tests are no longer properly modular. - -## Why is test modularity important? - -This concept is important simply because without proper modularity, tests or test materials may be incorrectly merged in (or left out), leading to the the test itself being out of sync with the Magento instance. - -For example, in a situation where an extension drastically alters the login process (for instance: two factor authentication), the only way the tests will be able to pass is if the test materials are correctly nested in the extension. - -## How can I achieve test modularity? - -Test modularity can be challenging, depending on the breadth of the changes being introduced in a module. - -### Determine test material ownership - -This is should be the first step when creating new test materials. We will use the `New Product` page as an example. - -#### Intuitive reasoning - -The easiest way to do this has limited application, but some times it is fairly obvious where test material comes from due to nomenclature or functionality. - -The following `<select>` for `Tax Class` clearly belongs to the `Tax` module: - -```xml -<select class="admin__control-select" name="product[tax_class_id]"/> -``` - -This approach will work on getting the quickest ownership, but it is fairly obvious that it may be necessary to double check. - -#### Deduction - -This is the next step up in difficulty from the above method, as it involves searching through the Magento codebase. - -Take the `Add Attribute` button for example. The button has an `id="addAttribute"` and since we know Magento uses XML to declare much of its layout/CSS properties we can start by searching only `*.xml` files. - -Searching through the codebase for `"addAttribute"` in `xml` files leads to four different files: - -```terminal -app/code/Magento/Customer/Test/Mftf/Section/AdminCustomerActivitiesConfigureSection.xml -app/code/Magento/GiftRegistry/Test/Mftf/Section/AdminGiftRegistrySection.xml -app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminProductAttributeActionGroup.xml -app/code/Magento/Catalog/view/adminhtml/ui_component/product_form.xml -``` - -The first three are clearly MFTF test materials, which leaves us with the final file, and the line below - -```xml -<button name="addAttribute" class="Magento\Catalog\Block\Adminhtml\Product\Edit\Button\AddAttribute"/> -``` - -This means we can safely assume `Add Attribute` button belongs to `Catalog` based on the above class namespace and filepath. - -This kind of deduction is more involved, but it much more likely to give you the true source of the element. - -### Use bin/mftf static-checks - -For tests to be fully modular, an MFTF test must have the same dependencies as its parent module. This is quite difficult to do by hand, and requires checking of every `{{test.material}}` call and any other references to MFTF test materials in a test. - -The `static-checks` command includes a test material ownership check that should help suss out these kind of dependency issues. - -See [mftf commands] for more information. - -<!-- Link definitions --> -[merging]: ../merging.md -[mftf commands]: ../commands/mftf.md diff --git a/docs/guides/using-suites.md b/docs/guides/using-suites.md deleted file mode 100644 index 99413cb78..000000000 --- a/docs/guides/using-suites.md +++ /dev/null @@ -1,101 +0,0 @@ -# Using suites - -With an increasing number of MFTF tests, it is important to have a mechanism to organize and consolidate them for ease-of-use. - -### What is a suite? - -A suite is a collection of MFTF tests that are intended to test specific behaviors of Magento. It may contain initialization and clean up steps common to the included test cases. It allows you to include, exclude and/or group tests with preconditions and post conditions. -You can create a suite referencing tests, test groups and modules. - -### How is a suite defined? - -A suite should be created under `<magento2 root>/dev/tests/acceptance/tests/_suite` if it has cross-module references. If a suite references only a single module, it should be created under `<module>/Test/Mftf/Suite`. The generated tests for each suite are grouped into their own directory under `<magento2 root>/dev/tests/acceptance/tests/functional/Magento/FunctionalTest/_generated/`. - -### What is the format of a suite? - -A suite is comprised of blocks: - -* `<before>` : executes precondition once per suite run. -* `<after>` : executes postcondition once per suite run. -* `<include>`: includes specific tests/groups/modules in the suite. -* `<exclude>`: excludes specific tests/groups/modules from the suite. - -```xml -<?xml version="1.0" encoding="UTF-8"?> - -<suites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Suite/etc/suiteSchema.xsd"> - <suite name=""> - <before> - </before> - <after> - </after> - <include> - <test name=""/> - <group name=""/> - <module name="" file=""/> - </include> - <exclude> - <test name=""/> - <group name=""/> - <module name="" file=""/> - </exclude> - </suite> -</suites> -``` - -### Example - -```xml -<suites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Suite/etc/suiteSchema.xsd"> - <suite name="WYSIWYGDisabledSuite"> - <before> - <magentoCLI stepKey="disableWYSIWYG" command="config:set cms/wysiwyg/enabled disabled" /> - </before> - <after> - <magentoCLI stepKey="enableWYSIWYG" command="config:set cms/wysiwyg/enabled enabled" /> - </after> - <include> - <module name="Catalog"/> - </include> - <exclude> - <test name="WYSIWYGIncompatibleTest"/> - </exclude> - </suite> -</suites> -``` - -This example declares a suite with name `WYSIWYGDisabledSuite`: - -* Disables WYSIWYG of the Magento instance before running the tests. -* Runs all tests from the `Catalog` module, except `WYSIWYGIncompatibleTest` -* Returns the Magento instance back to its original state, by enabling WYSIWYG at the end of testing. - -### Using MFTF suite commands - -* Generate all tests within a suite. - - ```bash - vendor/bin/mftf generate:suite <suiteName> [<suiteName>] - ``` -* Run all tests within suite. - - ```bash - vendor/bin/mftf run:group <suiteName> [<suiteName>] - ``` -* Generates any combination of suites and tests. - - ```bash - vendor/bin/mftf generate:tests --tests '{"tests":["testName1","testName2"],"suites":{"suite1":["suite_test1"],"suite2":null}}' - ``` - -### Run specific tests within a suite - -If a test is referenced in a suite, it can be run in the suite's context with MFTF `run` command. If a test is referenced in multiple suites, the `run` command will run the test multiple times in all contexts. - -```bash -vendor/bin/mftf run:test <testName> [<testName>] -``` - -### When to use suites? - -Suites are a great way to organize tests which need the Magento environment to be configured in a specific way as a pre-requisite. The conditions are executed once per suite which optimizes test execution time. If you wish to categorize tests solely based on functionality, use group tags instead. diff --git a/docs/img/action-groups-dia.svg b/docs/img/action-groups-dia.svg deleted file mode 100644 index 853420d54..000000000 --- a/docs/img/action-groups-dia.svg +++ /dev/null @@ -1,516 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="643" - height="114" - version="1.1" - id="svg152" - sodipodi:docname="action-groups-dia.svg" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"> - <metadata - id="metadata158"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs156" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1017" - id="namedview154" - showgrid="false" - inkscape:zoom="1.2492586" - inkscape:cx="149.25073" - inkscape:cy="58.965954" - inkscape:window-x="3278" - inkscape:window-y="-8" - inkscape:window-maximized="1" - inkscape:current-layer="svg152" /> - <a - href="actions.html" - title="any actions" - id="a3851"> - <g - id="g242"> - <path - d="M404 25 L498 25 L504 31 L504 41 L498 47 L404 47 L398 41 L398 31 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="path2" /> - <text - x="451" - y="36" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text4">actionTypeTags</text> - <line - x1="401" - y1="44" - x2="404" - y2="41" - style="stroke:rgb(0,0,0);stroke-width:2" - id="line6" /> - <path - d="M404 41 L406 43 L407 38 L402 39 L404 41 Z" - style="fill:rgb(0,0,0)" - id="path8" /> - <rect - x="499" - y="31" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect10" /> - <line - x1="501" - y1="36" - x2="507" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line12" /> - <line - x1="504" - y1="33" - x2="504" - y2="39" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line14" /> - </g> - </a> - <a - id="a3924" - href="#argument-tag" - title="zero or more <argument> elements"> - <g - id="g233"> - <rect - x="566" - y="80" - width="70" - height="22" - style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-dasharray:4, 1" - id="rect16" /> - <rect - x="563" - y="77" - width="70" - height="22" - style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-dasharray:4, 1" - id="rect18" /> - <text - x="598" - y="88" - style="font-weight:bold;font-size:10.66666698px;font-family:Arial;dominant-baseline:central;text-anchor:middle;fill:#000000" - id="text20">argument</text> - <text - x="623" - y="109" - style="font-size:9.59999943px;font-family:Arial;dominant-baseline:central;text-anchor:end;fill:#000000" - id="text22">0..∞</text> - </g> - </a> - <line - x1="543" - y1="88" - x2="563" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line24" /> - <a - id="a3914" - title="contains a sequence of"> - <g - id="g227"> - <path - d="M509 78 L532 78 L538 84 L538 92 L532 98 L509 98 L503 92 L503 84 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="path26" /> - <line - x1="506" - y1="88" - x2="535" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line28" /> - <ellipse - cx="515" - cy="88" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse30" /> - <ellipse - cx="520" - cy="88" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse32" /> - <ellipse - cx="525" - cy="88" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse34" /> - <rect - x="533" - y="83" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect36" /> - <line - x1="535" - y1="88" - x2="541" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line38" /> - </g> - </a> - <line - x1="483" - y1="88" - x2="503" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line40" /> - <a - id="a3907" - href="#arguments-tag" - title="wrapping element <arguments>"> - <g - id="g218"> - <rect - x="398" - y="77" - width="80" - height="22" - style="fill:#ffffff;stroke:#000000;stroke-width:1" - id="rect42" /> - <text - x="438" - y="88" - style="font-weight:bold;font-size:10.66666698px;font-family:Arial;dominant-baseline:central;text-anchor:middle;fill:#000000" - id="text44">arguments</text> - <rect - x="473" - y="83" - width="10" - height="10" - style="fill:#ffffff;stroke:#000000;stroke-width:1" - id="rect46" /> - <line - x1="475" - y1="88" - x2="481" - y2="88" - style="stroke:#000000;stroke-width:1" - id="line48" /> - </g> - </a> - <line - x1="388" - y1="36" - x2="398" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line50" /> - <line - x1="388" - y1="88" - x2="398" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line52" /> - <line - x1="388" - y1="36" - x2="388" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line54" /> - <a - id="a3833" - title="optionally contains muiliple times one of the following nodes"> - <g - id="g212"> - <line - x1="378" - y1="62" - x2="388" - y2="62" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line56" /> - <path - d="M347 55 L370 55 L376 61 L376 69 L370 75 L347 75 L341 69 L341 61 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path58" /> - <path - d="M344 52 L367 52 L373 58 L373 66 L367 72 L344 72 L338 66 L338 58 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path60" /> - <line - x1="343" - y1="62" - x2="347" - y2="62" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line62" /> - <line - x1="347" - y1="62" - x2="351" - y2="58" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line64" /> - <line - x1="359" - y1="58" - x2="363" - y2="58" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line66" /> - <line - x1="359" - y1="62" - x2="367" - y2="62" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line68" /> - <line - x1="359" - y1="66" - x2="363" - y2="66" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line70" /> - <line - x1="363" - y1="58" - x2="363" - y2="66" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line72" /> - <ellipse - cx="355" - cy="58" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse74" /> - <ellipse - cx="355" - cy="62" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse76" /> - <ellipse - cx="355" - cy="66" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse78" /> - <text - x="368" - y="82" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text80">0..∞</text> - <rect - x="368" - y="57" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect82" /> - <line - x1="370" - y1="62" - x2="376" - y2="62" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line84" /> - </g> - </a> - <line - x1="318" - y1="62" - x2="338" - y2="62" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line86" /> - <a - id="a82" - href="#actiongroup-tag" - title="one or more <actionGroup> elements"> - <g - id="g195"> - <rect - x="227" - y="54" - width="89" - height="22" - style="fill:#ffffff;stroke:#000000;stroke-width:1" - id="rect88" /> - <rect - x="224" - y="51" - width="89" - height="22" - style="fill:#ffffff;stroke:#000000;stroke-width:1" - id="rect90" /> - <text - x="268.5" - y="62" - style="font-weight:bold;font-size:10.66666698px;font-family:Arial;dominant-baseline:central;text-anchor:middle;fill:#000000" - id="text92">actionGroup</text> - <text - x="308" - y="83" - style="font-size:9.59999943px;font-family:Arial;dominant-baseline:central;text-anchor:end;fill:#000000" - id="text94">1..∞</text> - <rect - x="308" - y="57" - width="10" - height="10" - style="fill:#ffffff;stroke:#000000;stroke-width:1" - id="rect96" /> - <line - x1="310" - y1="62" - x2="316" - y2="62" - style="stroke:#000000;stroke-width:1" - id="line98" /> - </g> - </a> - <line - x1="204" - y1="62" - x2="224" - y2="62" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line100" /> - <line - x1="146.40559" - y1="62" - x2="166.40559" - y2="62" - style="stroke:#000000;stroke-width:1;stroke-linecap:round" - id="line126" /> - <a - id="a106" - title="Root element <actionGroups>" - href="#actiongroups-tag"> - <g - transform="translate(-10)" - id="g104"> - <line - x1="124.97701" - y1="62" - x2="146.40559" - y2="62" - style="stroke:#000000;stroke-width:1.03509831;stroke-linecap:round" - id="line142" /> - <rect - x="59.977016" - y="51" - width="95.357147" - height="22" - style="fill:#ffffff;stroke:#000000;stroke-width:1.03509831" - id="rect144" /> - <text - x="102.44111" - y="63.59021" - style="font-weight:bold;font-size:11.041049px;font-family:Arial;dominant-baseline:central;text-anchor:middle;fill:#000000;stroke-width:1.03509831" - id="text146" - transform="scale(1.0350984,0.96609173)">actionGroups</text> - <rect - x="147.83417" - y="57" - width="10.714286" - height="10" - style="fill:#ffffff;stroke:#000000;stroke-width:1.03509831" - id="rect148" /> - <line - x1="149.97702" - y1="62" - x2="156.40558" - y2="62" - style="stroke:#000000;stroke-width:1.03509831" - id="line150" /> - </g> - </a> - <a - id="a3823" - title="contains a sequence of"> - <g - id="g227-6" - transform="translate(-339.59441,-26)"> - <path - d="m 509,78 h 23 l 6,6 v 8 l -6,6 h -23 l -6,-6 v -8 z" - style="fill:#ffffff;stroke:#000000;stroke-width:1" - id="path26-0" - inkscape:connector-curvature="0" /> - <line - x1="506" - y1="88" - x2="535" - y2="88" - style="stroke:#000000;stroke-width:1" - id="line28-3" /> - <circle - cx="515" - cy="88" - id="ellipse30-8" - r="2" /> - <circle - cx="520" - cy="88" - id="ellipse32-3" - r="2" /> - <circle - cx="525" - cy="88" - id="ellipse34-4" - r="2" /> - <rect - x="533" - y="83" - width="10" - height="10" - style="fill:#ffffff;stroke:#000000;stroke-width:1" - id="rect36-0" /> - <line - x1="535" - y1="88" - x2="541" - y2="88" - style="stroke:#000000;stroke-width:1" - id="line38-2" /> - </g> - </a> -</svg> diff --git a/docs/img/catalogCategoryRepository-operations.png b/docs/img/catalogCategoryRepository-operations.png deleted file mode 100644 index e6fa806bb7384ecf9bf0056e6267e3f721880757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15654 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 diff --git a/docs/img/data-dia.svg b/docs/img/data-dia.svg deleted file mode 100644 index fbaf7d8ec..000000000 --- a/docs/img/data-dia.svg +++ /dev/null @@ -1,489 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="496" - height="218" - version="1.1" - id="svg176" - sodipodi:docname="data-dia.svg" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"> - <metadata - id="metadata182"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs180" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1017" - id="namedview178" - showgrid="false" - inkscape:zoom="1.6195026" - inkscape:cx="156.50572" - inkscape:cy="97.15766" - inkscape:window-x="3278" - inkscape:window-y="-8" - inkscape:window-maximized="1" - inkscape:current-layer="svg176" /> - <text - x="338" - y="57" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text8">0..∞</text> - <a - id="a3925" - href="#data-tag" - title="zero or more <data> elements"> - <g - id="g195"> - <rect - x="307" - y="28" - width="44" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect2" /> - <rect - x="304" - y="25" - width="44" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect4" /> - <text - x="326" - y="36" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text6">data</text> - </g> - </a> - <text - x="332" - y="109" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text24">0..∞</text> - <a - id="a3935" - href="#var-tag" - title="zero or more <var> elements"> - <g - id="g204"> - <rect - x="307" - y="80" - width="38" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect18" /> - <rect - x="304" - y="77" - width="38" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect20" /> - <text - x="323" - y="88" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text22">var</text> - </g> - </a> - <text - x="389" - y="161" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text40">0..∞</text> - <a - id="a3945" - href="#requiredentity-tag" - title="zero or more <requiredEntity> elements"> - <g - id="g213"> - <rect - x="307" - y="132" - width="95" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect34" /> - <rect - x="304" - y="129" - width="95" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect36" /> - <text - x="351.5" - y="140" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text38">requiredEntity</text> - </g> - </a> - <text - x="476" - y="213" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text56">0..∞</text> - <a - id="a3963" - href="#item-tag" - title="zero or more <item> elements"> - <g - id="g229"> - <rect - x="445" - y="184" - width="44" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect50" /> - <rect - x="442" - y="181" - width="44" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect52" /> - <text - x="464" - y="192" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text54">item</text> - </g> - </a> - <line - x1="417.84494" - y1="192" - x2="442" - y2="192" - style="stroke:#000000;stroke-width:1.09897804;stroke-linecap:round" - id="line66" /> - <a - id="a3968" - title="a sequence of the following elements"> - <g - id="g3966"> - <path - inkscape:connector-curvature="0" - d="m 388,182 h 23 l 6,6 v 8 l -6,6 h -23 l -6,-6 v -8 z" - style="fill:#ffffff;stroke:#000000;stroke-width:1" - id="path68" /> - <line - x1="385" - y1="192" - x2="414" - y2="192" - style="stroke:#000000;stroke-width:1" - id="line70" /> - <circle - r="2" - cx="394" - cy="192" - id="ellipse72" /> - <circle - r="2" - cx="399" - cy="192" - id="ellipse74" /> - <circle - r="2" - cx="404" - cy="192" - id="ellipse76" /> - </g> - </a> - <line - x1="360.46375" - y1="192" - x2="382" - y2="192" - style="stroke:#000000;stroke-width:1.03769612;stroke-linecap:round" - id="line82" /> - <text - x="352" - y="213" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text90">0..∞</text> - <a - id="a99" - href="#array-tag" - title="zero or more <array> elements"> - <g - id="g3864"> - <rect - x="307" - y="184" - width="53" - height="22" - style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-dasharray:4, 1" - id="rect84" /> - <rect - x="304" - y="181" - width="53" - height="22" - style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-dasharray:4, 1" - id="rect86" /> - <text - x="330.5" - y="192" - style="font-weight:bold;font-size:10.66666698px;font-family:Arial;dominant-baseline:central;text-anchor:middle;fill:#000000" - id="text88">array</text> - </g> - </a> - <line - x1="294" - y1="36" - x2="304" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line96" /> - <line - x1="294" - y1="88" - x2="304" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line98" /> - <line - x1="294" - y1="140" - x2="304" - y2="140" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line100" /> - <line - x1="294" - y1="192" - x2="304" - y2="192" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line102" /> - <line - x1="294" - y1="36" - x2="294" - y2="192" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line104" /> - <line - x1="282.8219" - y1="114" - x2="294" - y2="114" - style="stroke:#000000;stroke-width:1.05726469;stroke-linecap:round" - id="line106" /> - <a - id="a3984" - title="that contains one of the following nodes one or times"> - <g - id="g3959"> - <g - id="g3922"> - <path - inkscape:connector-curvature="0" - id="path110" - style="fill:#ffffff;stroke:#000000;stroke-width:1" - d="m 250,104 h 23 l 6,6 v 8 l -6,6 h -23 l -6,-6 v -8 z" /> - <path - id="path108" - style="fill:#ffffff;stroke:#000000;stroke-width:1" - d="m 253,107 h 23 l 6,6 v 8 l -6,6 h -23 l -6,-6 v -8 z" - inkscape:connector-curvature="0" /> - <line - id="line112" - style="stroke:#000000;stroke-width:1" - y2="114" - x2="253" - y1="114" - x1="249" /> - <line - id="line114" - style="stroke:#000000;stroke-width:1" - y2="110" - x2="257" - y1="114" - x1="253" /> - <line - id="line116" - style="stroke:#000000;stroke-width:1" - y2="110" - x2="269" - y1="110" - x1="265" /> - <line - id="line118" - style="stroke:#000000;stroke-width:1" - y2="114" - x2="273" - y1="114" - x1="265" /> - <line - id="line120" - style="stroke:#000000;stroke-width:1" - y2="118" - x2="269" - y1="118" - x1="265" /> - <line - id="line122" - style="stroke:#000000;stroke-width:1" - y2="118" - x2="269" - y1="110" - x1="269" /> - <circle - id="ellipse124" - cy="110" - cx="261" - r="2" /> - <circle - id="ellipse126" - cy="114" - cx="261" - r="2" /> - <circle - id="ellipse128" - cy="118" - cx="261" - r="2" /> - <text - id="text130" - style="font-size:9.59999943px;font-family:Arial;dominant-baseline:central;text-anchor:end;fill:#000000" - y="134" - x="274">1..∞</text> - </g> - </g> - </a> - <line - x1="222.68196" - y1="114" - x2="244" - y2="114" - style="stroke:#000000;stroke-width:1.03242517;stroke-linecap:round" - id="line136" /> - <rect - x="167" - y="106" - width="55" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect138" /> - <a - id="a231" - href="#entity-tag" - title="zero or more <entity> elements"> - <g - id="g186"> - <rect - x="164" - y="103" - width="55" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect140" /> - <text - x="191.5" - y="114" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text142">entity</text> - </g> - </a> - <text - x="214" - y="135" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text144">0..∞</text> - <line - x1="136" - y1="114" - x2="164" - y2="114" - style="stroke:#000000;stroke-width:1.18321598;stroke-linecap:round" - id="line150" /> - <a - id="a3976" - title="that contains a sequence of"> - <g - id="g3944"> - <path - d="m 110,104 h 23 l 6,6 v 8 l -6,6 h -23 l -6,-6 v -8 z" - style="fill:#ffffff;stroke:#000000;stroke-width:1" - id="path152" - inkscape:connector-curvature="0" /> - <line - x1="107" - y1="114" - x2="136" - y2="114" - style="stroke:#000000;stroke-width:1" - id="line154" /> - <circle - cx="116" - cy="114" - id="ellipse156" - r="2" /> - <circle - cx="121" - cy="114" - id="ellipse158" - r="2" /> - <circle - cx="126" - cy="114" - id="ellipse160" - r="2" /> - </g> - </a> - <line - x1="79.899483" - y1="114" - x2="104" - y2="114" - style="stroke:#000000;stroke-width:1.09773672;stroke-linecap:round" - id="line166" /> - <a - id="a104" - title="Root element <entities>" - href="#entities-tag"> - <g - id="g102"> - <rect - x="20" - y="103" - width="59" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect168" /> - <text - x="49.5" - y="114" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text170">entities</text> - </g> - </a> -</svg> diff --git a/docs/img/metadata-dia.svg b/docs/img/metadata-dia.svg deleted file mode 100644 index 0ce0fc27a..000000000 --- a/docs/img/metadata-dia.svg +++ /dev/null @@ -1,1050 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="561" - height="478" - version="1.1" - id="svg318" - sodipodi:docname="metadata-dia.svg" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"> - <metadata - id="metadata324"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs322" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1017" - id="namedview320" - showgrid="false" - inkscape:zoom="1.3964619" - inkscape:cx="235.1642" - inkscape:cy="256.75664" - inkscape:window-x="3278" - inkscape:window-y="-8" - inkscape:window-maximized="1" - inkscape:current-layer="svg318" /> - <a - id="a4301" - href="#field-tag" - title="zero or more <field> elements"> - <g - id="g417"> - <rect - x="491" - y="28" - width="44" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect2" /> - <rect - x="488" - y="25" - width="44" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect4" /> - <text - x="510" - y="36" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text6">field</text> - <text - x="522" - y="57" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text8">0..∞</text> - </g> - </a> - <a - id="a4308" - title="zero or more <array> elements" - href="#array-tag"> - <g - id="g442"> - <rect - x="491" - y="80" - width="53" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect18" /> - <rect - x="488" - y="77" - width="53" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect20" /> - <text - x="514.5" - y="88" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text22">array</text> - <text - x="536" - y="109" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text24">0..∞</text> - <rect - x="536" - y="83" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect26" /> - <line - x1="538" - y1="88" - x2="544" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line28" /> - <line - x1="541" - y1="85" - x2="541" - y2="91" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line30" /> - </g> - </a> - <line - x1="478" - y1="36" - x2="488" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line46" /> - <line - x1="478" - y1="88" - x2="488" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line48" /> - <a - id="a4318" - href="#object-tag" - title="zero or more <object> elements"> - <g - id="g452"> - <rect - x="491" - y="132" - width="58" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect32" /> - <rect - x="488" - y="129" - width="58" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect34" /> - <text - x="517" - y="140" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text36">object</text> - <text - x="541" - y="161" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text38">0..∞</text> - <rect - x="541" - y="135" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect40" /> - <line - x1="543" - y1="140" - x2="549" - y2="140" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line42" /> - <line - x1="546" - y1="137" - x2="546" - y2="143" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line44" /> - <line - x1="478" - y1="140" - x2="488" - y2="140" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line50" /> - </g> - </a> - <line - x1="478" - y1="36" - x2="478" - y2="140" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line52" /> - <line - x1="468" - y1="88" - x2="478" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line54" /> - <a - id="a4284" - title="that may contain zero or more times one of the following nodes"> - <g - id="g433"> - <path - d="M437 81 L460 81 L466 87 L466 95 L460 101 L437 101 L431 95 L431 87 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path56" /> - <path - d="M434 78 L457 78 L463 84 L463 92 L457 98 L434 98 L428 92 L428 84 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path58" /> - <line - x1="433" - y1="88" - x2="437" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line60" /> - <line - x1="437" - y1="88" - x2="441" - y2="84" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line62" /> - <line - x1="449" - y1="84" - x2="453" - y2="84" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line64" /> - <line - x1="449" - y1="88" - x2="457" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line66" /> - <line - x1="449" - y1="92" - x2="453" - y2="92" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line68" /> - <line - x1="453" - y1="84" - x2="453" - y2="92" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line70" /> - <ellipse - cx="445" - cy="84" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse72" /> - <ellipse - cx="445" - cy="88" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse74" /> - <ellipse - cx="445" - cy="92" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse76" /> - <text - x="458" - y="108" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text78">0..∞</text> - <rect - x="458" - y="83" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect80" /> - <line - x1="460" - y1="88" - x2="466" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line82" /> - </g> - </a> - <line - x1="408" - y1="88" - x2="428" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line84" /> - <a - id="a4227" - title="zero or more <field> elements" - href="#field-tag"> - <g - id="g387"> - <rect - x="348" - y="184" - width="44" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect98" /> - <rect - x="345" - y="181" - width="44" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect100" /> - <text - x="367" - y="192" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text102">field</text> - <text - x="379" - y="213" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text104">0..∞</text> - </g> - </a> - <a - id="a4262" - title="zero or one <value> element" - href="#value-tag"> - <g - id="g466"> - <rect - x="483" - y="285" - width="49" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect128" /> - <text - x="507.5" - y="296" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text130">value</text> - </g> - </a> - <a - id="a4329" - title="zero or more <object> elements" - href="#object-tag"> - <g - id="g462"> - <rect - x="486" - y="236" - width="58" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect114" /> - <rect - x="483" - y="233" - width="58" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect116" /> - <text - x="512" - y="244" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text118">object</text> - <text - x="536" - y="265" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text120">0..∞</text> - <rect - x="536" - y="239" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect122" /> - <line - x1="538" - y1="244" - x2="544" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line124" /> - <line - x1="541" - y1="241" - x2="541" - y2="247" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line126" /> - <line - x1="473" - y1="244" - x2="483" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line140" /> - </g> - </a> - <line - x1="473" - y1="296" - x2="483" - y2="296" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line142" /> - <line - x1="473" - y1="244" - x2="473" - y2="296" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line144" /> - <line - x1="463" - y1="270" - x2="473" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line146" /> - <a - id="a4267" - title="that may contain zero or more times one of the following nodes"> - <g - id="g482"> - <path - d="M432 263 L455 263 L461 269 L461 277 L455 283 L432 283 L426 277 L426 269 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path148" /> - <path - d="M429 260 L452 260 L458 266 L458 274 L452 280 L429 280 L423 274 L423 266 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path150" /> - <line - x1="428" - y1="270" - x2="432" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line152" /> - <line - x1="432" - y1="270" - x2="436" - y2="266" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line154" /> - <line - x1="444" - y1="266" - x2="448" - y2="266" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line156" /> - <line - x1="444" - y1="270" - x2="452" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line158" /> - <line - x1="444" - y1="274" - x2="448" - y2="274" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line160" /> - <line - x1="448" - y1="266" - x2="448" - y2="274" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line162" /> - <ellipse - cx="440" - cy="266" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse164" /> - <ellipse - cx="440" - cy="270" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse166" /> - <ellipse - cx="440" - cy="274" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse168" /> - <text - x="453" - y="290" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text170">0..∞</text> - <rect - x="453" - y="265" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect172" /> - <line - x1="455" - y1="270" - x2="461" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line174" /> - </g> - </a> - <line - x1="403" - y1="270" - x2="423" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line176" /> - <a - id="a4234" - title="zero or more <array> elements" - href="#array-tag"> - <g - id="g395"> - <rect - x="348" - y="262" - width="53" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect178" /> - <rect - x="345" - y="259" - width="53" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect180" /> - <text - x="371.5" - y="270" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text182">array</text> - <text - x="393" - y="291" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text184">0..∞</text> - <rect - x="393" - y="265" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect186" /> - <line - x1="395" - y1="270" - x2="401" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line188" /> - </g> - </a> - <a - id="a4243" - href="#header-tag" - title="zero or more <header> elements"> - <g - id="g400"> - <rect - x="348" - y="340" - width="57" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect190" /> - <rect - x="345" - y="337" - width="57" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect192" /> - <text - x="373.5" - y="348" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text194">header</text> - </g> - </a> - <text - x="392" - y="369" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text196">0..∞</text> - <a - id="a4249" - title="zero or more <param> elements" - href="#param-tag"> - <g - id="g406"> - <rect - x="348" - y="392" - width="54" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect206" /> - <rect - x="345" - y="389" - width="54" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect208" /> - <text - x="372" - y="400" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text210">param</text> - <text - x="389" - y="421" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text212">0..∞</text> - </g> - </a> - <a - id="a4216" - href="#object-tag" - title="zero or more <object> elements"> - <g - id="g381"> - <g - id="g346"> - <rect - id="rect86" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - height="22" - width="58" - y="80" - x="348" /> - <rect - id="rect88" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - height="22" - width="58" - y="77" - x="345" /> - <text - id="text90" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - y="88" - x="374">object</text> - <text - id="text92" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - y="109" - x="398">0..∞</text> - <rect - id="rect94" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - height="10" - width="10" - y="83" - x="398" /> - <line - id="line96" - style="stroke:rgb(0,0,0);stroke-width:1" - y2="88" - x2="406" - y1="88" - x1="400" /> - </g> - <line - x1="335" - y1="88" - x2="345" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line234" /> - </g> - </a> - <line - x1="335" - y1="192" - x2="345" - y2="192" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line236" /> - <line - x1="335" - y1="270" - x2="345" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line238" /> - <line - x1="335" - y1="348" - x2="345" - y2="348" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line240" /> - <line - x1="335" - y1="400" - x2="345" - y2="400" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line242" /> - <a - id="a4256" - title="one <contentType> element" - href="#contentType-tag"> - <g - id="g411"> - <rect - x="345" - y="441" - width="84" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect222" /> - <text - x="387" - y="452" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text224">contentType</text> - <line - x1="335" - y1="452" - x2="345" - y2="452" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line244" /> - </g> - </a> - <line - x1="335" - y1="88" - x2="335" - y2="452" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line246" /> - <line - x1="325" - y1="244" - x2="335" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line248" /> - <a - id="a4199" - title="that may contain zero or more times one of the following nodes"> - <g - id="g371"> - <path - d="M294 237 L317 237 L323 243 L323 251 L317 257 L294 257 L288 251 L288 243 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path250" /> - <path - d="M291 234 L314 234 L320 240 L320 248 L314 254 L291 254 L285 248 L285 240 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path252" /> - <line - x1="290" - y1="244" - x2="294" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line254" /> - <line - x1="294" - y1="244" - x2="298" - y2="240" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line256" /> - <line - x1="306" - y1="240" - x2="310" - y2="240" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line258" /> - <line - x1="306" - y1="244" - x2="314" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line260" /> - <line - x1="306" - y1="248" - x2="310" - y2="248" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line262" /> - <line - x1="310" - y1="240" - x2="310" - y2="248" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line264" /> - <ellipse - cx="302" - cy="240" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse266" /> - <ellipse - cx="302" - cy="244" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse268" /> - <ellipse - cx="302" - cy="248" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse270" /> - <text - x="315" - y="264" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text272">0..∞</text> - <rect - x="315" - y="239" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect274" /> - <line - x1="317" - y1="244" - x2="323" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line276" /> - </g> - </a> - <line - x1="265" - y1="244" - x2="285" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line278" /> - <a - id="a4190" - title="zero or more <operation> elements" - href="#operation-tag"> - <g - id="g338"> - <rect - x="188" - y="236" - width="75" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect280" /> - <rect - x="185" - y="233" - width="75" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect282" /> - <text - x="222.5" - y="244" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text284">operation</text> - <text - x="255" - y="265" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text286">0..∞</text> - <rect - x="255" - y="239" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect288" /> - <line - x1="257" - y1="244" - x2="263" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line290" /> - </g> - </a> - <line - x1="165" - y1="244" - x2="185" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line292" /> - <a - id="a4180" - title="that contains a sequence of"> - <g - id="g355"> - <path - d="M131 234 L154 234 L160 240 L160 248 L154 254 L131 254 L125 248 L125 240 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="path294" /> - <line - x1="128" - y1="244" - x2="157" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line296" /> - <ellipse - cx="137" - cy="244" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse298" /> - <ellipse - cx="142" - cy="244" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse300" /> - <ellipse - cx="147" - cy="244" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse302" /> - <rect - x="155" - y="239" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect304" /> - <line - x1="157" - y1="244" - x2="163" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line306" /> - </g> - </a> - <line - x1="105" - y1="244" - x2="125" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line308" /> - <a - id="a484" - href="#operations-tag" - xlink:arcrole="The <operations> element"> - <g - id="g330"> - <rect - x="20" - y="233" - width="80" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect310" /> - <text - x="60" - y="244" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text312">operations</text> - <rect - x="95" - y="239" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect314" /> - <line - x1="97" - y1="244" - x2="103" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line316" /> - </g> - </a> -</svg> diff --git a/docs/img/mftf-extending-precedence.png b/docs/img/mftf-extending-precedence.png deleted file mode 100644 index deed5231f5592ca4a2f7dac8876361774f49b2c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127088 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 diff --git a/docs/img/mftf-fork.gif b/docs/img/mftf-fork.gif deleted file mode 100644 index 6ea138cce9fb8b99125675428479dad499b51e31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387415 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%0AIuM_+;s{SNUX? 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%0Dm_H5D{Fvz(0lx~6Jf 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%0D3`f0_ECz!sAC#M?#MjhDT(- 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⩔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%0Aa3ne$OaD3yan%)^2EDG74P1KA`|p`f_vPFOV7 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®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 ap7P1;(E}iuqW;s7TgjQzp+4aMyXIfIPU39< diff --git a/docs/img/page-dia.svg b/docs/img/page-dia.svg deleted file mode 100644 index 668891db0..000000000 --- a/docs/img/page-dia.svg +++ /dev/null @@ -1,290 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="370" - height="62" - version="1.1" - id="svg78" - sodipodi:docname="page-dia.svg" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"> - <metadata - id="metadata84"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs82" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1017" - id="namedview80" - showgrid="false" - inkscape:zoom="1.5351351" - inkscape:cx="91.410446" - inkscape:cy="18.181373" - inkscape:window-x="3278" - inkscape:window-y="-8" - inkscape:window-maximized="1" - inkscape:current-layer="svg78" /> - <rect - x="304" - y="28" - width="59" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect2" /> - <a - href="#section-tag" - id="a8" - title="zero or more <secion> elements"> - <rect - x="301" - y="25" - width="59" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect4" /> - <text - x="330.5" - y="36" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text6">section</text> - </a> - <text - x="350" - y="57" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text10">0..∞</text> - <line - x1="281" - y1="36" - x2="301" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line16" /> - <a - id="a3770" - title="that contains a sequence of"> - <g - id="g3768"> - <path - d="M247 26 L270 26 L276 32 L276 40 L270 46 L247 46 L241 40 L241 32 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="path18" /> - <line - x1="244" - y1="36" - x2="273" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line20" /> - <ellipse - cx="253" - cy="36" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse22" /> - <ellipse - cx="258" - cy="36" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse24" /> - <ellipse - cx="263" - cy="36" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse26" /> - <rect - x="271" - y="31" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect28" /> - <line - x1="273" - y1="36" - x2="279" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line30" /> - </g> - </a> - <line - x1="221" - y1="36" - x2="241" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line32" /> - <rect - x="167" - y="28" - width="52" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect34" /> - <a - href="#page-tag" - id="a40" - title="one or more <page> elements"> - <rect - x="164" - y="25" - width="52" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect36" /> - <text - x="190" - y="36" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text38">page</text> - </a> - <text - x="211" - y="57" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text42">1..∞</text> - <rect - x="211" - y="31" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect48" /> - <line - x1="213" - y1="36" - x2="219" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line50" /> - <line - x1="144" - y1="36" - x2="164" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line52" /> - <a - id="a3751" - title="that contains a sequence of"> - <g - id="g3749"> - <path - d="M110 26 L133 26 L139 32 L139 40 L133 46 L110 46 L104 40 L104 32 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="path54" /> - <line - x1="107" - y1="36" - x2="136" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line56" /> - <ellipse - cx="116" - cy="36" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse58" /> - <ellipse - cx="121" - cy="36" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse60" /> - <ellipse - cx="126" - cy="36" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse62" /> - <rect - x="134" - y="31" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect64" /> - <line - x1="136" - y1="36" - x2="142" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line66" /> - </g> - </a> - <line - x1="84" - y1="36" - x2="104" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line68" /> - <a - id="a46" - href="#pages-tag" - title="Root element <pages>"> - <g - id="g44"> - <rect - x="20" - y="25" - width="59" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect70" /> - <text - x="49.5" - y="36" - style="font-weight:bold;font-size:10.66666698px;font-family:Arial;dominant-baseline:central;text-anchor:middle;fill:#000000" - id="text72">pages</text> - <rect - x="74" - y="31" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect74" /> - <line - x1="76" - y1="36" - x2="82" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line76" /> - </g> - </a> -</svg> diff --git a/docs/img/section-dia.svg b/docs/img/section-dia.svg deleted file mode 100644 index 1ee7611af..000000000 --- a/docs/img/section-dia.svg +++ /dev/null @@ -1,296 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="385" - height="62" - version="1.1" - id="svg74" - sodipodi:docname="section-dia.svg" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"> - <metadata - id="metadata80"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs78" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1017" - id="namedview76" - showgrid="false" - inkscape:zoom="2.0864242" - inkscape:cx="154.86083" - inkscape:cy="15.327771" - inkscape:window-x="3278" - inkscape:window-y="-8" - inkscape:window-maximized="1" - inkscape:current-layer="svg74" /> - <rect - x="316" - y="28" - width="62" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect2" /> - <a - id="a3803" - href="#element-tag" - title="one or more <element> elements"> - <g - id="g88"> - <rect - x="313" - y="25" - width="62" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect4" /> - <text - x="344" - y="36" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text6">element</text> - </g> - </a> - <text - x="365" - y="57" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text8">1..∞</text> - <line - x1="293" - y1="36" - x2="313" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line14" /> - <a - id="a3777" - title="that contains a sequence of"> - <g - id="g3775"> - <path - d="M259 26 L282 26 L288 32 L288 40 L282 46 L259 46 L253 40 L253 32 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="path16" /> - <line - x1="256" - y1="36" - x2="285" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line18" /> - <ellipse - cx="265" - cy="36" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse20" /> - <ellipse - cx="270" - cy="36" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse22" /> - <ellipse - cx="275" - cy="36" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse24" /> - <rect - x="283" - y="31" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect26" /> - <line - x1="285" - y1="36" - x2="291" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line28" /> - </g> - </a> - <line - x1="233" - y1="36" - x2="253" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line30" /> - <rect - x="167" - y="28" - width="64" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect32" /> - <a - id="a109" - href="#section-tag" - title="one or more <section> elements"> - <g - id="g84"> - <path - inkscape:connector-curvature="0" - id="rect34" - d="m 164,25 c 21.33333,0 42.66667,0 64,0 0,7.333333 0,14.666667 0,22 -21.33333,0 -42.66667,0 -64,0 0,-7.333333 0,-14.666667 0,-22 z" - style="fill:#ffffff;stroke:#000000;stroke-width:1" /> - <path - inkscape:connector-curvature="0" - id="text36" - d="m 177.5625,37.363255 c 1.52529,-0.935044 2.52281,1.779504 3.69792,0.04687 -1.41244,-0.537747 -5.23048,-1.866312 -2.60417,-3.849609 1.13374,-1.247589 5.42381,0.888062 2.93622,1.363663 -0.52908,-0.06221 -2.59658,-1.343691 -2.32164,0.136988 1.91588,0.03374 5.07512,1.94106 2.46713,3.697591 -1.42333,0.629818 -3.75169,0.397163 -4.17546,-1.395508 z m 9.65625,-0.182291 c 2.44842,-0.276007 0.71062,2.155886 -0.94792,1.885417 -2.98868,0.278515 -3.66937,-4.498438 -1.14974,-5.585938 1.95032,-1.411312 4.8677,2.271182 3.08252,3.117187 -1.03835,0 -2.07671,0 -3.11507,0 -0.18497,1.277388 1.81333,2.021528 2.13021,0.583334 z m 0.0833,-1.479167 c 0.38377,-2.44698 -3.53646,-0.483165 -1.6359,0 0.5453,0 1.0906,0 1.6359,0 z m 7.47396,-0.65625 c -1.52854,0.994728 -2.51116,-1.881488 -3.55989,0.273438 -0.96483,1.83752 1.70256,3.656455 2.33125,1.525753 2.64318,-0.225852 0.0544,2.909802 -1.55668,2.20968 -3.17146,-0.115705 -3.1548,-5.664414 0.0212,-5.757325 1.21388,-0.172487 2.50213,0.483367 2.76416,1.748454 z m 3.65104,-1.635417 c 0.4678,1.281947 -0.63769,0.990621 -1,1.442464 0.17471,0.96121 -0.40103,2.406694 0.40625,3.000245 1.95951,0.06826 -0.55728,2.393732 -1.625,0.739583 -0.45945,-1.271518 -0.16723,-2.680854 -0.25,-4.015625 -0.97874,0.476369 -0.99812,-1.649412 0,-1.166667 -0.31505,-1.053184 0.48134,-1.467007 1.31127,-1.861536 0.54105,-0.0085 -0.30244,1.868393 0.43328,1.861536 0.2414,0 0.4828,0 0.7242,0 z m 1.02604,-0.75 c -0.20685,-1.071939 0.0909,-1.639223 1.24109,-1.354166 0.51629,0.342671 0.34899,1.883179 -0.74283,1.354166 -0.16609,0 -0.33217,0 -0.49826,0 z m 0,6.281251 c 0,-1.843751 0,-3.687501 0,-5.531251 0.96324,-0.107657 1.81965,-0.108492 1.46355,1.103188 0,1.476021 0,2.952042 0,4.428063 -0.48785,0 -0.9757,0 -1.46355,0 z m 2.6198,-2.843751 c -0.18497,-2.633509 3.5807,-3.821658 5.09424,-1.784912 1.49262,1.743986 0.16168,4.91742 -2.23487,4.753663 -1.65062,0.06716 -2.99523,-1.308404 -2.85937,-2.968751 z m 1.5,0.07813 c -0.0314,3.170045 4.26045,0.891586 2.3125,-1.260416 -0.96403,-1.094803 -2.49485,0.0058 -2.3125,1.260416 z m 10.39062,2.765626 c -0.96323,0.107657 -1.81964,0.108491 -1.46354,-1.103189 -0.16753,-1.109612 0.46733,-2.707337 -0.63151,-3.396812 -1.96808,-0.190926 -1.40078,2.230498 -1.48307,3.511676 0.38258,1.199876 -0.60098,1.033596 -1.46354,0.988325 0,-1.843751 0,-3.687501 0,-5.531251 1.63308,-0.62997 1.077,1.516748 2.17708,0.109375 2.22452,-1.125947 3.22655,1.30944 2.86458,3.087564 0,0.778104 0,1.556208 0,2.334312 z" - style="font-weight:bold;font-size:10.66666698px;font-family:Arial;dominant-baseline:central;text-anchor:middle;fill:#000000" /> - </g> - </a> - <text - x="223" - y="57" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text38">1..∞</text> - <rect - x="223" - y="31" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect44" /> - <line - x1="225" - y1="36" - x2="231" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line46" /> - <line - x1="144" - y1="36" - x2="164" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line48" /> - <a - id="a3757" - title="that contains a sequence of"> - <g - id="g3755"> - <path - d="M110 26 L133 26 L139 32 L139 40 L133 46 L110 46 L104 40 L104 32 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="path50" /> - <line - x1="107" - y1="36" - x2="136" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line52" /> - <ellipse - cx="116" - cy="36" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse54" /> - <ellipse - cx="121" - cy="36" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse56" /> - <a - id="a3744"> - <ellipse - id="ellipse58" - style="rgb(0,0,0)" - ry="2" - rx="2" - cy="36" - cx="126" /> - </a> - <rect - x="134" - y="31" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect60" /> - <line - x1="136" - y1="36" - x2="142" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line62" /> - </g> - </a> - <line - x1="84" - y1="36" - x2="104" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line64" /> - <a - id="a48" - title="Root element <sections>"> - <g - id="g46"> - <rect - x="20" - y="25" - width="59" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect66" /> - <text - x="49.5" - y="36" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text68">sections</text> - <rect - x="74" - y="31" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect70" /> - <line - x1="76" - y1="36" - x2="82" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line72" /> - </g> - </a> -</svg> diff --git a/docs/img/test-dia.svg b/docs/img/test-dia.svg deleted file mode 100644 index fcf2628da..000000000 --- a/docs/img/test-dia.svg +++ /dev/null @@ -1,1228 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="601" - height="322" - version="1.1" - id="svg330" - sodipodi:docname="test-dia.svg" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"> - <metadata - id="metadata336"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs334" /> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1017" - id="namedview332" - showgrid="false" - inkscape:zoom="1.890183" - inkscape:cx="272.85453" - inkscape:cy="165.81687" - inkscape:window-x="3278" - inkscape:window-y="-8" - inkscape:window-maximized="1" - inkscape:current-layer="svg330" /> - <g - id="g398"> - <path - id="path2" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - d="M354 25 L436 25 L442 31 L442 41 L436 47 L354 47 L348 41 L348 31 Z" /> - <text - id="text4" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - y="36" - x="395">testTypeTags</text> - <line - id="line6" - style="stroke:rgb(0,0,0);stroke-width:2" - y2="41" - x2="354" - y1="44" - x1="351" /> - <path - id="path8" - style="fill:rgb(0,0,0)" - d="M354 41 L356 43 L357 38 L352 39 L354 41 Z" /> - <rect - id="rect10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - height="10" - width="10" - y="31" - x="437" /> - <line - id="line12" - style="stroke:rgb(0,0,0);stroke-width:1" - y2="36" - x2="445" - y1="36" - x1="439" /> - <line - id="line14" - style="stroke:rgb(0,0,0);stroke-width:1" - y2="39" - x2="442" - y1="33" - x1="442" /> - </g> - <g - id="g429"> - <path - id="path16" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - d="M498 77 L580 77 L586 83 L586 93 L580 99 L498 99 L492 93 L492 83 Z" /> - <text - id="text18" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - y="88" - x="539">testTypeTags</text> - <line - id="line20" - style="stroke:rgb(0,0,0);stroke-width:2" - y2="93" - x2="498" - y1="96" - x1="495" /> - <path - id="path22" - style="fill:rgb(0,0,0)" - d="M498 93 L500 95 L501 90 L496 91 L498 93 Z" /> - <rect - id="rect24" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - height="10" - width="10" - y="83" - x="581" /> - <line - id="line26" - style="stroke:rgb(0,0,0);stroke-width:1" - y2="88" - x2="589" - y1="88" - x1="583" /> - <line - id="line28" - style="stroke:rgb(0,0,0);stroke-width:1" - y2="91" - x2="586" - y1="85" - x1="586" /> - </g> - <line - x1="472" - y1="88" - x2="492" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line30" /> - <a - id="a4301" - title="that may contain any number of the following nodes in any order"> - <g - id="g420"> - <path - d="M441 81 L464 81 L470 87 L470 95 L464 101 L441 101 L435 95 L435 87 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path32" /> - <path - d="M438 78 L461 78 L467 84 L467 92 L461 98 L438 98 L432 92 L432 84 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path34" /> - <line - x1="437" - y1="88" - x2="441" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line36" /> - <line - x1="441" - y1="88" - x2="445" - y2="84" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line38" /> - <line - x1="453" - y1="84" - x2="457" - y2="84" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line40" /> - <line - x1="453" - y1="88" - x2="461" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line42" /> - <line - x1="453" - y1="92" - x2="457" - y2="92" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line44" /> - <line - x1="457" - y1="84" - x2="457" - y2="92" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line46" /> - <ellipse - cx="449" - cy="84" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse48" /> - <ellipse - cx="449" - cy="88" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse50" /> - <ellipse - cx="449" - cy="92" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse52" /> - <text - x="462" - y="108" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text54">0..∞</text> - <rect - x="462" - y="83" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect56" /> - <line - x1="464" - y1="88" - x2="470" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line58" /> - </g> - </a> - <line - x1="412" - y1="88" - x2="432" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line60" /> - <a - id="a4270" - href="#before-tag" - title="zero or one <before> element"> - <g - id="g404"> - <rect - x="348" - y="77" - width="59" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect62" /> - <text - x="377.5" - y="88" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text64">before</text> - <rect - x="402" - y="83" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect66" /> - <line - x1="404" - y1="88" - x2="410" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line68" /> - </g> - </a> - <g - id="g438"> - <path - id="path70" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - d="M489 129 L571 129 L577 135 L577 145 L571 151 L489 151 L483 145 L483 135 Z" /> - <text - id="text72" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - y="140" - x="530">testTypeTags</text> - <line - id="line74" - style="stroke:rgb(0,0,0);stroke-width:2" - y2="145" - x2="489" - y1="148" - x1="486" /> - <path - id="path76" - style="fill:rgb(0,0,0)" - d="M489 145 L491 147 L492 142 L487 143 L489 145 Z" /> - <rect - id="rect78" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - height="10" - width="10" - y="135" - x="572" /> - <line - id="line80" - style="stroke:rgb(0,0,0);stroke-width:1" - y2="140" - x2="580" - y1="140" - x1="574" /> - <line - id="line82" - style="stroke:rgb(0,0,0);stroke-width:1" - y2="143" - x2="577" - y1="137" - x1="577" /> - </g> - <line - x1="463" - y1="140" - x2="483" - y2="140" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line84" /> - <a - id="a4318" - title="that may contain any number of the following nodes in any order"> - <g - id="g460"> - <path - d="M432 133 L455 133 L461 139 L461 147 L455 153 L432 153 L426 147 L426 139 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path86" /> - <path - d="M429 130 L452 130 L458 136 L458 144 L452 150 L429 150 L423 144 L423 136 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path88" /> - <line - x1="428" - y1="140" - x2="432" - y2="140" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line90" /> - <line - x1="432" - y1="140" - x2="436" - y2="136" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line92" /> - <line - x1="444" - y1="136" - x2="448" - y2="136" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line94" /> - <line - x1="444" - y1="140" - x2="452" - y2="140" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line96" /> - <line - x1="444" - y1="144" - x2="448" - y2="144" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line98" /> - <line - x1="448" - y1="136" - x2="448" - y2="144" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line100" /> - <ellipse - cx="440" - cy="136" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse102" /> - <ellipse - cx="440" - cy="140" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse104" /> - <ellipse - cx="440" - cy="144" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse106" /> - <text - x="453" - y="160" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text108">0..∞</text> - <rect - x="453" - y="135" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect110" /> - <line - x1="455" - y1="140" - x2="461" - y2="140" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line112" /> - </g> - </a> - <line - x1="403" - y1="140" - x2="423" - y2="140" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line114" /> - <a - id="a4277" - href="#after-tag" - title="zero or one <after> element"> - <g - id="g444"> - <rect - x="348" - y="129" - width="50" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect116" /> - <text - x="373" - y="140" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text118">after</text> - <rect - x="393" - y="135" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect120" /> - <line - x1="395" - y1="140" - x2="401" - y2="140" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line122" /> - </g> - </a> - <a - id="a4335" - title="zero or one <annotations> element" - href="#annotations-tag"> - <g - id="g467"> - <rect - x="348" - y="181" - width="86" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect124" /> - <text - x="391" - y="192" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text126">annotations</text> - <rect - x="429" - y="187" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect128" /> - <line - x1="431" - y1="192" - x2="437" - y2="192" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line130" /> - <line - x1="434" - y1="189" - x2="434" - y2="195" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line132" /> - </g> - </a> - <line - x1="338" - y1="36" - x2="348" - y2="36" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line134" /> - <line - x1="338" - y1="88" - x2="348" - y2="88" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line136" /> - <line - x1="338" - y1="140" - x2="348" - y2="140" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line138" /> - <line - x1="338" - y1="192" - x2="348" - y2="192" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line140" /> - <line - x1="338" - y1="36" - x2="338" - y2="192" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line142" /> - <line - x1="328" - y1="114" - x2="338" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line144" /> - <a - id="a4284" - title="that may contain any number of the following nodes in any order"> - <g - id="g389"> - <path - d="M297 107 L320 107 L326 113 L326 121 L320 127 L297 127 L291 121 L291 113 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path146" /> - <path - d="M294 104 L317 104 L323 110 L323 118 L317 124 L294 124 L288 118 L288 110 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path148" /> - <line - x1="293" - y1="114" - x2="297" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line150" /> - <line - x1="297" - y1="114" - x2="301" - y2="110" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line152" /> - <line - x1="309" - y1="110" - x2="313" - y2="110" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line154" /> - <line - x1="309" - y1="114" - x2="317" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line156" /> - <line - x1="309" - y1="118" - x2="313" - y2="118" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line158" /> - <line - x1="313" - y1="110" - x2="313" - y2="118" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line160" /> - <ellipse - cx="305" - cy="110" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse162" /> - <ellipse - cx="305" - cy="114" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse164" /> - <ellipse - cx="305" - cy="118" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse166" /> - <text - x="318" - y="134" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text168">0..∞</text> - <rect - x="318" - y="109" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect170" /> - <line - x1="320" - y1="114" - x2="326" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line172" /> - </g> - </a> - <line - x1="268" - y1="114" - x2="288" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line174" /> - <a - id="a4261" - title="one or more <test> elements" - href="#test-tag"> - <g - id="g373"> - <rect - x="220" - y="106" - width="46" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect176" /> - <rect - x="217" - y="103" - width="46" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect178" /> - <text - x="240" - y="114" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text180">test</text> - <text - x="258" - y="135" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text182">1..∞</text> - <rect - x="258" - y="109" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect184" /> - <line - x1="260" - y1="114" - x2="266" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line186" /> - </g> - </a> - <line - x1="197" - y1="114" - x2="217" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line188" /> - <a - id="a4205" - title="that contains one of the following nodes"> - <g - id="g365"> - <path - d="M163 104 L186 104 L192 110 L192 118 L186 124 L163 124 L157 118 L157 110 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="path190" /> - <line - x1="162" - y1="114" - x2="166" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line192" /> - <line - x1="166" - y1="114" - x2="170" - y2="110" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line194" /> - <line - x1="178" - y1="110" - x2="182" - y2="110" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line196" /> - <line - x1="178" - y1="114" - x2="186" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line198" /> - <line - x1="178" - y1="118" - x2="182" - y2="118" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line200" /> - <line - x1="182" - y1="110" - x2="182" - y2="118" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line202" /> - <ellipse - cx="174" - cy="110" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse204" /> - <ellipse - cx="174" - cy="114" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse206" /> - <ellipse - cx="174" - cy="118" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse208" /> - <rect - x="187" - y="109" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect210" /> - <line - x1="189" - y1="114" - x2="195" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line212" /> - </g> - </a> - <line - x1="137" - y1="114" - x2="157" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line214" /> - <a - id="a4195" - title="that contains a sequence of the following nodes"> - <g - id="g351"> - <path - d="M103 104 L126 104 L132 110 L132 118 L126 124 L103 124 L97 118 L97 110 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="path216" /> - <line - x1="100" - y1="114" - x2="129" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line218" /> - <ellipse - cx="109" - cy="114" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse220" /> - <ellipse - cx="114" - cy="114" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse222" /> - <ellipse - cx="119" - cy="114" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse224" /> - <rect - x="127" - y="109" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect226" /> - <line - x1="129" - y1="114" - x2="135" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line228" /> - </g> - </a> - <line - x1="77" - y1="114" - x2="97" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line230" /> - <a - id="a499" - href="#tests-tag" - title="Root element <tests>"> - <g - id="g342"> - <rect - x="20" - y="103" - width="52" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect232" /> - <text - x="46" - y="114" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text234">tests</text> - <rect - x="67" - y="109" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect236" /> - <line - x1="69" - y1="114" - x2="75" - y2="114" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line238" /> - </g> - </a> - <a - href="test/actions.html" - title="one of <action> elements" - target="_blank" - id="a4355"> - <g - id="g497"> - <path - d="M205 233 L299 233 L305 239 L305 249 L299 255 L205 255 L199 249 L199 239 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="path240" /> - <text - x="252" - y="244" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text242">actionTypeTags</text> - <line - x1="202" - y1="252" - x2="205" - y2="249" - style="stroke:rgb(0,0,0);stroke-width:2" - id="line244" /> - <path - d="M205 249 L207 251 L208 246 L203 247 L205 249 Z" - style="fill:rgb(0,0,0)" - id="path246" /> - <rect - x="300" - y="239" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect248" /> - <line - x1="302" - y1="244" - x2="308" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line250" /> - <line - x1="305" - y1="241" - x2="305" - y2="247" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line252" /> - </g> - </a> - <a - id="a4350" - href="#argument-tag" - title="one <argument> element"> - <g - id="g471"> - <rect - x="373" - y="285" - width="70" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect254" /> - <text - x="408" - y="296" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text256">argument</text> - </g> - </a> - <line - x1="353" - y1="296" - x2="373" - y2="296" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line258" /> - <a - id="a4220" - title="that may contain multiple sequences of the following node"> - <g - id="g482"> - <path - d="M322 289 L345 289 L351 295 L351 303 L345 309 L322 309 L316 303 L316 295 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path260" /> - <path - d="M319 286 L342 286 L348 292 L348 300 L342 306 L319 306 L313 300 L313 292 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="path262" /> - <line - x1="316" - y1="296" - x2="345" - y2="296" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line264" /> - <ellipse - cx="325" - cy="296" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse266" /> - <ellipse - cx="330" - cy="296" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse268" /> - <ellipse - cx="335" - cy="296" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse270" /> - <text - x="343" - y="316" - style="font-family:Arial;font-size:7.2pt;fill:rgb(0,0,0);text-anchor:end;dominant-baseline:central" - id="text272">0..∞</text> - <rect - x="343" - y="291" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect274" /> - <line - x1="345" - y1="296" - x2="351" - y2="296" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line276" /> - </g> - </a> - <line - x1="293" - y1="296" - x2="313" - y2="296" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line278" /> - <a - id="a4343" - href="#actiongroup-tag" - target="" - title="zero or one <actionGroup> elements"> - <g - id="g488"> - <rect - x="199" - y="285" - width="89" - height="22" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1;stroke-dasharray:4,1" - id="rect280" /> - <text - x="243.5" - y="296" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text282">actionGroup</text> - <rect - x="283" - y="291" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect284" /> - <line - x1="285" - y1="296" - x2="291" - y2="296" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line286" /> - </g> - </a> - <line - x1="189" - y1="244" - x2="199" - y2="244" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line288" /> - <line - x1="189" - y1="296" - x2="199" - y2="296" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line290" /> - <line - x1="189" - y1="244" - x2="189" - y2="296" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line292" /> - <line - x1="179" - y1="270" - x2="189" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line294" /> - <a - id="a4246" - title="that contains one of the following nodes"> - <g - id="g4244"> - <path - d="M145 260 L168 260 L174 266 L174 274 L168 280 L145 280 L139 274 L139 266 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="path296" /> - <line - x1="144" - y1="270" - x2="148" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line298" /> - <line - x1="148" - y1="270" - x2="152" - y2="266" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line300" /> - <line - x1="160" - y1="266" - x2="164" - y2="266" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line302" /> - <line - x1="160" - y1="270" - x2="168" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line304" /> - <line - x1="160" - y1="274" - x2="164" - y2="274" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line306" /> - <line - x1="164" - y1="266" - x2="164" - y2="274" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line308" /> - <ellipse - cx="156" - cy="266" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse310" /> - <ellipse - cx="156" - cy="270" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse312" /> - <ellipse - cx="156" - cy="274" - rx="2" - ry="2" - style="rgb(0,0,0)" - id="ellipse314" /> - <rect - x="169" - y="265" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect316" /> - <line - x1="171" - y1="270" - x2="177" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line318" /> - </g> - </a> - <line - x1="119" - y1="270" - x2="139" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1;stroke-linecap:round" - id="line320" /> - <path - d="M26 259 L108 259 L114 265 L114 275 L108 281 L26 281 L20 275 L20 265 Z" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="path322" /> - <text - x="67" - y="270" - style="font-family:Arial;font-size:8pt;fill:rgb(0,0,0);font-weight:bold;text-anchor:middle;dominant-baseline:central" - id="text324">testTypeTags</text> - <rect - x="109" - y="265" - width="10" - height="10" - style="fill:rgb(255,255,255);stroke:rgb(0,0,0);stroke-width:1" - id="rect326" /> - <line - x1="111" - y1="270" - x2="117" - y2="270" - style="stroke:rgb(0,0,0);stroke-width:1" - id="line328" /> -</svg> diff --git a/docs/interactive-pause.md b/docs/interactive-pause.md deleted file mode 100644 index 5914c6339..000000000 --- a/docs/interactive-pause.md +++ /dev/null @@ -1,74 +0,0 @@ -# Interactive Pause - -It can be difficut to write a successful test on the first attempt. You will need to try different commands, with different arguments, before you find the correct path. - -Since Codeception 3.0, you can pause execution in any point and enter an interactive shell where you will be able to try commands in action. - -Now this `Interactive Pause` feature is available in MFTF. All you need to do is to set `ENABLE_PAUSE` to `true` in `.env`. - -Check [pause on codeception.com][] for documentation and a video to see `Interactive Pause` in action. - -In short, when a test gets to `$I->pause()` step, it stops and shows a console where you can try all available commands with auto-completion, stash commands, save screenshots, etc. - -## How to Configure Interactive Pause - -To be able to use Interactive console you need to install `hoa/console` library by running `composer require hoa/console` command in your project. This will allow `<pause />` action to work. -MFTF supports `Interactive Pause` when `ENABLE_PAUSE` is set to `true` in `<project_root>/dev/tests/acceptance/.env` file. - -## MFTF Run Commands - -```bash -vendor/bin/mftf run:group -``` - -```bash -vendor/bin/mftf run:test -``` - -```bash -vendor/bin/mftf run:manifest -``` - -```bash -vendor/bin/mftf run:failed -``` - -### Use `Interactive Pause` During Test Development - -Here is a typical work flow for this use case: - -- Set `ENABLE_PAUSE` to `true` under `.env` -- Add <pause> action in a test where you want to pause execution for debugging -- Run test -- Execution should pause at <pause> action and invoke interactive console -- Try out commands in interactive console -- Resume test execution by pressing `ENTER` - -### Use `Pause` On Test Failure - -When `ENABLE_PAUSE` is set to `true`, MFTF automatically generates `pause()` action in `_failed()` hook for tests and in `_failed()` function in `MagentoWebDriver`. -This allows you to use `pause` to debug test failure for a long running test. The work flow might look like: - -- Set `ENABLE_PAUSE` to `true` under `.env` -- Run test -- Execution pauses and invokes interactive console right after test fails -- Examine and debug on the spot of failure - -## MFTF Codecept Run Command - -You can also use MFTF's wrapper command to run Codeception directly and activate `Interactive Pause` by passing `--debug` option. -You do not need to set `ENABLE_PAUSE` to `true` for this command if you don't want to pause on test failure. - -```bash -vendor/bin/mftf codecept:run --debug -``` - -<div class="bs-callout-warning"> -<p> -Note: MFTF command "--debug" option has different meaning than Codeception command "--debug" mode option. -</p> -</div> - -<!-- Link definitions --> - -[pause on codeception.com]: https://codeception.com/docs/02-GettingStarted#Interactive-Pause diff --git a/docs/introduction.md b/docs/introduction.md deleted file mode 100644 index 73b068ba0..000000000 --- a/docs/introduction.md +++ /dev/null @@ -1,163 +0,0 @@ -# Introduction to the Magento Functional Testing Framework - -<div class="bs-callout bs-callout-info" markdown="1"> -This documentation is for MFTF 3.0, which was release in conjunction with Magento 2.4. -MFTF 3.0 is a major update and introduces many new changes and fixes. -MFTF 2 docs can be found [here][]. -</div> - -[Find your version] of MFTF. - -The Magento Functional Testing Framework (MFTF) is a framework used to perform automated end-to-end functional testing. - -## Goals - -- To facilitate functional testing and minimize the effort it takes to perform regression testing. -- Enable extension developers to provide functional tests for their extensions. -- Ensure a common standard of quality between Magento, extension developers and system integrators. - -MFTF also focuses on - -- **Traceability** for clear logging and reporting capabilities. -- **Modularity** to run tests based on installed modules and extensions. -- **Customizability** for existing tests. -- **Readability** using clear and declarative XML test steps. -- **Maintainability** based on simple test creation and overall structure. - -## Audience - -- **Contributors**: Tests build confidence about the results of changes introduced to the platform. -- **Extension Developers**: Can adjust expected behaviour according to their customizations. -- **System Integrators**: MFTF coverage provided out-of-the-box with Magento is solid base for Acceptance / Regression Tests. - -## MFTF tests - -MFTF supports two different locations for storing the tests and test artifacts: - -- `<magento_root>/app/code/<vendor_name>/<module_name>/Test/Mftf/` is the location of local, customized tests. -- `<magento_root>/vendor/<vendor_name>/<module_name>/Test/Mftf/` is location of tests provided by Magento and vendors. - -If you installed Magento with Composer, please refer to `vendor/magento/<module_dir>/Test/Mftf/` for examples. - -### Directory Structure - -The file structure under both cases is the same: - -```tree -Test -└── Mftf - ├── ActionGroup - │   └── ... - ├── Data - │   └── ... - ├── Metadata - │   └── ... - ├── Page - │   └── ... - ├── Section - │   └── ... - └── Test - └── ... -``` - -## Use cases - -- Contributor: changes the core behaviour, fixing the annoying bug. - He wants to have automated "supervisor" which is going to verify his work continuously across the stages of bug fixing. Finally, when fix is done - Functional Test is also proof of work done. -- Extension Developer: offers extension that changes core behaviour. - He can easily write new tests to make sure that after enabling the feature, Magento behaves properly. Everything with just extending existing tests. As a result he don't need to write coverage from scratch. -- Integration Agency: maintains Client's e-commerce. - They are able to customize tests delivered with Magento core to follow customizations implemented to Magento. After each upgrade they can just run the MFTF tests to know that no regression was introduced. - -## MFTF output - -- Generated PHP Codeception tests -- Codeception results and console logs -- Screenshots and HTML failure report -- Allure formatted XML results -- Allure report dashboard of results - -## Find your MFTF version - -There are two options to find out your MFTF version: - -- using the MFTF CLI -- using the Composer CLI - -All the Command Line commands needs to be executed from `<magento_root>` - -### MFTF CLI - -```bash -vendor/bin/mftf --version -``` - -### Composer CLI - -```bash -composer show magento/magento2-functional-testing-framework -``` - -## Contents of dev/tests/acceptance - -```tree -tests - _data // Additional files required for tests (e.g. pictures, CSV files for import/export, etc.) - _output // The directory is generated during test run. It contains testing reports. - _suite // Test suites. - _bootstrap.php // The script that executes essential initialization routines. - functional.suite.dist.yml // The Codeception functional test suite configuration (generated while running 'bin/mftf build:project') -utils // The test-running utilities. -.env.example // Example file for environmental settings. -.credentials.example // Example file for credentials to be used by the third party integrations (generated while running 'bin/mftf build:project'; should be filled with the appropriate credentials in the corresponding sandboxes). -.gitignore // List of files ignored by git. -.htaccess.sample // Access settings for the Apache web server to perform the Magento CLI commands. -codeception.dist.yml // Codeception configuration (generated while running 'bin/mftf build:project') -``` - -## MFTF output - -- Generated PHP Codeception tests -- Codeception results and console logs -- Screenshots and HTML failure report -- Allure formatted XML results -- Allure report dashboard of results - -## MFTF tests - -MFTF supports three different locations for storing the tests and test artifacts: -- `<magento_root>/app/code/<vendor_name>/<module_name>/Test/Mftf/` is the directory to create new tests. -- `<magento_root>/vendor/<vendor_name>/<module_name>/Test/Mftf/` is the directory with the out of the box tests (fetched by the Composer). -- `<magento_root>/dev/tests/acceptance/tests/functional/<vendor_name>/<module_name>/` is used to store tests that depend on multiple modules. - -All tests and test data from these locations are merged in the order indicated in the above list. - -Directories immediately following the above paths will use the same format, and sub-directories under each category are supported. - -```tree -<Path> -├── ActionGroup -│   └── ... -├── Data -│   └── ... -├── Metadata -│   └── ... -├── Page -│   └── ... -├── Section -│   └── ... -├── Suite -│   └── ... -└── Test - └── ... -``` - -## MFTF on Github - -Follow the [MFTF project] and [contribute on Github]. - -<!-- Link definitions --> -[contribute on Github]: https://github.com/magento/magento2-functional-testing-framework/blob/master/.github/CONTRIBUTING.md -[MFTF project]: https://github.com/magento/magento2-functional-testing-framework -[Find your version]: #find-your-mftf-version -[here]: ../v2/docs/introduction.html diff --git a/docs/merge_points/extend-action-groups.md b/docs/merge_points/extend-action-groups.md deleted file mode 100644 index 6e7a54d70..000000000 --- a/docs/merge_points/extend-action-groups.md +++ /dev/null @@ -1,102 +0,0 @@ -# Extend action groups - -Extending an action group doesn't affect the existing action group. - -In this example we add a `<click>` command to check the checkbox that our extension added with a new action group for the simple product creation form. - -## Starting action group - -<!-- {% raw %} --> - -```xml -<actionGroup name="AdminFillSimpleProductFormActionGroup"> - <arguments> - <argument name="category"/> - <argument name="simpleProduct"/> - </arguments> - <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="navigateToProductIndex"/> - <click selector="{{AdminProductGridActionSection.addProductToggle}}" stepKey="clickAddProductDropdown"/> - <click selector="{{AdminProductGridActionSection.addSimpleProduct}}" stepKey="clickAddSimpleProduct"/> - <fillField userInput="{{simpleProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="fillName"/> - <fillField userInput="{{simpleProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="fillSKU"/> - <fillField userInput="{{simpleProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="fillPrice"/> - <fillField userInput="{{simpleProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" stepKey="fillQuantity"/> - <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="[{{category.name}}]" stepKey="searchAndSelectCategory"/> - <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSection"/> - <fillField userInput="{{simpleProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="fillUrlKey"/> - <click selector="{{AdminProductFormActionSection.saveButton}}" stepKey="saveProduct"/> - <seeElement selector="{{AdminProductMessagesSection.successMessage}}" stepKey="assertSaveMessageSuccess"/> - <seeInField userInput="{{simpleProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="assertFieldName"/> - <seeInField userInput="{{simpleProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="assertFieldSku"/> - <seeInField userInput="{{simpleProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="assertFieldPrice"/> - <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSectionAssert"/> - <seeInField userInput="{{simpleProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="assertFieldUrlKey"/> -</actionGroup> -``` - -## Extend file - -```xml -<actionGroup name="AdminFillSimpleProductFormWithMyExtensionActionGroup" extends="AdminFillSimpleProductFormActionGroup"> - <!-- This will be added after the step "fillQuantity" on line 12 in the above test. --> - <click selector="{{MyExtensionSection.myCheckbox}}" stepKey="clickMyCheckbox" after="fillQuantity"/> -</actionGroup> -``` - -## Resultant action group - -Note that there are now two action groups below. - -```xml -<actionGroup name="AdminFillSimpleProductFormActionGroup"> - <arguments> - <argument name="category"/> - <argument name="simpleProduct"/> - </arguments> - <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="navigateToProductIndex"/> - <click selector="{{AdminProductGridActionSection.addProductToggle}}" stepKey="clickAddProductDropdown"/> - <click selector="{{AdminProductGridActionSection.addSimpleProduct}}" stepKey="clickAddSimpleProduct"/> - <fillField userInput="{{simpleProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="fillName"/> - <fillField userInput="{{simpleProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="fillSKU"/> - <fillField userInput="{{simpleProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="fillPrice"/> - <fillField userInput="{{simpleProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" stepKey="fillQuantity"/> - <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="[{{category.name}}]" stepKey="searchAndSelectCategory"/> - <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSection"/> - <fillField userInput="{{simpleProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="fillUrlKey"/> - <click selector="{{AdminProductFormActionSection.saveButton}}" stepKey="saveProduct"/> - <seeElement selector="{{AdminProductMessagesSection.successMessage}}" stepKey="assertSaveMessageSuccess"/> - <seeInField userInput="{{simpleProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="assertFieldName"/> - <seeInField userInput="{{simpleProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="assertFieldSku"/> - <seeInField userInput="{{simpleProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="assertFieldPrice"/> - <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSectionAssert"/> - <seeInField userInput="{{simpleProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="assertFieldUrlKey"/> -</actionGroup> -<actionGroup name="AdminFillSimpleProductFormWithMyExtensionActionGroup"> - <arguments> - <argument name="category"/> - <argument name="simpleProduct"/> - </arguments> - <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="navigateToProductIndex"/> - <click selector="{{AdminProductGridActionSection.addProductToggle}}" stepKey="clickAddProductDropdown"/> - <click selector="{{AdminProductGridActionSection.addSimpleProduct}}" stepKey="clickAddSimpleProduct"/> - <fillField userInput="{{simpleProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="fillName"/> - <fillField userInput="{{simpleProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="fillSKU"/> - <fillField userInput="{{simpleProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="fillPrice"/> - <fillField userInput="{{simpleProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" stepKey="fillQuantity"/> - - <click selector="{{MyExtensionSection.myCheckbox}}" stepKey="clickMyCheckbox"/> - - <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="[{{category.name}}]" stepKey="searchAndSelectCategory"/> - <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSection"/> - <fillField userInput="{{simpleProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="fillUrlKey"/> - <click selector="{{AdminProductFormActionSection.saveButton}}" stepKey="saveProduct"/> - <seeElement selector="{{AdminProductMessagesSection.successMessage}}" stepKey="assertSaveMessageSuccess"/> - <seeInField userInput="{{simpleProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="assertFieldName"/> - <seeInField userInput="{{simpleProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="assertFieldSku"/> - <seeInField userInput="{{simpleProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="assertFieldPrice"/> - <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSectionAssert"/> - <seeInField userInput="{{simpleProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="assertFieldUrlKey"/> -</actionGroup> -``` - -<!-- {% endraw %} --> \ No newline at end of file diff --git a/docs/merge_points/extend-data.md b/docs/merge_points/extend-data.md deleted file mode 100644 index 91d2a67bb..000000000 --- a/docs/merge_points/extend-data.md +++ /dev/null @@ -1,70 +0,0 @@ -# Extend data entities - -Extending a data entity does not affect the existing data entity. - -In this example we update the quantity to 1001 and add a new piece of data relevant to our extension. Unlike merging, this will _not_ affect any other tests that use this data entity. - -## Starting entity - -```xml -<entity name="SimpleProduct" type="product"> - <data key="sku" unique="suffix">SimpleProduct</data> - <data key="type_id">simple</data> - <data key="attribute_set_id">4</data> - <data key="name" unique="suffix">SimpleProduct</data> - <data key="price">123.00</data> - <data key="visibility">4</data> - <data key="status">1</data> - <data key="quantity">1000</data> - <data key="urlKey" unique="suffix">simpleproduct</data> - <data key="weight">1</data> - <requiredEntity type="product_extension_attribute">EavStockItem</requiredEntity> - <requiredEntity type="custom_attribute_array">CustomAttributeCategoryIds</requiredEntity> -</entity> -``` - -## Extend file - -```xml -<entity name="ExtensionProduct" type="product" extends="SimpleProduct"> - <!-- myExtensionData will simply be added to the product and quantity will be changed to 1001. --> - <data key="quantity">1001</data> - <data key="myExtensionData">dataHere</data> -</entity> -``` - -## Resultant entity - -Note that there are now two data entities below. - -```xml -<entity name="SimpleProduct" type="product"> - <data key="sku" unique="suffix">SimpleProduct</data> - <data key="type_id">simple</data> - <data key="attribute_set_id">4</data> - <data key="name" unique="suffix">SimpleProduct</data> - <data key="price">123.00</data> - <data key="visibility">4</data> - <data key="status">1</data> - <data key="quantity">1000</data> - <data key="urlKey" unique="suffix">simpleproduct</data> - <data key="weight">1</data> - <requiredEntity type="product_extension_attribute">EavStockItem</requiredEntity> - <requiredEntity type="custom_attribute_array">CustomAttributeCategoryIds</requiredEntity> -</entity> -<entity name="ExtensionProduct" type="product"> - <data key="sku" unique="suffix">SimpleProduct</data> - <data key="type_id">simple</data> - <data key="attribute_set_id">4</data> - <data key="name" unique="suffix">SimpleProduct</data> - <data key="price">123.00</data> - <data key="visibility">4</data> - <data key="status">1</data> - <data key="quantity">1001</data> - <data key="urlKey" unique="suffix">simpleproduct</data> - <data key="weight">1</data> - <requiredEntity type="product_extension_attribute">EavStockItem</requiredEntity> - <requiredEntity type="custom_attribute_array">CustomAttributeCategoryIds</requiredEntity> - <data key="myExtensionData">dataHere</data> -</entity> -``` diff --git a/docs/merge_points/extend-tests.md b/docs/merge_points/extend-tests.md deleted file mode 100644 index 763977049..000000000 --- a/docs/merge_points/extend-tests.md +++ /dev/null @@ -1,145 +0,0 @@ -# Extend tests - -Tests can be extended to cover the needs of your extension. - -In this example, we add an action group to a new copy of the original test for our extension. - -## Starting test - -```xml -<test name="AdminCreateSimpleProductTest"> - <annotations> - <features value="Catalog"/> - <stories value="Create a Simple Product via Admin"/> - <title value="Admin should be able to create a Simple Product"/> - <description value="Admin should be able to create a Simple Product"/> - <severity value="CRITICAL"/> - <testCaseId value="MAGETWO-23414"/> - <group value="product"/> - </annotations> - <before> - <createData entity="_defaultCategory" stepKey="createPreReqCategory"/> - </before> - <after> - <amOnPage url="admin/admin/auth/logout/" stepKey="amOnLogoutPage"/> - <deleteData createDataKey="createPreReqCategory" stepKey="deletePreReqCategory"/> - </after> - - <actionGroup ref="AdminLoginActionGroup" stepKey="AdminLoginActionGroup1"/> - <actionGroup ref="AdminFillSimpleProductFormActionGroup" stepKey="fillProductFieldsInAdmin"> - <argument name="category" value="$$createPreReqCategory$$"/> - <argument name="simpleProduct" value="_defaultProduct"/> - </actionGroup> - <actionGroup ref="AssertProductInStorefrontCategoryPage" stepKey="assertProductInStorefront1"> - <argument name="category" value="$$createPreReqCategory$$"/> - <argument name="product" value="_defaultProduct"/> - </actionGroup> - <actionGroup ref="AssertProductInStorefrontProductPage" stepKey="assertProductInStorefront2"> - <argument name="product" value="_defaultProduct"/> - </actionGroup> -</test> -``` - -## Extend file - -```xml -<test name="AdminCreateSimpleProductExtensionTest" extends="AdminCreateSimpleProductTest"> - <!-- Since this is its own test you need the annotations block --> - <annotations> - <features value="Catalog"/> - <stories value="Create a Simple Product via Admin"/> <!-- you should leave this the same since it is part of the same group --> - <title value="Admin should be able to create a Simple Product with my extension"/> - <description value="Admin should be able to create a Simple Product with my extension via the product grid"/> - <severity value="CRITICAL"/> - <testCaseId value="Extension/Github Issue Number"/> - <group value="product"/> - </annotations> - <!-- This will be added after the step "fillProductFieldsInAdmin" on line 20 in the above test. --> - <actionGroup ref="AddMyExtensionData" stepKey="extensionField" after="fillProductFieldsInAdmin"> - <argument name="extensionData" value="_myData"/> - </actionGroup> - - <!-- This will be added after the step "assertProductInStorefront2" on line 28 in the above test. --> - <actionGroup ref="AssertMyExtensionDataExists" stepKey="assertExtensionInformation" after="assertProductInStorefront2"> - <argument name="extensionData" value="_myData"/> - </actionGroup> -</test> -``` - -## Resultant test - -Note that there are now two tests below. - -```xml -<test name="AdminCreateSimpleProductTest"> - <annotations> - <features value="Catalog"/> - <stories value="Create a Simple Product via Admin"/> - <title value="Admin should be able to create a Simple Product"/> - <description value="Admin should be able to create a Simple Product"/> - <severity value="CRITICAL"/> - <testCaseId value="MAGETWO-23414"/> - <group value="product"/> - </annotations> - <before> - <createData entity="_defaultCategory" stepKey="createPreReqCategory"/> - </before> - <after> - <amOnPage url="admin/admin/auth/logout/" stepKey="amOnLogoutPage"/> - <deleteData createDataKey="createPreReqCategory" stepKey="deletePreReqCategory"/> - </after> - - <actionGroup ref="AdminLoginActionGroup" stepKey="AdminLoginActionGroup1"/> - <actionGroup ref="AdminFillSimpleProductFormActionGroup" stepKey="fillProductFieldsInAdmin"> - <argument name="category" value="$$createPreReqCategory$$"/> - <argument name="simpleProduct" value="_defaultProduct"/> - </actionGroup> - <actionGroup ref="AssertProductInStorefrontCategoryPage" stepKey="assertProductInStorefront1"> - <argument name="category" value="$$createPreReqCategory$$"/> - <argument name="product" value="_defaultProduct"/> - </actionGroup> - <actionGroup ref="AssertProductInStorefrontProductPage" stepKey="assertProductInStorefront2"> - <argument name="product" value="_defaultProduct"/> - </actionGroup> -</test> -<test name="AdminCreateSimpleProductExtensionTest"> - <annotations> - <features value="Catalog"/> - <stories value="Create a Simple Product via Admin"/> - <title value="Admin should be able to create a Simple Product with my extension"/> - <description value="Admin should be able to create a Simple Product with my extension via the product grid"/> - <severity value="CRITICAL"/> - <testCaseId value="Extension/Github Issue Number"/> - <group value="product"/> - </annotations> - <before> - <createData entity="_defaultCategory" stepKey="createPreReqCategory"/> - </before> - <after> - <amOnPage url="admin/admin/auth/logout/" stepKey="amOnLogoutPage"/> - <deleteData createDataKey="createPreReqCategory" stepKey="deletePreReqCategory"/> - </after> - - <actionGroup ref="AdminLoginActionGroup" stepKey="AdminLoginActionGroup1"/> - <actionGroup ref="AdminFillSimpleProductFormActionGroup" stepKey="fillProductFieldsInAdmin"> - <argument name="category" value="$$createPreReqCategory$$"/> - <argument name="simpleProduct" value="_defaultProduct"/> - </actionGroup> - - <actionGroup ref="AddMyExtensionData" stepKey="extensionField"> - <argument name="extensionData" value="_myData"/> - </actionGroup> - - <actionGroup ref="AssertProductInStorefrontCategoryPage" stepKey="assertProductInStorefront1"> - <argument name="category" value="$$createPreReqCategory$$"/> - <argument name="product" value="_defaultProduct"/> - </actionGroup> - <actionGroup ref="AssertProductInStorefrontProductPage" stepKey="assertProductInStorefront2"> - <argument name="product" value="_defaultProduct"/> - </actionGroup> - - <actionGroup ref="AssertMyExtensionDataExists" stepKey="assertExtensionInformation"> - <argument name="extensionData" value="_myData"/> - </actionGroup> -</test> -``` diff --git a/docs/merge_points/introduction.md b/docs/merge_points/introduction.md deleted file mode 100644 index af03dade6..000000000 --- a/docs/merge_points/introduction.md +++ /dev/null @@ -1,39 +0,0 @@ -# Merge Points for testing extensions in MFTF - -The Magento Functional Testing Framework (MFTF) allows great flexibility when writing XML tests for extensions. -All parts of tests can be used, reused, and merged to best suit your needs and cut down on needless duplication. - -Extension developers can utilitze these merge points to leverage existing tests and modify just the parts needed to test their extension. For instance, if your extension adds a form field to a Catalog admin page, you can modify the existing Catalog tests and add actions, data, etc as needed to test the custom field. -This topic shows how to merge and reuse test elements when testing extensions. - -## Merging - -Follow the links below for an example of how to merge: - -- [Merge Action Groups][] -- [Merge Data][] -- [Merge Pages][] -- [Merge Sections][] -- [Merge Tests][] - -## Extending - -Only Test, Action Group, and Data objects in the MFTF Framework can be extended. -Extending can be very useful for extension developers since it will not affect existing tests. - -Consult [when to use Extends][] to use extends when deciding whether to merge or extend. - -- [Extend Action Groups][] -- [Extend Data][] -- [Extend Tests][] - -<!-- Link definitions --> -[when to use Extends]: ../best-practices.md#when-to-use-extends -[Merge Action Groups]: merge-action-groups.md -[Merge Data]: merge-data.md -[Merge Pages]: merge-pages.md -[Merge Sections]: merge-sections.md -[Merge Tests]: merge-tests.md -[Extend Action Groups]: extend-action-groups.md -[Extend Data]: extend-data.md -[Extend Tests]: extend-tests.md \ No newline at end of file diff --git a/docs/merge_points/merge-action-groups.md b/docs/merge_points/merge-action-groups.md deleted file mode 100644 index ca6d20e68..000000000 --- a/docs/merge_points/merge-action-groups.md +++ /dev/null @@ -1,78 +0,0 @@ -# Merge action groups - -An action group is a set of individual actions working together as a group. -These action groups can be shared between tests and they also can be modified to your needs. - -In this example we add a `<click>` command to check the checkbox that our extension adds to the simple product creation form. - -## Starting test - -<!-- {% raw %} --> - -```xml -<actionGroup name="AdminFillSimpleProductFormActionGroup"> - <arguments> - <argument name="category"/> - <argument name="simpleProduct"/> - </arguments> - <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="navigateToProductIndex"/> - <click selector="{{AdminProductGridActionSection.addProductToggle}}" stepKey="clickAddProductDropdown"/> - <click selector="{{AdminProductGridActionSection.addSimpleProduct}}" stepKey="clickAddSimpleProduct"/> - <fillField userInput="{{simpleProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="fillName"/> - <fillField userInput="{{simpleProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="fillSKU"/> - <fillField userInput="{{simpleProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="fillPrice"/> - <fillField userInput="{{simpleProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" stepKey="fillQuantity"/> - <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="[{{category.name}}]" stepKey="searchAndSelectCategory"/> - <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSection"/> - <fillField userInput="{{simpleProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="fillUrlKey"/> - <click selector="{{AdminProductFormActionSection.saveButton}}" stepKey="saveProduct"/> - <seeElement selector="{{AdminProductMessagesSection.successMessage}}" stepKey="assertSaveMessageSuccess"/> - <seeInField userInput="{{simpleProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="assertFieldName"/> - <seeInField userInput="{{simpleProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="assertFieldSku"/> - <seeInField userInput="{{simpleProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="assertFieldPrice"/> - <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSectionAssert"/> - <seeInField userInput="{{simpleProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="assertFieldUrlKey"/> -</actionGroup> -``` - -## File to merge - -```xml -<actionGroup name="AdminFillSimpleProductFormActionGroup"> - <!-- This will be added after the step "fillQuantity" in the above test. --> - <click selector="{{MyExtensionSection.myCheckbox}}" stepKey="clickMyCheckbox" after="fillQuantity"/> -</actionGroup> -``` - -## Resultant test - -```xml -<actionGroup name="AdminFillSimpleProductFormActionGroup"> - <arguments> - <argument name="category"/> - <argument name="simpleProduct"/> - </arguments> - <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="navigateToProductIndex"/> - <click selector="{{AdminProductGridActionSection.addProductToggle}}" stepKey="clickAddProductDropdown"/> - <click selector="{{AdminProductGridActionSection.addSimpleProduct}}" stepKey="clickAddSimpleProduct"/> - <fillField userInput="{{simpleProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="fillName"/> - <fillField userInput="{{simpleProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="fillSKU"/> - <fillField userInput="{{simpleProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="fillPrice"/> - <fillField userInput="{{simpleProduct.quantity}}" selector="{{AdminProductFormSection.productQuantity}}" stepKey="fillQuantity"/> - <!-- Merged line here --> - <click selector="{{MyExtensionSection.myCheckbox}}" stepKey="clickMyCheckbox"/> - - <searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}" parameterArray="[{{category.name}}]" stepKey="searchAndSelectCategory"/> - <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSection"/> - <fillField userInput="{{simpleProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="fillUrlKey"/> - <click selector="{{AdminProductFormActionSection.saveButton}}" stepKey="saveProduct"/> - <seeElement selector="{{AdminProductMessagesSection.successMessage}}" stepKey="assertSaveMessageSuccess"/> - <seeInField userInput="{{simpleProduct.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="assertFieldName"/> - <seeInField userInput="{{simpleProduct.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="assertFieldSku"/> - <seeInField userInput="{{simpleProduct.price}}" selector="{{AdminProductFormSection.productPrice}}" stepKey="assertFieldPrice"/> - <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSectionAssert"/> - <seeInField userInput="{{simpleProduct.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="assertFieldUrlKey"/> -</actionGroup> -``` - -<!-- {% endraw %} --> \ No newline at end of file diff --git a/docs/merge_points/merge-data.md b/docs/merge_points/merge-data.md deleted file mode 100644 index b3342cc46..000000000 --- a/docs/merge_points/merge-data.md +++ /dev/null @@ -1,56 +0,0 @@ -# Merge data - -Data objects can be merged to cover the needs of your extension. - -In this example we update the `quantity` to `1001` and add a new piece of data relevant to our extension. This will affect all other tests that use this data. - -## Starting entity - -```xml -<entity name="SimpleProduct" type="product"> - <data key="sku" unique="suffix">SimpleProduct</data> - <data key="type_id">simple</data> - <data key="attribute_set_id">4</data> - <data key="name" unique="suffix">SimpleProduct</data> - <data key="price">123.00</data> - <data key="visibility">4</data> - <data key="status">1</data> - <data key="quantity">1000</data> - <data key="urlKey" unique="suffix">simpleproduct</data> - <data key="weight">1</data> - <requiredEntity type="product_extension_attribute">EavStockItem</requiredEntity> - <requiredEntity type="custom_attribute_array">CustomAttributeCategoryIds</requiredEntity> -</entity> -``` - -## File to merge - -```xml -<entity name="SimpleProduct" type="product"> - <!-- myExtensionData will simply be added to the product and quantity will be changed to 1001. --> - <data key="quantity">1001</data> - <data key="myExtensionData">dataHere</data> -</entity> -``` - -## Resultant entity - -```xml -<entity name="SimpleProduct" type="product"> - <data key="sku" unique="suffix">SimpleProduct</data> - <data key="type_id">simple</data> - <data key="attribute_set_id">4</data> - <data key="name" unique="suffix">SimpleProduct</data> - <data key="price">123.00</data> - <data key="visibility">4</data> - <data key="status">1</data> - <!-- Quantity updated --> - <data key="quantity">1001</data> - <data key="urlKey" unique="suffix">simpleproduct</data> - <data key="weight">1</data> - <requiredEntity type="product_extension_attribute">EavStockItem</requiredEntity> - <requiredEntity type="custom_attribute_array">CustomAttributeCategoryIds</requiredEntity> - <!-- Data key merged --> - <data key="myExtensionData">dataHere</data> -</entity> -``` \ No newline at end of file diff --git a/docs/merge_points/merge-pages.md b/docs/merge_points/merge-pages.md deleted file mode 100644 index c7a3e8fa8..000000000 --- a/docs/merge_points/merge-pages.md +++ /dev/null @@ -1,50 +0,0 @@ -# Merge pages - -Sections can be merged into pages to cover your extension. - -In this example we add a section that may be relevant to our extension to the list of sections underneath one page. - -## Starting page - -```xml -<page name="AdminCategoryPage" url="catalog/category/" area="admin" module="Magento_Catalog"> - <section name="AdminCategorySidebarActionSection"/> - <section name="AdminCategoryMainActionsSection"/> - <section name="AdminCategorySidebarTreeSection"/> - <section name="AdminCategoryBasicFieldSection"/> - <section name="AdminCategorySEOSection"/> - <section name="AdminCategoryProductsSection"/> - <section name="AdminCategoryProductsGridSection"/> - <section name="AdminCategoryModalSection"/> - <section name="AdminCategoryMessagesSection"/> - <section name="AdminCategoryContentSection"/> -</page> -``` - -## File to merge - -```xml -<page name="AdminCategoryPage" url="catalog/category/" area="admin" module="Magento_Catalog"> - <!-- myExtensionSection will simply be added to the page --> - <section name="MyExtensionSection"/> -</page> -``` - -## Resultant page - -```xml -<page name="AdminCategoryPage"> - <section name="AdminCategorySidebarActionSection"/> - <section name="AdminCategoryMainActionsSection"/> - <section name="AdminCategorySidebarTreeSection"/> - <section name="AdminCategoryBasicFieldSection"/> - <section name="AdminCategorySEOSection"/> - <section name="AdminCategoryProductsSection"/> - <section name="AdminCategoryProductsGridSection"/> - <section name="AdminCategoryModalSection"/> - <section name="AdminCategoryMessagesSection"/> - <section name="AdminCategoryContentSection"/> - <!-- New section merged --> - <section name="MyExtensionSection"/> -</page> -``` \ No newline at end of file diff --git a/docs/merge_points/merge-sections.md b/docs/merge_points/merge-sections.md deleted file mode 100644 index 135b3f7d8..000000000 --- a/docs/merge_points/merge-sections.md +++ /dev/null @@ -1,46 +0,0 @@ -# Merge sections - -Sections can be merged together to cover your extension. - -In this example we add another selector to the section on the products page section. - -## Starting section - -<!-- {% raw %} --> - -```xml -<section name="AdminProductsPageSection"> - <element name="addProductButton" type="button" selector="//button[@id='add_new_product-button']"/> - <element name="checkboxForProduct" type="button" selector="//*[contains(text(),'{{args}}')]/parent::td/preceding-sibling::td/label[@class='data-grid-checkbox-cell-inner']" parameterized="true"/> - <element name="actions" type="button" selector="//div[@class='col-xs-2']/div[@class='action-select-wrap']/button[@class='action-select']"/> - <element name="delete" type="button" selector="//*[contains(@class,'admin__data-grid-header-row row row-gutter')]//*[text()='Delete']"/> - <element name="ok" type="button" selector="//button[@data-role='action']//span[text()='OK']"/> - <element name="deletedSuccessMessage" type="button" selector="//*[@class='message message-success success']"/> -</section> -``` - -## File to merge - -```xml -<section name="AdminProductsPageSection"> - <!-- myExtensionElement will simply be added to the page --> - <element name="myExtensionElement" type="button" selector="input.myExtension"/> -</section> -``` - -## Resultant section - -```xml -<section name="AdminProductsPageSection"> - <element name="addProductButton" type="button" selector="//button[@id='add_new_product-button']"/> - <element name="checkboxForProduct" type="button" selector="//*[contains(text(),'{{args}}')]/parent::td/preceding-sibling::td/label[@class='data-grid-checkbox-cell-inner']" parameterized="true"/> - <element name="actions" type="button" selector="//div[@class='col-xs-2']/div[@class='action-select-wrap']/button[@class='action-select']"/> - <element name="delete" type="button" selector="//*[contains(@class,'admin__data-grid-header-row row row-gutter')]//*[text()='Delete']"/> - <element name="ok" type="button" selector="//button[@data-role='action']//span[text()='OK']"/> - <element name="deletedSuccessMessage" type="button" selector="//*[@class='message message-success success']"/> - <!-- New element merged --> - <element name="myExtensionElement" type="button" selector="input.myExtension"/> -</section> -``` - -<!-- {% endraw %} --> \ No newline at end of file diff --git a/docs/merge_points/merge-tests.md b/docs/merge_points/merge-tests.md deleted file mode 100644 index b9e50d296..000000000 --- a/docs/merge_points/merge-tests.md +++ /dev/null @@ -1,102 +0,0 @@ -# Merge tests - -Tests can be merged to create a new test that covers new extension capabilities. - -In this example we add an action group that modifies the original test to interact with our extension sending in data we created. - -## Starting test - -```xml -<test name="AdminCreateSimpleProductTest"> - <annotations> - <features value="Catalog"/> - <stories value="Create a Simple Product via Admin"/> - <title value="Admin should be able to create a Simple Product"/> - <description value="Admin should be able to create a Simple Product"/> - <severity value="CRITICAL"/> - <testCaseId value="MAGETWO-23414"/> - <group value="product"/> - </annotations> - <before> - <createData entity="_defaultCategory" stepKey="createPreReqCategory"/> - </before> - <after> - <amOnPage url="admin/admin/auth/logout/" stepKey="amOnLogoutPage"/> - <deleteData createDataKey="createPreReqCategory" stepKey="deletePreReqCategory"/> - </after> - - <actionGroup ref="AdminLoginActionGroup" stepKey="adminLoginActionGroup1"/> - <actionGroup ref="AdminFillSimpleProductFormActionGroup" stepKey="fillProductFieldsInAdmin"> - <argument name="category" value="$$createPreReqCategory$$"/> - <argument name="simpleProduct" value="_defaultProduct"/> - </actionGroup> - <actionGroup ref="AssertProductInStorefrontCategoryPage" stepKey="assertProductInStorefront1"> - <argument name="category" value="$$createPreReqCategory$$"/> - <argument name="product" value="_defaultProduct"/> - </actionGroup> - <actionGroup ref="AssertProductInStorefrontProductPage" stepKey="assertProductInStorefront2"> - <argument name="product" value="_defaultProduct"/> - </actionGroup> -</test> -``` - -## File to merge - -```xml -<test name="AdminCreateSimpleProductTest"> - <!-- This will be added after the step "fillProductFieldsInAdmin" in the above test. --> - <actionGroup ref="AddMyExtensionData" stepKey="extensionField" after="fillProductFieldsInAdmin"> - <argument name="extensionData" value="_myData"/> - </actionGroup> - - <!-- This will be added after the step "assertProductInStorefront2" in the above test. --> - <actionGroup ref="AssertMyExtensionDataExists" stepKey="assertExtensionInformation" after="assertProductInStorefront2"> - <argument name="extensionData" value="_myData"/> - </actionGroup> -</test> -``` - -## Resultant test - -```xml -<test name="AdminCreateSimpleProductTest"> - <annotations> - <features value="Catalog"/> - <stories value="Create a Simple Product via Admin"/> - <title value="Admin should be able to create a Simple Product"/> - <description value="Admin should be able to create a Simple Product"/> - <severity value="CRITICAL"/> - <testCaseId value="MAGETWO-23414"/> - <group value="product"/> - </annotations> - <before> - <createData entity="_defaultCategory" stepKey="createPreReqCategory"/> - </before> - <after> - <amOnPage url="admin/admin/auth/logout/" stepKey="amOnLogoutPage"/> - <deleteData createDataKey="createPreReqCategory" stepKey="deletePreReqCategory"/> - </after> - - <actionGroup ref="AdminLoginActionGroup" stepKey="AdminLoginActionGroup1"/> - <actionGroup ref="AdminFillSimpleProductFormActionGroup" stepKey="fillProductFieldsInAdmin"> - <argument name="category" value="$$createPreReqCategory$$"/> - <argument name="simpleProduct" value="_defaultProduct"/> - </actionGroup> - <!-- First merged action group --> - <actionGroup ref="AddMyExtensionData" stepKey="extensionField"> - <argument name="extensionData" value="_myData"/> - </actionGroup> - - <actionGroup ref="AssertProductInStorefrontCategoryPage" stepKey="assertProductInStorefront1"> - <argument name="category" value="$$createPreReqCategory$$"/> - <argument name="product" value="_defaultProduct"/> - </actionGroup> - <actionGroup ref="AssertProductInStorefrontProductPage" stepKey="assertProductInStorefront2"> - <argument name="product" value="_defaultProduct"/> - </actionGroup> - <!-- Second merged action group --> - <actionGroup ref="AssertMyExtensionDataExists" stepKey="assertExtensionInformation"> - <argument name="extensionData" value="_myData"/> - </actionGroup> -</test> -``` \ No newline at end of file diff --git a/docs/merging.md b/docs/merging.md deleted file mode 100644 index d8436492e..000000000 --- a/docs/merging.md +++ /dev/null @@ -1,569 +0,0 @@ -# Merging - -MFTF allows you to merge test components defined in XML files, such as: - -- [`<tests>`][] -- [`<pages>`][] -- [`<sections>`][] -- [`<data>`][] -- [`<action groups>`][] - -You can create, delete, or update the component. -It is useful for supporting rapid test creation for extensions and customizations. - -You can specify needed changes to an existing file and merge them to produce a modification of the original that incorporates the specified changes (the "delta"). - -Merging operates at the XML tag level, triggered by our parser when there are two (or more) entities with the same name. -Your update (XML node with changes) must have the same attribute `name` as its base node (the target object to be changed). - -For example: - -- All tests with `<test name="SampleTest>` will be merged into one. -- All pages with `<page name="SamplePage>` will be merged into one. -- All sections with `<section name="SampleSection">` will be merged into one. -- All data entities with `<entity name="sampleData" type="sample">` will be merged into one. -- All action groups with `<actionGroup name="SelectNotLoggedInCustomerGroupActionGroup">` will be merged into one. - -Although a file name does not influence merging, we recommend using the same file names in merging updates. -This makes it easier to search later on. - -## Merging precedence - -**Magento Functional Testing Framework** uses Module's `<sequence>` to merge all XML configurations into Codeception instructions. If there's no Sequence specified, MFTF would use: - -1. Vendor modules (Magento & Vendors) located in `vendor/` -1. Tests located in `app/code/*/*/Test/Mftf` - -![Usual precedence for merging MFTF Tests and resources][mftfExtendingPrecedence image] - -## Add a test - -You cannot add another [`<test>`][tests] using merging functionality. -To add a `<test>`, create a new `*Test.xml` file. - -## Remove a test - -Tests cannot be removed while merging. -If a [`<test>`][tests] must be skipped due to a module completely invalidating a function, you can use `skip` annotation to skip the test. - -Learn more about running tests with different options using [`mftf`] or [`codecept`] commands. - -### Example - -Skip the `AdminLoginSuccessfulTest` test in the `.../Backend/Test/AdminLoginSuccessfulTest.xml` file while merging with the `.../Foo/Test/AdminLoginSuccessfulTest.xml` file: - -<!-- {% raw %} --> - -```xml -<tests ...> - <test name="AdminLoginSuccessfulTest"> - <annotations> - <features value="Backend"/> - <stories value="Login on the Admin Login page"/> - <title value="Admin should be able to log into the Magento Admin backend successfully"/> - <description value="Admin should be able to log into the Magento Admin backend successfully"/> - <severity value="CRITICAL"/> - <testCaseId value="MAGETWO-71572"/> - <group value="example"/> - <group value="login"/> - </annotations> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> -</tests> -``` - -Create the `.../Foo/Test/AdminLoginSuccessfulTest.xml` file: - -```xml -<tests ...> - <test name="AdminLoginSuccessfulTest"> - <annotations> - <skip> - <issueId value="Issue#"/> - </skip> - </annotations> - </test> -</tests> -``` - -The `AdminLoginSuccessfulTest` result corresponds to: - -```xml -<test name="AdminLoginSuccessfulTest"> - <annotations> - <features value="Backend"/> - <stories value="Login on the Admin Login page"/> - <title value="Admin should be able to log into the Magento Admin backend successfully"/> - <description value="Admin should be able to log into the Magento Admin backend successfully"/> - <severity value="CRITICAL"/> - <testCaseId value="MAGETWO-71572"/> - <group value="example"/> - <group value="login"/> - <skip> - <issueId value="Issue#"/> - </skip> - </annotations> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> -</test> -``` - -## Update a test - -Any change must include information about where it should be inserted relative to other test steps in the scope of the test. - -This is done using the `before` or `after` element. -See the previous examples. - -### Add a test step - -**Use case**: Add `AdminCheckOptionSalesActionGroup` before `AssertAdminSuccessLoginActionGroup` (`stepKey="assertLoggedIn"`) and add `AdminAssertSalesOnDashboardActionGroup` after the `AssertAdminSuccessLoginActionGroup` in the `AdminLoginSuccessfulTest` test (in the `.../Backend/Test/AdminLoginSuccessfulTest.xml` file) while merging with the `.../Foo/Test/AdminLoginSuccessfulTest.xml` file: - -```xml -<tests ...> - <test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> -</tests> -``` - -Create the `.../Foo/Test/AdminLoginSuccessfulTest.xml` file: - -```xml -<tests ...> - <test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminCheckOptionSalesActionGroup" stepKey="checkOptionSales" before="assertLoggedIn"/> - <actionGroup ref="AdminAssertSalesOnDashboardActionGroup" stepKey="assertSalesOnDashboard" after="assertLoggedIn"/> - </test> -</tests> -``` - -The `AdminLoginSuccessfulTest` result corresponds to: - -```xml -<test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AdminCheckOptionSalesActionGroup" stepKey="checkOptionSales" before="assertLoggedIn"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminAssertSalesOnDashboardActionGroup" stepKey="assertSalesOnDashboard" after="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> -</test> -``` - -### Remove a test step - -**Use case**: Remove `AdminCheckOptionSalesActionGroup` (`stepKey="checkOptionSales"`) from the `LogInAsAdminTest` test (in the `.../Backend/Test/AdminLoginSuccessfulTest.xml` file) while merging with the `.../Foo/Test/AdminLoginSuccessfulTest.xml` file: - -```xml -<tests ...> - <test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AdminCheckOptionSalesActionGroup" stepKey="checkOptionSales"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> -</tests> -``` - -Create the `.../Foo/Test/AdminLoginSuccessfulTest.xml` file: - -```xml -<tests ...> - <test name="AdminLoginSuccessfulTest"> - <remove keyForRemoval="checkOptionSales"/> - </test> -</tests> -``` - -The `AdminLoginSuccessfulTest` result corresponds to: - -```xml -<test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> -</test> -``` - -### Update a test step - -**Use case**: Change argument in `AdminCheckOptionSalesActionGroup` (`stepKey="checkOptionSales"`) of the `AdminLoginSuccessfulTest` test (in the `.../Backend/Test/AdminLoginSuccessfulTest.xml` file) while merging with the `.../Foo/Test/AdminLoginSuccessfulTest.xml` file: - -```xml -<tests ...> - <test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AdminCheckOptionSalesActionGroup" stepKey="checkOptionSales"> - <argument name="salesOption" value="{{AdminSalesData.lifeTimeSales}}"/> - </actionGroup> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> -</tests> -``` - -Create the `.../Foo/Test/AdminLoginSuccessfulTest.xml` file: - -```xml -<test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AdminCheckOptionSalesActionGroup" stepKey="checkOptionSales"> - <argument name="salesOption" value="{{AdminSalesData.annualSales}}"/> - </actionGroup> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> -</test> -``` - -The `AdminLoginSuccessfulTest` result corresponds to: - -```xml -<test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AdminCheckOptionSalesActionGroup" stepKey="checkOptionSales"> - <argument name="salesOption" value="{{AdminSalesData.annualSales}}"/> - </actionGroup> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> -</test> -``` - -### Add several test steps {#insert-after} - -**Use case**: Add several action groups after the `AdminLoginActionGroup` (`stepKey="loginAsAdmin"`) in the `AdminLoginSuccessfulTest` test (in the `.../Backend/Test/AdminLoginSuccessfulTest.xml` file) while merging with the `.../Foo/Test/LogInAsAdminTest.xml` file: - -```xml -<test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> -</test> -``` - -Create the `.../Foo/Test/AdminLoginSuccessfulTest.xml` file: - -```xml -<tests ...> - <test name="AdminLoginSuccessfulTest" insertAfter="loginAsAdmin"> - <actionGroup ref="AdminCheckOptionSalesActionGroup" stepKey="checkOptionSales"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> -</tests> -``` - -The `AdminLoginSuccessfulTest` result corresponds to: - -```xml -<tests ...> - <test name="AdminLoginSuccessfulTest"> - <actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/> - <actionGroup ref="AdminCheckOptionSalesActionGroup" stepKey="checkOptionSales"/> - <actionGroup ref="AssertAdminSuccessLoginActionGroup" stepKey="assertLoggedIn"/> - <actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/> - </test> -</tests> -``` - -## Merge action groups - -Merging action groups allows you to extend existing tests by reusing existing action groups, while customizing them for your specific needs. - -### Use case - -Here is an action group for selecting `customerGroup` in the `Cart Price Rules` section. -The controls change drastically in the B2B version, so it was abstracted to an action group so that it may be easily changed if B2B is enabled. - -> Action group for selecting `customerGroup` in the `Cart Price Rules` section: - -```xml -<actionGroup name="SelectNotLoggedInCustomerGroupActionGroup"> - <selectOption selector="{{AdminCartPriceRulesFormSection.customerGroups}}" userInput="NOT LOGGED IN" stepKey="selectCustomerGroup"/> -</actionGroup> -``` - -> B2B Merge file - -```xml -<!-- name matches --> -<actionGroup name="SelectNotLoggedInCustomerGroupActionGroup"> - <!-- removes the original action --> - <remove keyForRemoval="selectCustomerGroup"/> - <!-- adds in sequence of actions to be performed instead--> - <click selector="{{AdminCartPriceRulesFormSection.customerGroups}}" stepKey="expandCustomerGroups"/> - <fillField selector="{{AdminCartPriceRulesFormSection.customerGroupsInput}}" userInput="NOT LOGGED IN" stepKey="fillCustomerGroups"/> - <click selector="{{AdminCartPriceRulesFormSection.customerGroupsFirstResult}}" stepKey="selectNotLoggedInGroup"/> - <click selector="{{AdminCartPriceRulesFormSection.customerGroupsDoneBtn}}" stepKey="closeMultiSelect"/> -</actionGroup> -``` - -## Merge pages - -Use [page] merging to add or remove [sections] in your module. - -To merge [pages][page], the `page name` must be the same as in the base module. -`page name` is set in the `module` attribute. - -### Add a section - -**Use case**: The `FooBackend` module extends the `Backend` module and requires use of two new sections that must be covered with tests. -Add `AdminBaseBackendSection` and `AdminAnotherBackendSection` to the `AdminBaseBackendPage` (`.../Backend/Page/AdminBaseBackendPage.xml` file): - -```xml -<pages ...> - <page name="AdminBaseBackendPage" url="admin" area="admin" module="Magento_Backend"> - <section name="AdminBaseBackendSection"/> - <section name="AdminAnotherBackendSection"/> - </page> -</pages> -``` - -Create the `.../FooBackend/Page/AdminBaseBackendPage.xml` file: - -```xml -<pages ...> - <page name="AdminBaseBackendPage" url="admin" area="admin" module="Magento_Backend"> - <section name="AdminNewExtensionSection"/> - </page> -</pages> -``` - -The `AdminBaseBackendPage` result corresponds to: - -```xml -<page name="AdminBaseBackendPage" url="admin" area="admin" module="Magento_Backend"> - - <section name="AdminBaseBackendSection"/> - <section name="AdminAnotherBackendSection"/> - <section name="AdminNewExtensionSection"/> -</page> -``` - -### Remove a section - -**Use case**: The `FooBackend` module extends the `Backend` module and requires deletion of the `AdminAnotherBackendSection` section (the `.../Backend/Page/AdminBaseBackendPage.xml` file): - -```xml -<page name="AdminBaseBackendPage" url="admin" area="admin" module="Magento_Backend"> - <section name="AdminBaseBackendSection"/> - <section name="AdminAnotherBackendSection"/> -</page> -``` - -Create the `.../FooBackend/Page/AdminBaseBackendPage.xml` file: - -```xml -<page name="AdminBaseBackendPage" url="admin" area="admin" module="Magento_Backend"> - <section name="AdminAnotherBackendSection" remove="true"/> -</page> -``` - -The `AdminBaseBackendPage` result corresponds to: - -```xml -<page name="AdminBaseBackendPage" url="admin" area="admin" module="Magento_Backend"> - <section name="AdminBaseBackendSection"/> -</page> -``` - -## Merge sections - -Use merging to add, remove, or update [elements] in sections. - -All sections with the same _file name_, _section name_, and _element name_ are merged during test generation. - -### Add an element - -**Use case**: The `FooBackend` module extends the `Backend` module and requires a new `mergeElement` element in the `AdminLoginFormSection`. -Add `mergeElement` to the `AdminLoginFormSection`: - -```xml -<sections ...> - <section name="AdminLoginFormSection"> - <element name="username" type="input" selector="#username"/> - <element name="password" type="input" selector="#login"/> - <element name="signIn" type="button" selector=".actions .action-primary" timeout="30"/> - </section> -</sections> -``` - -Create the `.../FooBackend/Section/AdminLoginFormSection.xml` file: - -```xml -<sections ...> - <section name="AdminLoginFormSection"> - <element name="mergeElement" type="input" selector="#selector"/> - </section> -</sections> -``` - -The `AdminLoginFormSection` result corresponds to: - -```xml -<section name="AdminLoginFormSection"> - <element name="username" type="input" selector="#username"/> - <element name="password" type="input" selector="#login"/> - <element name="signIn" type="button" selector=".actions .action-primary" timeout="30"/> - <element name="mergeElement" type="input" selector="#selector"/> -</section> -``` - -### Remove an element - -**Use case**: The `FooBackend` module extends the `Backend` module and requires deletion of `username` in the `AdminLoginFormSection`. -Remove `username` from the `AdminLoginFormSection`: - -```xml -<sections ...> - <section name="AdminLoginFormSection"> - <element name="username" type="input" selector="#username"/> - <element name="password" type="input" selector="#login"/> - <element name="signIn" type="button" selector=".actions .action-primary" timeout="30"/> - </section> -</sections> -``` - -Create the `.../FooBackend/Section/AdminLoginFormSection.xml` file: - -```xml -<sections ...> - <section name="AdminLoginFormSection"> - <element name="username" type="input" remove="true"/> - </section> -</sections> -``` - -The `AdminLoginFormSection` result corresponds to: - -```xml -<section name="AdminLoginFormSection"> - <element name="password" type="input" selector="#login"/> - <element name="signIn" type="button" selector=".actions .action-primary" timeout="30"/> -</section> -``` - -### Update an element - -**Use case**: The `FooBackend` module extends the `Backend` module and requires change of a selector in `username` in the `AdminLoginFormSection`. -Update `username` in the `AdminLoginFormSection` (the `.../Backend/Section/AdminLoginFormSection.xml` file): - -```xml -<sections ...> - <section name="AdminLoginFormSection"> - <element name="username" type="input" selector="#username"/> - <element name="password" type="input" selector="#login"/> - <element name="signIn" type="button" selector=".actions .action-primary" timeout="30"/> - </section> -</sections> -``` - -Create the `.../FooBackend/Section/AdminLoginFormSection.xml` file: - -```xml -<sections ...> - <section name="AdminLoginFormSection"> - <element name="username" type="input" selector="#newSelector"/> - </section> -</sections> -``` - -The `AdminLoginFormSection` result corresponds to: - -```xml -<section name="AdminLoginFormSection"> - <element name="username" type="input" selector="#newSelector"/> - <element name="password" type="input" selector="#login"/> - <element name="signIn" type="button" selector=".actions .action-primary" timeout="30"/> -</section> -``` - -## Merge data - -You can add or update `<data>` elements within an `<entity>`. -Removal of individual `<data>` tags is not supported. - -Entities and data with the same _file name_, _entity name and type_, and _data key_ are merged during test generation. - -### Add data - -**Use case**: The `FooSample` module extends the `Sample` module and requires a new data item `thirdField` in the `_defaultSample` entity. -Add `<data key="thirdField">field3</data>` to the `_defaultSample` (the `.../Sample/Data/SampleData.xml` file): - -```xml -<entities ...> - <entity name="_defaultSample" type="testData"> - <data key="firstField">field1</data> - <data key="secondField">field2</data> - </entity> -</entities> -``` - -Create the `.../FooSample/Data/SampleData.xml` file: - -```xml -<entities ...> - <entity name="sampleData" type="testData"> - <data key="thirdField">field3</data> - </entity> -</entities> -``` - -The `_defaultSample` result corresponds to: - -```xml -<entity name="_defaultSample" type="testData"> - <data key="firstField">field1</data> - <data key="secondField">field2</data> - <data key="thirdField">field3</data> -</entity> -``` - -### Update data - -**Use case**: The `FooSample` module extends the `Sample` module and requires changing the `firstField` data item in the `_defaultSample` entity. -Change `firstField` to `<data key="firstField">overrideField</data>` in the `_defaultSample` (the `.../Sample/Data/SampleData.xml` file): - -```xml -<entities ...> - <entity name="_defaultSample" type="testData"> - <data key="firstField">field1</data> - <data key="secondField">field2</data> - </entity> -</entity> -``` - -Create the `.../FooSample/Data/SampleData.xml` file: - -```xml -<entities ...> - <entity name="_defaultSample" type="testData"> - <data key="firstField">overrideField</data> - </entity> -</entity> -``` - -The `_defaultSample` results corresponds to: - -```xml -<entity name="_defaultSample" type="testData"> - <data key="firstField">overrideField</data> - <data key="secondField">field2</data> -</entity> -``` - -<!-- {% endraw %} --> - -<!-- Link definitions --> - -[`codecept`]: ./commands/codeception.md -[`mftf`]: ./commands/mftf.md -[`<data>`]: ./data.md -[elements]: ./section.md#element-tag -[`<pages>`]: ./page.md -[`<sections>`]: ./section.md -[`<tests>`]: ./test.md -[`<action groups>`]: ./test/action-groups.md -[mftfExtendingPrecedence image]: img/mftf-extending-precedence.png diff --git a/docs/metadata.md b/docs/metadata.md deleted file mode 100644 index 414f4bc04..000000000 --- a/docs/metadata.md +++ /dev/null @@ -1,587 +0,0 @@ -# Metadata - -In this topic we talk about handling entities that you need in your tests (such as categories, products, wish lists, and similar) using MFTF. -Using data handling actions like [`createData`], [`deleteData`], [`updateData`], and [`getData`], you are able to create, delete, update, and read entities for your tests. -The framework enables you to send HTTP requests with these statically defined data entities: - -- [Sending a REST API request][rest request] -- [Handling a REST API response][rest response] -- [Sending an HTML form encoded in URL][html form] - -You have probably noticed that some modules in acceptance functional tests contain a directory, which is called `Metadata`. - -Example of a module with _Metadata_: - -```tree -Wishlist -├── Data -├── Metadata -├── Page -├── Section -└── Test -``` - -This directory contains XML files with metadata required to create a valid request to handle an entity defined in `dataType`. -A metadata file contains a list of operations with different types (defined in `type`). -Each [operation] includes: - -- The set of adjustments for processing a request in [attributes][operation], and in some cases, a response (see `successRegex`, `returnRegex` and `returnIndex` in [reference details][operation]). -- The type of body content encoding in [contentType]. -- The body of the request represented as a tree of objects, arrays, and fields. - -When a test step requires handling the specified data entity, MFTF performs the following steps: - -- Reads input data (`<data/>`) and the type (the `type` attribute) of the specified [entity]. -- Searches the metadata operation for the `dataType` that matches the entity's `type`. For example, `<entity type="product">` matches `<operation dataType="product"`. -- Forms a request of the operation and the input data of the entity according to matching metadata. -- Stores a response and provides access to its data using MFTF variables syntax in XML. - -The following diagram demonstrates the XML structure of a metadata file: -![Structure of metadata](img/metadata-dia.svg) - -## Format {#format} - -```xml -<?xml version="1.0" encoding="UTF-8"?> -<operations xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataOperation.xsd"> - <operation name="" - dataType="" - type="" - auth="" - url="" - method=""> - <contentType></contentType> - <object key="" dataType=""> - <field key="">integer</field> - <field key="">string</field> - <field key="">boolean</field> - <array key=""> - <value>string</value> - </array> - </object> - </operation> -</operations> -``` - -## Principles {#principles} - -1. A `dataType` value must match the `type` value of the corresponding entity. -2. A file name should be PascalCase and end with `Meta.xml`. - Example: `ProductAttributeMeta.xml`. -3. A metadata file may contain different types of operations (`type`) with the same data entity (`dataType`). - -Example: - - ```xml - <operations> - <operation type="create" dataType="category"> - ... - </operation> - <operation type="update" dataType="category"> - ... - </operation> - <operation type="delete" dataType="category"> - ... - </operation> - <operation type="get" dataType="category"> - ... - </operation> - </operations> - ``` - -## Handling entities using REST API {#handling-with-api} - -### Sending a REST API request - -MFTF allows you to handle basic CRUD operations with an object using [Magento REST API][api reference] requests. -To convert a request to MFTF format, wrap the corresponding REST API request into XML tags according to the [Reference documentation][reference]. - -- GET is used for retrieving data from objects. -- POST is used for creating new objects. -- PUT is used for updating objects. -- DELETE is used for deleting objects. - -This is an example of how to handle a category using REST API operations provided by the `catalogCategoryRepositoryV1` service. - -![REST API operations provided by catalogCategoryRepositoryV1][catalogCategoryRepositoryV1 image] - -The above screenshot from the [Magento REST API Reference][api reference] demonstrates a list of available operations to: - -- Delete a category by its identifier (`method="DELETE"`) -- Get information about a category by its ID (`method="GET"`) -- [Create a new category] (`method="POST"`) -- Update category data by its ID (`method="PUT"`) - -We assume that our `.env` file sets `MAGENTO_BASE_URL=https://example.com/` and `MAGENTO_BACKEND_NAME=admin`. - -#### Create a simple category {#create-object-as-adminOauth} - -Let's see what happens when you create a category: - -```xml -<createData entity="_defaultCategory" stepKey="createPreReqCategory"/> -``` - -MFTF searches in the _Data_ directory an entity with `<entity name="_defaultCategory">` and reads `type` of the entity. -If there are more than one entity with the same name, all of the entities are merged. - -_Catalog/Data/CategoryData.xml_: - -```xml -<entity name="_defaultCategory" type="category"> - <data key="name" unique="suffix">simpleCategory</data> - <data key="name_lwr" unique="suffix">simplecategory</data> - <data key="is_active">true</data> -</entity> -``` - -Here, `type` is equal to `"category"`, which instructs MFTF to search an operation with `dataType="category"`. -Since the action is __to create__ a category, MFTF will also search for operation with `type="create"` in _Metadata_ for `dataType="category"`. - -_Catalog/Metadata/CategoryMeta.xml_: - -```xml -<operation name="CreateCategory" dataType="category" type="create" auth="adminOauth" url="/V1/categories" method="POST"> - <contentType>application/json</contentType> - <object key="category" dataType="category"> - <field key="parent_id">integer</field> - <field key="name">string</field> - <field key="is_active">boolean</field> - <field key="position">integer</field> - <field key="level">integer</field> - <field key="children">string</field> - <field key="created_at">string</field> - <field key="updated_at">string</field> - <field key="path">string</field> - <field key="include_in_menu">boolean</field> - <array key="available_sort_by"> - <value>string</value> - </array> - <field key="extension_attributes">empty_extension_attribute</field> - <array key="custom_attributes"> - <value>custom_attribute</value> - </array> - </object> -</operation> -``` - -(The corresponding operation is provided by _catalogCategoryRepositoryV1_ in [REST API][api reference].) - -The following is encoded in `<operation>`: - -- `name="CreateCategory"` defines a descriptive name of the operation, which is used for merging if needed. -- `dataType="category"` defines a relation with data entities with input data for a Category (`<entity type="category">`). -- `auth="adminOauth"` defines OAuth authorization, which is required for the Admin area. -- `url="/V1/categories"` defines a routing URL to the corresponding service class. - (The request will be sent to `https://example.com/rest/V1/categories` if `MAGENTO_BASE_URL=https://example.com/` and `MAGENTO_BACKEND_NAME=admin` are set in the _acceptance/.env_ configuration file.) -- `method="POST"` defines a POST method of the HTTP request. - -`<contentType>application/json</contentType>` defines a content type of the REST API request, which is set as `application/json` here. - -The parameter that declares a body of the request is _catalogCategoryRepositoryV1SavePostBody_. -Using the [Reference], we can trace how the JSON request was converted into XML representation. - -<div class="bs-callout bs-callout-info"> -Comments in the example below are used to demonstrate relation between JSON request and MFTF metadata in XML. -JSON does not support comments. -</div> - -Model schema for _catalogCategoryRepositoryV1SavePostBody_ with XML representation of _Catalog/Metadata/CategoryMeta.xml_ in comments: - -```json -{ // XML representation in the MFTF metadata format (see 'Catalog/Metadata/CategoryMeta.xml') - "category": { // <object key="category" dataType="category"> - "id": 0, // Skipped, because Category ID is not available on UI when you create a new category. - "parent_id": 0, // <field key="parent_id">integer</field> - "name": "string", // <field key="name">string</field> - "is_active": true, // <field key="is_active">boolean</field> - "position": 0, // <field key="position">integer</field> - "level": 0, // <field key="level">integer</field> - "children": "string", // <field key="children">string</field> - "created_at": "string", // <field key="created_at">string</field> - "updated_at": "string", // <field key="updated_at">string</field> - "path": "string", // <field key="path">string</field> - "available_sort_by": [ // <array key="available_sort_by"> - "string" // <value>string</value> - ], // </array> - "include_in_menu": true, // <field key="include_in_menu">boolean</field> - "extension_attributes": {}, // <field key="extension_attributes">empty_extension_attribute</field>, where 'empty_extension_attribute' is a reference to operation with 'dataType="empty_extension_attribute"' (see 'Catalog/Metadata/EmptyExtensionAttributeMeta.xml') - "custom_attributes": [ // <array key="custom_attributes"> - { // <value>custom_attribute</value>, where 'custom_attribute' is a reference to operation with 'dataType="custom_attribute"' (see 'Catalog/Metadata/CustomAttributeMeta.xml') - "attribute_code": "string", - "value": "string" - } - ] // </array> - } // </object> -} -``` - -So, the body of a REST API request that creates a simple category is the following: - -```json -{ // XML representation of input data used to create a simple category ("Catalog/Data/CategoryData.xml") - "category": { // <entity name="_defaultCategory" type="category"> - "name": "simpleCategory_0986576456", // <data key="name" unique="suffix">simpleCategory</data> - "is_active": true // <data key="is_active">true</data> - } // </entity> -} -``` - -#### Create an object as a guest {#create-object-as-anonymous} - -The corresponding test step is: - -```xml -<createData entity="guestCart" stepKey="createGuestCart"/> -``` - -MFTF searches in the _Data_ directory an entity with `<entity name="GuestCart">` and reads `type`. - -_Quote/Data/GuestCartData.xml_: - -```xml -<entity name="GuestCart" type="GuestCart"> -</entity> -``` - -`type="guestCart"` points to the operation with `dataType=GuestCart"` and `type="create"` in the _Metadata_ directory. - -_Catalog/Data/CategoryData.xml_: - -```xml -<operation name="CreateGuestCart" dataType="GuestCart" type="create" auth="anonymous" url="/V1/guest-carts" method="POST"> - <contentType>application/json</contentType> -</operation> -``` - -As a result, MFTF sends an unauthorized POST request with an empty body to the `https://example.com/rest/V1/guest-carts` and stores the single string response that the endpoint returns. - -### Handling a REST API response {#rest-response} - -There are cases when you need to reuse the data that Magento responded with to your POST request. - -Let's see how to handle data after you created a category with custom attributes: - -```xml -<createData entity="customizedCategory" stepKey="createPreReqCategory"/> -``` - -MFTF receives the corresponding JSON response and enables you to reference its data using a variable of format: - -**$** _stepKey_ **.** _JsonKey_ **$** - -Example: - -```xml -$createPreReqCategory.id$ -``` - -And for a custom attribute: - -**$** _stepKey_ **.custom_attributes[** _attribute key_ **]$** - -Example: - -```xml -$createPreReqCategory.custom_attributes[is_anchor]$ -``` - -The following example of response in JSON demonstrates how to reference data on the root level and as data in custom attributes: - -```json -{ - "id": 7, //$createPreReqCategory.id$ - "parent_id": 2, //$createPreReqCategory.parent_id$ - "name": "simpleCategory_0986576456", //$createPreReqCategory.is_active$ - "is_active": true, - "position": 5, - "level": 2, - "children": "", - "created_at": "2018-05-08 14:27:18", - "updated_at": "2018-05-08 14:27:18", - "path": "1/2/7", - "available_sort_by": [], - "include_in_menu": true, - "custom_attributes": [ - { - "attribute_code": "is_anchor", - "value": "1" //$createPreReqCategory.custom_attributes[is_anchor]$ - }, - { - "attribute_code": "path", - "value": "1/2/7" //$createPreReqCategory.custom_attributes[path]$ - }, - { - "attribute_code": "children_count", - "value": "0" - }, - { - "attribute_code": "url_key", - "value": "simplecategory5af1b41cd58fb4" //$createPreReqCategory.custom_attributes[url_key]$ - }, - { - "attribute_code": "url_path", - "value": "simplecategory5af1b41cd58fb4" - } - ], -} -} -``` - -## Handling entities using HTML forms {#using-html-forms} - -For cases when REST API is not applicable, you may use [HTML forms] (when all object parameters are encoded in a URL as `key=name` attributes). -There are two different attributes to split access to different areas: - -- `auth="adminFormKey"` is used for objects in an Admin area. -- `auth="customerFormKey"` is used for objects in a storefront. - -You are able to create assurances with `successRegex`, and, optionally, return values with `returnRegex`. You can also use `returnIndex` when `returnRegex` matches multiple values. - -### Create an object in Admin {#create-object-as-adminFormKey} - -The `CreateStoreGroup` operation is used to persist a store group: - -Source file is _Store/Metadata/StoreGroupMeta.xml_: - -```xml -<operation name="CreateStoreGroup" dataType="group" type="create" auth="adminFormKey" url="/admin/system_store/save" method="POST" successRegex="/messages-message-success/" > - <contentType>application/x-www-form-urlencoded</contentType> - <object dataType="group" key="group"> - <field key="group_id">string</field> - <field key="name">string</field> - <field key="code">string</field> - <field key="root_category_id">integer</field> - <field key="website_id">integer</field> - </object> - <field key="store_action">string</field> - <field key="store_type">string</field> -</operation> -``` - -The operation is called when `<createData>` (`type="create"`) points to a data entity of type `"group"` (`dataType="group"`). -It sends a POST request (`method="POST"`) to `http://example.com/admin/system_store/save` (`url="/admin/system_store/save"`) that is authorized for the Admin area (`auth="adminFormKey"`). -The request contains HTML form data encoded in the [application/x-www-form-urlencoded] content type (`<contentType>application/x-www-form-urlencoded</contentType>`). -If the returned HTML code contains the `messages-message-success` string, it is resolved as successful. - -The operation enables you to assign the following form fields: - -- `group/group_id` -- `group/name` -- `group/code` -- `group/root_category_id` -- `group/website_id` -- `store_action` -- `store_type` - -### Create an object in storefront {#create-object-as-customerFormKey} - -MFTF uses the `CreateWishlist` operation to create a wish list on storefront: - -Source file is _Wishlist/Metadata/WishlistMeta.xml_ - -```xml -<operation name="CreateWishlist" dataType="wishlist" type="create" auth="customerFormKey" url="/wishlist/index/add/" method="POST" successRegex="" returnRegex="~\/wishlist_id\/(\d*?)\/~" > - <contentType>application/x-www-form-urlencoded</contentType> - <field key="product">integer</field> - <field key="customer_email">string</field> - <field key="customer_password">string</field> -</operation> -``` - -The operation is used when `<createData>` (`type="create"`) points to a data entity of type `"wishlist"` (`dataType="wishlist"`). -It sends a POST request (`method="POST"`) to `http://example.com/wishlist/index/add/` (`url="wishlist/index/add/"`) as a customer (`auth="customerFormKey"`). -The request contains HTML form data encoded in the [application/x-www-form-urlencoded] content type (`<contentType>application/x-www-form-urlencoded</contentType>`). -If the returned HTML code contains a string that matches the regular expression `~\/wishlist_id\/(\d*?)\/~`, it returns the matching value. - -The operation assigns three form fields: - -- `product` -- `customer_email` -- `customer_password` - -## Reference - -### operations {#operations-tag} - -Root element that points to the corresponding XML Schema. - -### operation {#operation-tag} - -| Attribute | Type | Use | Description | -|-----------------|------------------------------------------------------------------------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------| -| `name` | string | optional | Name of the operation. | -| `dataType` | string | required | Data type of the operation. It refers to a `type` attribute of data entity that will be used as a source of input data. | -| `type` | Possible values: `create`, `delete`, `update`, `get`. | required | Type of operation. | -| \*`url` | string | optional | A routing URL of the operation. Example value: `"/V1/categories"`. | -| \*\*`auth` | Possible values: `adminOath`, `adminFormKey`, `customerFormKey`, `anonymous` | optional | Type of authorization of the operation. | -| `method` | string | optional | HTTP method of the operation. Possible values: `POST`, `DELETE`, `PUT`, `GET`. | -| `successRegex` | string | optional | Determines if the operation was successful. Parses the HTML body in response and asserts if the value assigned to the `successRegex` exists. | -| `returnRegex` | string | optional | Determines if the response contains the matching value to return. | -| `returnIndex` | string | optional | Specifies index at which the value will be returned when `returnRegex` matches multiple values | -| `removeBackend` | boolean | optional | Removes backend name from requested URL. Applicable when `auth="adminFormKey"`. | -| `filename` | string | optional | | -|`deprecated`|string|optional|Used to warn about the future deprecation of the test. String will appear in Allure reports and console output at runtime.| - -- \*`url` - full URL is a concatenation of _ENV.baseUrl_ + `/rest/` + _url_. - To reuse data of a required entity or returned response use a field key wrapped in curly braces such as `{sku}`. - When the data to reuse is of a different type, declare also the type of data such as `{product.sku}`. - Example: `"/V1/products/{product.sku}/media/{id}"`. - -- \*\*`auth` - available values: - - - `adminOath` is used for REST API persistence in the Admin area with [OAuth-based authentication][oauth]. - - `adminFormKey` is used for HTML form persistence in the Admin area. - - `customerFormKey` is used for HTML form persistence in the Customer area. - - `anonymous` is used for REST API persistence without authorization. - -### contentType {#contentType-tag} - -Sets one of the following operation types: - -- `application/json` is used for REST API operations. -- `application/x-www-form-urlencoded` is used for HTML form operations. - -### object {#object-tag} - -Representation of a complex entity that may contain fields, arrays, and objects. -An object must match the [entity] of the same `type`. - -| Attribute | Type | Use | Description | -| ---------- | ------- | -------- | ---------------------------------------------------------------------------------------------- | -| `key` | string | optional | Name of the object. | -| `dataType` | string | required | Type of the related [entity]. | -| `required` | boolean | optional | Determines if the object is required or not. It must match the Magento REST API specification. | - -### field {#field-tag} - -Representation of HTML form or REST API fields. - -| Attribute | Type | Use | Description | -| ---------- | ------- | -------- | --------------------------------------------------------------------------------------------- | -| `key` | string | required | Name of the field. It must match the field name of the related [entity]. | -| `type` | string | optional | Type of the value. It may contain a primitive type or the type of another operation. | -| `required` | boolean | optional | Determines if the field is required or not. It must match the Magento REST API specification. | - -### array {#array-tag} - -Representation of an array. - -| Attribute | Type | Use | Description | -| --------- | ------ | -------- | ------------------ | -| `key` | string | required | Name of the array. | - -It contains one or more `value` elements. - -### value {#value-tag} - -Declares a data type for items within `<array>`. - -#### Example of an array with value of a primitive data type - -Metadata declaration of the operation schema: - -```xml -<array key="tax_rate_ids"> - <value>integer</value> -</array> -``` - -The value can contain one or more items. - -Data entity with the corresponding assignment: - -```xml -<array key="tax_rate_ids"> - <item>1</item> - <item>2</item> -</array> -``` - -- Resulted JSON request: - -```json -"tax_rate_ids": - [ - "item": 1, - "item": 2 - ] -``` - -#### Example of an array containing data entities - -```xml -<array key="product_options"> - <value>product_option</value> -</array> -``` - -The value declares the `product_options` array that contains one or more entities of the `product_option` data type. - -#### Example of an array containing a particular data field - -```xml -<array key="tax_rate_ids"> - <value>tax_rate.id</value> -</array> -``` - -The value declares the `tax_rate_ids` array that contains one or more `id` fields of the `tax_rate` data type entity. - -### header {#header-tag} - -An additional parameter in REST API request. - -| Attribute | Type | Use | Description | -| --------- | ------ | -------- | ---------------------------- | -| `param` | string | required | A REST API header parameter. | - -```xml -<header param="status">available</header> -``` - -### param {#param-tag} - -An additional parameter in URL. - -| Attribute | Type | Use | Description | -| --------- | ------ | -------- | -------------------------- | -| `key` | string | required | Name of the URL parameter. | - -Example: - -```xml -<param key="status">someValue</param> -``` - -<!-- LINK DEFINITIONS --> - -[actions]: test/actions.md -[api reference]: https://devdocs.magento.com/guides/v2.4/get-started/bk-get-started-api.html -[application/x-www-form-urlencoded]: https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1 -{:target="_blank"} -[catalogCategoryRepositoryV1 image]: img/catalogCategoryRepository-operations.png -[catalogCategoryRepositoryV1SavePostBody]: #catalogCategoryRepositoryV1SavePostBody -[contentType]: #contentType-tag -[Create a new category]: #create-object-as-adminOauth -[createData]: test/actions.md#createdata -[delete a category by its ID]: #delete-object-as-adminOauth -[deleteData]: test/actions.md#deletedata -[entity]: data.md#entity-tag -[get information about a category by its ID]: #get-object-as-adminOauth -[getData]: test/actions.md#getdata -[HTML forms]: https://www.w3.org/TR/html401/interact/forms.html -{:target="\_blank"} -[oauth]: https://devdocs.magento.com/guides/v2.4/get-started/authentication/gs-authentication-oauth.html -{:target="\_blank"} -[operation]: #operation-tag -[reference]: #reference -[rest request]: #handling-with-api -[html form]: #using-html-forms -[update category data by its ID]: #update-object-as-adminOauth -[updateData]: test/actions.md#updatedata -[rest response]: #rest-response - -*[CRUD]: Create Read Update Delete -*[MFTF]: Magento Functional Testing Framework diff --git a/docs/mftf-tests-packaging.md b/docs/mftf-tests-packaging.md deleted file mode 100644 index 8a37b8013..000000000 --- a/docs/mftf-tests-packaging.md +++ /dev/null @@ -1,58 +0,0 @@ -<style> -.mftf-dl { - margin-bottom: 2.5em; -} -dl dt{ - font-weight:400; -} -</style> - -# MFTF functional test modules and packaging - -## MFTF predefined test module paths -The Magento Functional Testing Framework can run tests from predefined paths and custom paths. The predefined paths are: -``` -app/code/<Vendor>/<Module>/Test/Mftf -dev/tests/acceptance/tests/functional/<Vendor>/<TestModule> -vendor/<Vendor>/<Module>/Test/Mftf -vendor/<Vendor>/<TestModule> -``` - -To support future service isolation, Test module in `dev/tests/acceptance/tests/functional/<Vendor>/<TestModule>` and -`vendor/<Vendor>/<TestModule>` must define the module type as `magento2-functional-test-module` in its `composer.json` file. -No `composer.json` file is required for tests in `app/code/<Vendor>/<Module>/Test/Mftf` and `vendor/<Vendor>/<Module>/Test/Mftf` -as they are part of the Magento modules. - -Test module for a specific Magento module can only be in one of the paths. - -## Test module composer.json format - -Test module `composer.json` file should use type `magento2-functional-test-module`. - -Test module `composer.json` file should define Magento module dependencies in suggests block. -MFTF will recognize the dependency if the suggest message of a module specifies `type` using `magento2-module` and `name` -using module name registered with Magento. - -Here is an example `composer.json` file for the test module `dev/tests/acceptance/tests/functional/Magento/ConfigurableProductCatalogSearch`: - -```json -{ - "name": "magento/module-configurable-product-catalog-search-functional-test", - "description": "MFTF test module for Magento_ConfigurableProduct and Magento_CatalogSearch", - "type": "magento2-functional-test-module", - "config": { - "sort-packages": true - }, - "require": { - "magento/magento2-functional-testing-framework": ">=2.5" - }, - "suggest": { - "magento/module-configurable-product": "type: magento2-module, name: Magento_ConfigurableProduct, version: *", - "magento/module-catalog-search": "type: magento2-module, name: Magento_CatalogSearch, version: *" - }, - "license": [ - "OSL-3.0", - "AFL-3.0" - ] -} -``` \ No newline at end of file diff --git a/docs/page.md b/docs/page.md deleted file mode 100644 index fd03cfd58..000000000 --- a/docs/page.md +++ /dev/null @@ -1,174 +0,0 @@ -# Page structure - -MFTF uses a modified concept of [PageObjects], which models the testing areas of your page as objects within the code. -This reduces occurrences of duplicated code and enables you to fix things quickly, in one place, when things change. -You define the contents of a page, for reference in a [`<test>`], at both the [`<page>`] and [`<section>`] level. - -The `pageObject` lists the URL of the `page` and the `sections` that it contains. -You can reuse `sections` to define the elements on a page that are exercisable, while also ensuring a single source of truth to help maintain consistency. - -Avoid hard-coded location selectors from tests to increase the maintainability and readability of the tests, as well as improve the test execution output and logging. - -Two types of pages are available: - -<!-- {% raw %} --> - -- Page with `url` declared as a constant string or [explicit page] - In a test it is called in a format like `{{NameOfPage.url}}`, where `NameOfPage` is a value of `name` in the corresponding page declaration `*.xml` file. -- Page with `url` declared as a string with one or more variables or [parameterized page] -- In a test it is called using a format like `{{NameOfPage.url(var1, var2, ...)}}`, where `var1, var2` etc. are parameters that will be substituted in the `url` of the corresponding `<page>` declaration. - -The following diagram shows the XML structure of an MFTF page: - -![XML Structure of MFTF Page](img/page-dia.svg) - -## Format - -The format of `<page>` is: - -```xml -<?xml version="1.0" encoding="UTF-8"?> - -<pages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/PageObject.xsd"> - <page name="" url="" module="" area=""> - <section name=""/> - <section name=""/> - </page> -</pages> -``` - -## Principles - -The following conventions apply to MFTF pages: - -- `<page>` name is the same as the file name. -- `<page>` name must be alphanumeric. -- `*Page.xml` is stored in the _Page_ directory of a module. -- The name format is `{Admin|Storefront}{PageDescription}Page.xml`. -- One `<page>` tag is allowed per page XML file. - -The `.url` attribute is required when using the page for [actions] that require the URL argument. - -## Page examples - -These examples demonstrate explicit and parameterized pages and include informative explanations. - -### Explicit page - -Example (_Catalog/Page/AdminCategoryPage.xml_ file): - -```xml -<?xml version="1.0" encoding="UTF-8"?> - -<pages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/PageObject.xsd"> - <page name="AdminCategoryPage" url="catalog/category/" module="Magento_Catalog" area="admin"> - <section name="AdminCategorySidebarActionSection"/> - <section name="AdminCategorySidebarTreeSection"/> - <section name="AdminCategoryBasicFieldSection"/> - <section name="AdminCategorySEOSection"/> - </page> -</pages> -``` - -In this example, the _Catalog/Page/AdminCategoryPage.xml_ file declares a page with the name `AdminCategoryPage`. -It will be merged with the other `AdminCategoryPage` pages from other modules. - -The corresponding web page is generated by the Magento Catalog module and is called by the `baseUrl` + `backendName` + `catalog/category/` URl. - -The `AdminCategoryPage` declares four [sections][section]: - -- `AdminCategorySidebarActionSection` - located in the `Catalog/Section/AdminCategorySidebarActionSection.xml` file -- `AdminCategorySidebarTreeSection` - located in the `Catalog/Section/AdminCategorySidebarTreeSection.xml` file -- `AdminCategoryBasicFieldSection` - located in the `Catalog/Section/AdminCategoryBasicFieldSection.xml` file -- `AdminCategorySEOSection` - located in the `Catalog/Section/AdminCategorySEOSection.xml` file - -The following is an example of a call in test: - -```xml -<amOnPage url="{{AdminCategoryPage.url}}" stepKey="navigateToAdminCategory"/> -``` - -### Parameterized page - -Example (_Catalog/Page/StorefrontCategoryPage.xml_ file): - -```xml -<?xml version="1.0" encoding="UTF-8"?> - -<pages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/PageObject.xsd"> - <page name="StorefrontCategoryPage" url="/{{var1}}.html" module="Magento_Catalog" parameterized="true" area="storefront"> - <section name="StorefrontCategoryMainSection"/> - </page> -</pages> -``` - -This example shows the page with the name `StorefrontCategoryPage`. -It will be merged with the other `StorefrontCategoryPage` pages from other modules. - -The following is an example of a call in a test: - -```xml -<amOnPage url="{{StorefrontCategoryPage.url($createPreReqCategory.name$)}}" stepKey="navigateToCategoryPage"/> -``` - -The `StorefrontCategoryPage` page is declared as parameterized, where the `url` contains a `{{var1}}` parameter. - -The corresponding web page is generated by the Magento Catalog module and is called by the `baseUrl`+`/$createPreReqCategory.name$.html` URl. - -`{{var1}}` is substituted with the `name` of the previously created category in the `createPreReqCategory` action. - -See also [`<createData>`]. - -**** - -The `StorefrontCategoryPage` page declares only the `StorefrontCategoryMainSection` [section], which is located in the `Catalog/Section/StorefrontCategoryMainSection.xml` file. - -## Elements reference - -There are several XML elements that are used in `<page>` in the MFTF. - -### pages {#pages-tag} - -`<pages>` are elements that point to the corresponding XML Schema location. -It contains only one `<page>` element. - -### page {#page-tag} - -`<page>` contains a sequence of UI sections in a page. - -Attributes|Type|Use|Description ----|---|---|--- -`name`|string|required|Unique page name identifier. -`url`|string|required|URL path (excluding the base URL) for the page. Use parameterized notation (`{{var1}}`) for replaceable parameters, such as the edit page for a persisted entity that is based on an ID or a name. -`module`|string|required|Name of the module to which the page belongs. The name must be prefixed with a vendor name. It corresponds to the parent directory where the module with tests is stored. Example: `"Magento_Catalog"`. -`area`|string|required|The area where this page lives. Three possible values: `admin` prepends `BACKEND_NAME` to `url`, `storefront` does not prepend anything to `url`, `external` flags the page for use with `amOnUrl`. The `url` provided must be a full URL, such as `http://myFullUrl.com/`, instead of the URL for a Magento page. -`parameterized`|boolean |optional|Include and set to `"true"` if the `url` for this page has parameters that need to be replaced for proper use. -`remove`|boolean|optional|The default value is `"false"`. Set to `"true"` to remove this element during parsing. -`deprecated`|string|optional|Used to warn about the future deprecation of the data entity. String will appear in Allure reports and console output at runtime. - -`<page>` may contain several [`<section>`] elements. - -<!-- {% endraw %} --> - -### section {#section-tag} - -`<section>` contains the sequence of UI elements. -A section is a reusable piece or part of a page. - -Attributes|Type|Use|Description ----|---|---|--- -`name`|string|required|Unique section name identifier. -`remove`|boolean|optional|The default value is `"false"`. Set to `"true"` to remove this element during parsing. - -<!-- Link definitions --> -[`<createData>`]: test/actions.md#createdata -[`<page>`]: #page-tag -[`<section>`]: #section-tag -[`<test>`]: test.md -[actions]: test/actions.md -[explicit page]: #explicit-page -[PageObjects]: https://github.com/SeleniumHQ/selenium/wiki/PageObjects -[parameterized page]: #parameterized-page -[section]: section.md diff --git a/docs/reporting.md b/docs/reporting.md deleted file mode 100644 index 225890fcb..000000000 --- a/docs/reporting.md +++ /dev/null @@ -1,313 +0,0 @@ -# Reporting - -The Magento Functional Testing Framework provides two types of reporting: - -- Inline reporting that you can view in the terminal as you run [`mftf`][mftf] or [`codecept`][codecept] CLI commands. -- HTML reports that you can view using the [Allure Framework][] after a test run completes. - -When you run a test, MFTF copies all reporting artifacts to the `dev/tests/acceptance/tests/_output` subdirectory in the Magento root directory. -The directory contains: - -- `allure-results/` that is a directory generated and served by the Allure Framework. -- `failed` that is a text file containing relative paths to failed tests after the last test run. - The paths are relative to `dev/tests/acceptance/`. -- `.html` and `.png` files that are screenshots of fails in HTML and PNG formats. - To cleanup the `_output/` directory, remove them manually. - -The `mftf` tool logs output continuously to the `dev/tests/acceptance/mftf.log` file. - -## Command line - -MFTF reports about its progress during test run when you run the `mftf` CLI tool with [`run:test`][] or [`run:group`][] commands. - -The report can contain three main parts: - -- Pre-run checks: - - Environment check, such as PHP warnings, etc. - - XML test validation like deprecation warnings such as missing required components in XML tests. -- Codeception report which is the progress report for each test. -- Total results of the test run such as number of tests, assertions, and failures. - -To manage the level of verbosity, use `-v` or `--verbose` flag in the `mftf` commands. -To enable verbosity using the `codecept` commands, refer to the Codeception [Console Commands][codeception]. - -The following sections demonstrate an example interpretation of a complete log separated into chunks. - -### Pre-run check report - -First, MFTF returns `DEPRECATION` warnings alerting you that required test components are missing in XML test definitions. - -```terminal -DEPRECATION: Test AdminFilteringCategoryProductsUsingScopeSelectorTest is missing required annotations.{"testName":"AdminFilteringCategoryProductsUsingScopeSelectorTest","missingAnnotations":"stories"} -DEPRECATION: Test AdminAbleToShipPartiallyInvoicedItemsTest is missing required annotations.{"testName":"AdminAbleToShipPartiallyInvoicedItemsTest","missingAnnotations":"stories"} -DEPRECATION: Test AdminRemoveProductWeeeAttributeOptionTest is missing required annotations.{"testName":"AdminRemoveProductWeeeAttributeOptionTest","missingAnnotations":"stories"} -Generate Tests Command Run -``` - -`Generate Tests Command Run` indicates that test generation is finished and tests are able to be executed. - -### Test execution report - -A test execution report is generated by Codeception and includes configuration information, scenario execution steps, and PASSED/FAIL verdict after each test completion. - -#### General information - -The general information can be useful for MFTF contributors, but can be ignored by a test writer. - -Let's consider the general part of the following test execution report: - -```terminal -Generate Tests Command Run -Codeception PHP Testing Framework v4.1.4 -Powered by PHPUnit 9.1.3 by Sebastian Bergmann and contributors. -Running with seed: - -Magento\FunctionalTestingFramework.functional Tests (2) ------------------------ -Modules: \Magento\FunctionalTestingFramework\Module\MagentoWebDriver, \Magento\FunctionalTestingFramework\Module\MagentoSequence, \Magento\FunctionalTestingFramework\Module\MagentoAssert, \Magento\FunctionalTestingFramework\Module\MagentoActionProxies, Asserts, \Magento\FunctionalTestingFramework\Helper\HelperContainer -``` - -After the test generation command (mentioned in the previous section), MFTF delegates control to the `vendor/codeception` tool, which is the `Codeception PHP Testing Framework` of version `4.1.4` that uses `PHPUnit` of version `9.1.3`. - -The tool runs `2 Tests` using the configuration defined in the `functional` suite under the `Magento\FunctionalTestingFramework` namespace. -The corresponding configuration file is `acceptance/tests/functional.suite.yml`. -It enables `Modules: \Magento\FunctionalTestingFramework\Module\MagentoWebDriver, \Magento\FunctionalTestingFramework\Module\MagentoSequence, \Magento\FunctionalTestingFramework\Module\MagentoAssert, \Magento\FunctionalTestingFramework\Module\MagentoActionProxies, Asserts, \Magento\FunctionalTestingFramework\Helper\HelperContainer,..` - -#### Passed tests - -The next chunk of the log reports about test execution of the first test: - -```terminal -AdminLoginSuccessfulTestCest: Admin login successful test -Signature: Magento\AcceptanceTest\_default\Backend\AdminLoginSuccessfulTestCest:AdminLoginSuccessfulTest -Test: tests/functional/Magento/_generated/default/AdminLoginSuccessfulTestCest.php:AdminLoginSuccessfulTest -Scenario -- -[loginAsAdmin] AdminLoginActionGroup - [navigateToAdmin] am on page "/admin/admin" - [fillUsername] fill field "#username","admin" - [fillPassword] fill field "#login","123123q" - [clickLogin] click ".actions .action-primary" - [clickLoginWaitForPageLoad] wait for page load 30 - [clickDontAllowButtonIfVisible] conditional click ".modal-popup .action-secondary",".modal-popup .action-secondary",true - [closeAdminNotification] close admin notification -[assertLoggedIn] AssertAdminSuccessLoginActionGroup - [waitForAdminAccountTextVisible] wait for element visible ".page-header .admin-user-account-text",60 - [assertAdminAccountTextElement] see element ".page-header .admin-user-account-text" -[logoutFromAdmin] AdminLogoutActionGroup - [amOnLogoutPage] am on page "/admin/admin/auth/logout/" - PASSED -``` - -The running test is `AdminLoginSuccessfulTestCest`, which is `Admin login successful test` (this text is generated from the test name but with the `Cest` part excluded). -Its test signature is `Magento\AcceptanceTest\_default\Backend\AdminLoginSuccessfulTestCest:AdminLoginSuccessfulTest` that matches a `className:methodName` format using namespaces. -A path to the corresponding `Test` is `tests/functional/Magento/_generated/default/AdminLoginSuccessfulTestCest.php:AdminLoginSuccessfulTest` (relative to the `acceptance/` directory). - -`Scenario` lists the tests steps as they run during test execution, ending with the successful test verdict `PASSED`. -It means that all test steps were processed as expected. - -#### Failed tests - -The second test fails with the following report: - -```terminal -AdminMenuNavigationWithSecretKeysTestCest: Admin menu navigation with secret keys test -Signature: Magento\AcceptanceTest\_default\Backend\AdminMenuNavigationWithSecretKeysTestCest:AdminMenuNavigationWithSecretKeysTest -Test: tests/functional/Magento/_generated/default/AdminMenuNavigationWithSecretKeysTestCest.php:AdminMenuNavigationWithSecretKeysTest -Scenario -- -[enableUrlSecretKeys] magento cli "config:set admin/security/use_form_key 1",60 -Value was saved. - -[cleanInvalidatedCaches1] magento cli "cache:clean config full_page",60 -Cleaned cache types: -config -full_page - -[loginAsAdmin] AdminLoginActionGroup - [navigateToAdmin] am on page "/admin/admin" - [fillUsername] fill field "#username","admin" - [fillPassword] fill field "#login","123123q" - [clickLogin] click ".actions .action-primary" - [clickLoginWaitForPageLoad] wait for page load 30 - [clickDontAllowButtonIfVisible] conditional click ".modal-popup .action-secondary",".modal-popup .action-secondary",true - [closeAdminNotification] close admin notification -[clickStoresMenuOption1] click "#menu-magento-backend-stores" -[waitForStoresMenu1] wait for loading mask to disappear -[clickStoresConfigurationMenuOption1] click "#nav li[data-ui-id='menu-magento-config-system-config']" -[waitForConfigurationPageLoad1] wait for page load 60 -[seeCurrentUrlMatchesConfigPath1] see current url matches "~\/admin\/system_config\/~" -[clickCatalogMenuOption] click "#something" -[saveScreenshot] save screenshot -[disableUrlSecretKeys] magento cli "config:set admin/security/use_form_key 0",60 -Value was saved. - -[cleanInvalidatedCaches2] magento cli "cache:clean config full_page",60 -Cleaned cache types: -config -full_page - -[logout] AdminLogoutActionGroup - [amOnPage] am on page "/admin/admin/auth/logout/" - FAIL --------------------------------------------------------------------------------- -``` - -The general test details and scenario has the same format as in the Passed test. - -```terminal -[clickCatalogMenuOption] click "#something" -[saveScreenshot] save screenshot -``` - -When a test step fails, MFTF always saves a screenshot of the web page with the failing state immediately after the failure occurs. -`[saveScreenshot] save screenshot` follows the failing test step `[clickCatalogMenuOption] click "#something"` in our case. - -A screenshot of the fail goes at the `acceptance/tests/_output` directory in both PNG and HTML formats: - -- `Magento.AcceptanceTest._default.Backend.AdminMenuNavigationWithSecretKeysTestCest.AdminMenuNavigationWithSecretKeysTest.fail.html` -- `Magento.AcceptanceTest._default.Backend.AdminMenuNavigationWithSecretKeysTestCest.AdminMenuNavigationWithSecretKeysTest.fail.png` - -The file name encodes: - -- `Magento` namespace -- with the `AcceptanceTest` test type -- generated as a part of the `_default` suite -- defined at the `Magento_Backend` module -- implemented in the `AdminMenuNavigationWithSecretKeysTestCest` PHP class -- with the `AdminMenuNavigationWithSecretKeysTest` test name -- and execution status `fail` - -Actions after `saveScreenshot` are run as a part of the [`after`][] hook of the test. - -### Test result report - -After MFTF completed test execution, it generates a general report about test results along with detailed information about each fail. - -```terminal -Time: 02:07.534, Memory: 150.50 MB - -There was 1 failure: ---------- -``` -MFTF reports that the test run took 02:07.534 using 150.50 MB of system RAM. -And, finally, that there was `1 failure`. - -Next, the report provides details about the test failure. - -```terminal ---------- -1) AdminMenuNavigationWithSecretKeysTestCest: Admin menu navigation with secret keys test - Test tests/functional/Magento/_generated/default/AdminMenuNavigationWithSecretKeysTestCest.php:AdminMenuNavigationWithSecretKeysTest - Step Click "#something" - Fail CSS or XPath element with '#something' was not found. - -Scenario Steps: - - 27. // Exiting Action Group [logout] AdminLogoutActionGroup - 26. $I->amOnPage("/admin/admin/auth/logout/") at tests/functional/Magento/_generated/default/AdminMenuNavigationWithSecretKeysTestCest.php:55 - 25. // Entering Action Group [logout] AdminLogoutActionGroup - 24. // Cleaned cache types: -config -full_page - - 23. $I->magentoCLI("cache:clean config full_page",60) at tests/functional/Magento/_generated/default/AdminMenuNavigationWithSecretKeysTestCest.php:52 - 22. // Value was saved. -``` - -- `1) AdminMenuNavigationWithSecretKeysTestCest: Admin menu navigation with secret keys test` - the failed Codeception test is *AdminMenuNavigationWithSecretKeysTestCest*. It references to the PHP class that implemented the failed test. - -- `Test tests/functional/Magento/_generated/default/AdminMenuNavigationWithSecretKeysTestCest.php:AdminMenuNavigationWithSecretKeysTest` - the test is implemented in the *AdminMenuNavigationWithSecretKeysTest* test method of the *tests/functional/Magento/FunctionalTest/_generated/default/AdminMenuNavigationWithSecretKeysTestCest.php* file under `<magento root>/dev/tests/acceptance/`. - It matches the corresponding test defined in XML that is *AdminMenuNavigationWithSecretKeysTest* defined in `<test name="AdminMenuNavigationWithSecretKeysTest">...</test>` - -- `Step Click "#something"` - the failing test step is the *click* action with the *#something* selector. It would correspond the `<click selector="#something" ... />` test step in the XML defined tests. - -Finally, the report finishes with fairly self-descriptive lines. - -```terminal -FAILURES! -Tests: 2, Assertions: 2, Failures: 1. -``` - -MFTF encountered failures due to the last test run, that included *2* tests with *2* assertions. -*1* assertion fails. - -## Allure - -Each time you run tests, MFTF appends an XML file with results at the `tests/_output/allure-results/` directory. - -The official [Allure Test Report][] documentation is well-covered, so we'll list only the CLI commands that you would need for your day-to-day work. - -<div class="bs-callout bs-callout-info"> -The following commands are relative to the Magento installation directory. -</div> - -To generate the HTML Allure report in a temporary folder and open the report in your default web browser: - -```bash -allure serve dev/tests/acceptance/tests/_output/allure-results/ -``` - -To generate a report to the `allure-report/` at the current directory: - -```bash -allure generate dev/tests/acceptance/tests/_output/allure-result -``` - -To generate a report to a particular directory, use the `-o` option: - -```bash -allure generate dev/tests/acceptance/tests/_output/allure-result -o dev/tests/acceptance/tests/_output/allure-report -``` - -To launch the generated report in a web browser: - -```bash -allure open dev/tests/acceptance/tests/_output/allure-report -``` - -<div class="bs-callout bs-callout-info" markdown="1"> -By default, Allure generates reports in the `allure-report/` at the current directory. -For example, if you run the command without `-o` flag while you are in the `magento2/` directory, Allure will generate a report at the `magento2/allure-report/` directory. -</div> - -```bash -allure generate dev/tests/acceptance/tests/_output/allure-result -``` - -Example of file structure after the command run: - -```terminal -magento2 -├── allure-report -├── app -├── bin -├── dev -├── ... -``` - -And if you run the `open` command with no arguments while you are in the same directory (`magento2/`): - -```bash -allure open -``` - -Allure would attempt to open a generated report at the `magento2/allure-report/` directory. - -To clean up existing reports before generation (for example after getting new results), use the `--clean` flag: - -```bash -allure generate dev/tests/acceptance/tests/_output/allure-result --clean -``` - -Refer to the [Reporting section][] for more Allure CLI details. - -<!-- Link definitions --> - -[`after`]: test.md#after-tag -[`run:group`]: commands/mftf.md#rungroup -[`run:test`]: commands/mftf.md#runtest -[Allure Framework]: https://docs.qameta.io/allure/ -[Allure Test Report]: https://github.com/allure-framework -[codecept]: commands/codeception.md -[codeception]: https://codeception.com/docs/reference/Commands -[mftf]: commands/mftf.md -[report an issue]: https://github.com/magento/magento2-functional-testing-framework/blob/master/.github/CONTRIBUTING.md#report-an-issue -[Reporting section]: https://docs.qameta.io/allure/#_reporting diff --git a/docs/section.md b/docs/section.md deleted file mode 100644 index 68a6507af..000000000 --- a/docs/section.md +++ /dev/null @@ -1,154 +0,0 @@ -# Section structure - -A `<section>` is a reusable part of a [`<page>`](./page.html) and is the standard file for defining UI elements on a page used in a test. - -A `<section>` can define: - -<!-- {% raw %} --> - -- An explicit element that has a selector equal to the constant string. Example: `selector="#add_root_category_button"` -- A parameterized element that contains substitutable values in the selector. Example: `selector="#element .{{var1}} .{{var2}}"`. - -## Substitutable values - -Substitutable values in the test can be of the following formats: - -- String literals (`stringLiteral`) -- References to a [data entity][] (XML data from the corresponding `.../Data/*.xml`) such as `entityName.Field`. -- Persisted data: - - `$persistedCreateDataKey.field$` for data created in the scope of a [test][] using the [`<createData>`][] action with `stepKey="persistedCreateDataKey"`. - - `$$persistedCreateDataKey.field$$` for data created in [before][] and [after][] hooks. Even though `<before>`and `<after>` are nested inside a [test][], persisted data is stored differently when it is done in a test hook. Therefore it must be accessed with a different notation. - -The following diagram shows the XML structure of an MFTF section: - -![XML Structure of MFTF section](img/section-dia.svg) - -## Format - -The format of a `<section>` is: - -```xml -<?xml version="1.0" encoding="UTF-8"?> - -<sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd"> - <section name=""> - <element name="" type="" selector="" /> - <element name="" type="" selector="" parameterized="true"/> - <element name="" type="" selector="" timeout=""/> - </section> -</sections> -``` - -## Principles - -The following conventions apply to MFTF sections: - -- `<section>` name must be alphanumeric. -- `*Section.xml` is stored in the _Section_ directory of a module. -- The name format is `{Admin|Storefront}{SectionDescription}Section.xml`. -- Camel case is used for `<section>` elements. -- One `<section>` tag is allowed per section XML file. - -## Example - -Example (`.../Catalog/Section/AdminCategorySidebarActionSection.xml` file): - -```xml -<?xml version="1.0" encoding="utf-8"?> - -<sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd"> - <section name="AdminCategorySidebarActionSection"> - <element name="AddRootCategoryButton" type="button" selector="#add_root_category_button" timeout="30"/> - <element name="AddSubcategoryButton" type="button" selector="#add_subcategory_button" timeout="30"/> - </section> -</sections> -``` - -This example uses a `AdminCategorySidebarActionSection` section. All sections with same name will be merged during test generation. - -The `AdminCategorySidebarActionSection` section declares two buttons: - -- `AddRootCategoryButton` - button with a `#add_root_category_button` locator on the parent web page -- `AddSubcategoryButton` - button with a `#add_subcategory_button` locator on the parent web page - -The following is an example of a call in test: - -```xml -<!-- Click on the button with locator "#add_subcategory_button" on the web page--> -<click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" stepKey="clickOnAddSubCategory"/> -``` - -## Elements reference - -### section {#section-tag} - -`<section>` contains the sequence of UI elements in a section of a [page][]. - -Attributes|Type|Use|Description ----|---|---|--- -`name`|string|required|Unique section name identifier. -`deprecated`|string|optional|Used to warn about the future deprecation of the section. String will appear in Allure reports and console output at runtime. -`remove`|boolean|optional|The default is `false`. Set to `true` to remove this element during parsing. - -### element {#element-tag} - -`<element>`is a UI element used in an [action][]. - -Attributes|Type|Use|Description ----|---|---|--- -`name`|string|required|The element name; Must be alphanumeric. -`type`|string|required|The type of the element. Possible values: `text`, `textarea`, `input`, `button`, `checkbox`, `radio`, `checkboxset`, `radioset`, `date`, `file`, `select`, `multiselect`, `wysiwyg`, `iframe`, `block`. -`selector`|string|optional|[XPath][] or [CSS][] selector of the element. -`locatorFunction`|string|optional|[Locator function][] declaration to be used in lieu of a selector. -`timeout`|string|optional|The timeout after interaction with the element (in seconds). The default is _none_. -`parameterized`|boolean|optional|Include and set to `true` if the `selector` for this element has parameters that need to be replaced for proper use. Learn more in [Parameterized selectors][]. -`deprecated`|string|optional|Used to warn about the future deprecation of the element. String will appear in Allure reports and console output at runtime. -`remove`|boolean|optional|The default is `false`. Set to `true` to remove this element during parsing. - -#### `timeout` attribute {#timeout-attribute} - -The attribute adds the [waitForPageLoad] action after a reference to the element in test. -The most usual use case is a test step with a button click action. - -**Use case**: Set a timeout of 30 seconds after clicking the `signIn` button. - -The section element code declaration containing the timeout attribute: - -> StorefrontCustomerSignInPopupFormSection.xml - -```xml -... -<element name="signIn" type="button" selector="#send2" timeout="30"/> -... -``` - -The test step that covers the use case: - -> CaptchaWithDisabledGuestCheckoutTest.xml - -```xml -... -<click selector="{{StorefrontCustomerSignInPopupFormSection.signIn}}" stepKey="clickSignIn"/> -... -``` - -<!-- {% endraw %} --> - -Whenever the `signIn` button is used in a test, the MFTF will add a 30 second `waitForPageLoad` action immediately after the `click`. - -<!-- Link definitions --> - -[waitForPageLoad]: test/actions.html#waitforpageload -[data entity]: ./data.html -[test]: ./test.html#test-tag -[`<createData>`]: ./test/actions.html#createdata -[before]: ./test.html#before-tag -[after]: ./test.html#after-tag -[page]: ./page.html -[action]: ./test/actions.html -[XPath]: https://www.w3schools.com/xml/xpath_nodes.asp -[CSS]: https://www.w3schools.com/cssref/css_selectors.asp -[Locator function]: ./section/locator-functions.html -[Parameterized selectors]: ./section/parameterized-selectors.html diff --git a/docs/section/locator-functions.md b/docs/section/locator-functions.md deleted file mode 100644 index 141afc9e6..000000000 --- a/docs/section/locator-functions.md +++ /dev/null @@ -1,45 +0,0 @@ -# Locator functions - -## Define Locator::functions in elements - - Codeception has a set of very useful [Locator functions][] that may be used by elements inside a [section][]. - -Declare an element with a `locatorFunction`: - -```xml -<element name="simpleLocator" type="button" locatorFunction="Locator::contains('label', 'Name')"/> -``` - -When using the `locatorFunction`, omit `Locator::` for code simplicity: - -```xml -<element name="simpleLocatorShorthand" type="button" locatorFunction="contains('label', 'Name')"/> -``` - -An element's `locatorFunction` can also be parameterized the same way as [parameterized selectors][]: - -<!-- {% raw %} --> - -```xml -<element name="simpleLocatorTwoParam" type="button" locatorFunction="contains({{arg1}}, {{arg2}})" parameterized="true"/> -``` - -An element cannot, however, have both a `selector` and a `locatorFunction`. - -## Call Elements that use locatorFunction - -Given the above element definitions, you call the elements in a test just like any other element. No special reference is required, as you are still just referring to an `element` inside a `section`: - -```xml -<test name="LocatorFunctionTest"> - <click selector="{{LocatorFunctionSection.simpleLocator}}" stepKey="SimpleLocator"/> - <click selector="{{LocatorFunctionSection.simpleLocatorTwoParam('string1', 'string2')}}" stepKey="TwoParamLiteral"/> -</test> -``` - -<!-- {% endraw %} --> - -<!-- Link Definitions --> -[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/section/parameterized-selectors.md b/docs/section/parameterized-selectors.md deleted file mode 100644 index 58227948f..000000000 --- a/docs/section/parameterized-selectors.md +++ /dev/null @@ -1,155 +0,0 @@ -# Parameterized selectors - -Use the following examples to create and use parameterized selectors in the MFTF. - -## Set up a selector in section - -Create a new `<element/>` in a `<section></section>`, : - -```xml -<section name="SampleSection"> - <element name="" type="" selector=""/> -</section> -``` - -Add the attribute `parameterized="true"` to the `<element/>`: - -```xml -<section name="SampleSection"> - <element name="" type="" selector="" parameterized="true"/> -</section> -``` - -Add your selector in the `selector=""` attribute: - -```xml -<section name="SampleSection"> - <element name="" type="" selector="#element" parameterized="true"/> -</section> -``` - -<!-- {% raw %} --> - -### Selector with single variable - -For the parameterized part of the selector, add `{{var1}}` to represent the first piece of data that you want to replace: - -```xml -<section name="SampleSection"> - <element name="" type="" selector="#element .{{var1}}" parameterized="true"/> -</section> -``` - -Add a descriptive name in the `name=""` attribute: - -```xml -<section name="SampleSection"> - <element name="oneParamElement" type="" selector="#element .{{var1}}" parameterized="true"/> -</section> -``` - -Add the type of UI element that the `<element/>` represents in `type`: - -```xml -<section name="SampleSection"> - <element name="oneParamElement" type="text" selector="#element .{{var1}}" parameterized="true"/> -</section> -``` - -### Selector with multiple variables - -For the parameterized part of the selector, add `{{var1}}, {{var2}}, ..., {{varN}}` for each parameter that you need to pass in: - -```xml -<section name="SampleSection"> - <element name="threeParamElement" type="text" selector="#element .{{var1}} .{{var2}}" parameterized="true"/> -</section> -``` - -```xml -<section name="SampleSection"> - <element name="threeParamElement" type="text" selector="#element .{{var1}} .{{var2}}-{{var3}}" parameterized="true"/> -</section> -``` - -<div class="bs-callout bs-callout-info" markdown="1"> -There is no need to use sequential variables like `{{var1}}`, `{{var2}}`. Parameterized replacement reads variables and maps them to the test call of the element sequentially from left to right, meaning you can use a selector like `#element .{{categoryId}} .{{productId}}`." -</div> - -## Use a parameterized selector in a test - -Create a new [test][]: - -```xml -<test name="SampleTest"> - -</test> -``` - -Add an action: - -```xml -<test name="SampleTest"> - <click selector="" stepKey="click1"/> -</test> -``` - -Enter `"{{}}"` in the `selector=""` attribute: - -```xml -<test name="SampleTest"> - <click selector="{{}}" stepKey="click1"/> -</test> -``` - -Make a reference to the section that the element is assigned to inside the `{{}}`: - -```xml -<test name="SampleTest"> - <click selector="{{SampleSection}}" stepKey="click1"/> -</test> -``` - -Add name of a parameterized element, separated by `"."`, inside the `{{}}`: - -```xml -<test name="SampleTest"> - <click selector="{{SampleSection.threeParamElement}}" stepKey="click1"/> -</test> -``` - -Add a set of `"()"` following the parameterized element inside the `{{}}`: - -```xml -<test name="SampleTest"> - <click selector="{{SampleSection.threeParamElement()}}" stepKey="click1"/> -</test> -``` - -Add the first parameter, that you would like to pass to the selector, inside of the `()`: - -```xml -<test name="SampleTest"> - <click selector="{{SampleSection.threeParamElement(_defaultCategory.is_active)}}" stepKey="click1"/> -</test> -``` - -Add the second or third parameters, that you'd like to pass to the selector, separated by `, `: - -```xml -<test name="SampleTest"> - <click selector="{{SampleSection.threeParamElement(_defaultCategory.is_active,'StringLiteral',$createDataKey.id$)}}" stepKey="click1"/> -</test> -``` - -<!-- {% endraw %} --> - -Any data can be used in parameterized elements, as well as entered in test actions: - -* `_defaultCategory.is_active` is a reference to `<data key="is_active">` in `<entity name="_defaultCategory" ... ></entity>` in the corresponding `.../Data/*.xml`. -* `'StringLiteral'` is a literal. -* `$createDataKey.id$` is a reference to persisted data created in the `SampleTest1` within the `stepKey="createDataKey"` action. -* `{$variable}` is a reference to data returned by a test action, like `<grabValueFrom>`. - -<!-- Link Definitions --> -[test]: ../test.md \ No newline at end of file diff --git a/docs/selectors.md b/docs/selectors.md deleted file mode 100644 index 376140819..000000000 --- a/docs/selectors.md +++ /dev/null @@ -1,35 +0,0 @@ -## Selectors - -These guidelines should help you to write high quality selectors. - -### Selectors SHOULD be written in CSS instead of XPath whenever possible - -CSS is generally easier to read than XPath. For example, `//*[@id="foo"]` in XPath can be expressed as simply as `#foo` in CSS. -See this [XPath Cheatsheet](https://devhints.io/xpath) for more examples. - -### XPath selectors SHOULD NOT use `@attribute="foo"`. - -This would fail if the attribute was `attribute="foo bar"`. -Instead you SHOULD use `contains(@attribute, "foo")` where `@attribute` is any valid attribute such as `@text` or `@class`. - -### CSS and XPath selectors SHOULD be implemented in their most simple form - -* <span class="color:green">GOOD:</span> `#foo` -* <span class="color:red">BAD:</span> `button[contains(@id, "foo")]` - -### CSS and XPath selectors SHOULD avoid making use of hardcoded indices - -Instead you SHOULD parameterize the selector. - -* <span class="color:green">GOOD:</span> `.foo:nth-of-type({{index}})` -* <span class="color:red">BAD:</span> `.foo:nth-of-type(1)` - -* <span class="color:green">GOOD:</span> `button[contains(@id, "foo")][{{index}}]` -* <span class="color:red">BAD:</span> `button[contains(@id, "foo")][1]` - -* <span class="color:green">GOOD:</span> `#actions__{{index}}__aggregator` -* <span class="color:red">BAD:</span> `#actions__1__aggregator` - -### CSS and XPath selectors MUST NOT reference the `@data-bind` attribute - -The `@data-bind` attribute is used by KnockoutJS, a framework Magento uses to create dynamic Javascript pages. Since this `@data-bind` attribute is tied to a specific framework, it should not be used for selectors. If Magento decides to use a different framework then these `@data-bind` selectors would break. diff --git a/docs/suite.md b/docs/suite.md deleted file mode 100644 index 9f623f276..000000000 --- a/docs/suite.md +++ /dev/null @@ -1,295 +0,0 @@ -# Suites - -Suites are essentially groups of tests that run in specific conditions (preconditions and postconditions). -They enable including, excluding, and grouping tests for a customized test run. -You can form suites using separate tests, groups, and modules. - -Each suite must be defined in the `<VendorName>/<ModuleName>/Test/Mftf/Suite` directory. - -The tests for each suite are generated in a separate directory under `<magento 2 root>/dev/tests/acceptance/tests/functional/Magento/_generated/`. -All tests that are not within a suite are generated in the _default_ suite at `<magento 2 root>/dev/tests/acceptance/tests/functional/Magento/_generated/default`. - -<div class="bs-callout bs-callout-info"> - If a test is generated into at least one custom suite, it will not appear in the _default_ suite. -</div> - -## Format - -The format of a suite: - -```xml -<?xml version="1.0" encoding="UTF-8"?> -<suites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../dev/tests/acceptance/vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Suite/etc/suiteSchema.xsd"> - <suite name=""> - <before> - </before> - <after> - </after> - <include> - <test name=""/> - <group name=""/> - <module name="" file=""/> - </include> - <exclude> - <test name=""/> - <group name=""/> - <module name="" file=""/> - </exclude> - </suite> -</suites> -``` - -## Principles - -- A suite name: - - - must not match any existing group value. - For example, the suite `<suite name="ExampleTest">` will fail during test run if any test contains in annotations `<group value="ExampleTest">`. - - must not be `default` or `skip`. Tests that are not in any suite are generated under the `default` suite. - The suite name `skip` is synonymous to including a test in the `<group value="skip"/>`. - - can contain letters, numbers, and underscores. - - should be upper camel case. - -- A suite must contain at least one `<include>`, or one `<exclude>`, or both. -- Using `<before>` in a suite, you must add the corresponding `<after>` to restore the initial state of your testing instance. -- One `<suite>` tag is allowed per suite XML file. - -## Conditions - -Using suites enables test writers to consolidate conditions that are shared between tests. -The code lives in one place and executes once per suite. - -- Set up preconditions and postconditions using [actions] in [`<before>`] and [`<after>`] correspondingly, just similar to use in a [test]. -- Clean up after suites just like after tests. -MFTF enforces the presence of both `<before>` and `<after>` if either is present. - -## Test writing - -Since suites enable precondition consolidation, a common workflow for test writing is adding a new test to an existing suite. -Such test is generated in context of the suite that contains it. -You cannot isolate this test from preconditions of the suite; it cannot be used outside of the suite at the same time. - -There are several ways to generate and execute your new test in the context of a suite: - -- Edit the appropriate `suite.xml` to include your test only and run: - - ```bash - vendor/bin/mftf run:group <suiteName> - ``` - -- Temporarily add a group to your test like `<group value="foo">` and run: - - ```bash - vendor/bin/mftf run:group foo - ``` - -- To limit generation to your suite/test combination, run in conjunction with the above: - - ```bash - vendor/bin/mftf generate:suite <suite> - ``` - -- To generate any combination of suites and tests, use [`generate:tests`] with the `--tests` flag. - -## Examples - -### Enabling/disabling WYSIWYG in suite conditions - -<!-- {% raw %} --> - -```xml -<suites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../dev/tests/acceptance/vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Suite/etc/suiteSchema.xsd"> - <suite name="WYSIWYG"> - <before> - <actionGroup ref="LoginAsAdmin" stepKey="login"/> - <amOnPage url="admin/admin/system_config/edit/section/cms/" stepKey="navigateToConfigurationPage" /> - <waitForPageLoad stepKey="wait1"/> - <conditionalClick stepKey="expandWYSIWYGOptions" selector="{{ContentManagementSection.WYSIWYGOptions}}" dependentSelector="{{ContentManagementSection.CheckIfTabExpand}}" visible="true" /> - <waitForElementVisible selector="{{ContentManagementSection.EnableWYSIWYG}}" stepKey="waitForEnableWYSIWYGDropdown1" /> - <waitForElementVisible selector="{{ContentManagementSection.EnableSystemValue}}" stepKey="waitForUseSystemValueVisible"/> - <uncheckOption selector="{{ContentManagementSection.EnableSystemValue}}" stepKey="uncheckUseSystemValue"/> - <selectOption selector="{{ContentManagementSection.EnableWYSIWYG}}" userInput="Enabled by Default" stepKey="selectOption1"/> - <click selector="{{ContentManagementSection.WYSIWYGOptions}}" stepKey="collapseWYSIWYGOptions" /> - <click selector="{{ContentManagementSection.Save}}" stepKey="saveConfig" /> - </before> - <after> - <actionGroup ref="LoginAsAdmin" stepKey="login"/> - <actionGroup ref="DisabledWYSIWYG" stepKey="disable"/> - </after> - <include> - <group name="WYSIWYG"/> - </include> - </suite> -</suites> -``` - -<!-- {% endraw %} --> -This example declares a suite with the name `WYSIWYG`. -The suite enables WYSIWYG *before* running tests. -It performs the following steps: - -1. Log in to the backend. -2. Navigate to the **Configuration** page. -3. Enable **WYSIWYG** in the Magento instance. - -*After* the testing, the suite returns the Magento instance to the initial state disabling WYSIWYG: - -1. Log back in. -2. Disable **WYSIWYG** in the Magento instance. - -This suite includes all tests that contain the `<group value="WYSIWYG"/>` annotation. - -### Execute Magento CLI commands in suite conditions - -```xml -<suites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Suite/etc/suiteSchema.xsd"> - <suite name="Cache"> - <before> - <magentoCLI stepKey="disableCache" command="cache:disable"/> - </before> - <after> - <magentoCLI stepKey="enableCache" command="cache:enable"/> - </after> - <include> - <test name="SomeCacheRelatedTest"/> - <group name="CacheRelated"/> - </include> - </suite> -</suites> -``` - -This example declares a suite with the name `Cache`. - -Preconditions: - -1. It disables the Magento instance cache entirely before running the included tests. -2. After the testing, it re-enables the cache. - -The suite includes a specific test `SomeCacheRelatedTest` and every `<test>` that includes the `<group value="CacheRelated"/>` annotation. - -### Change Magento configurations in suite conditions - -```xml -<suites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Suite/etc/suiteSchema.xsd"> - <suite name="PaypalConfiguration"> - <before> - <createData entity="SamplePaypalConfig" stepKey="createSamplePaypalConfig"/> - </before> - <after> - <createData entity="DefaultPayPalConfig" stepKey="restoreDefaultPaypalConfig"/> - </after> - <include> - <module name="Catalog"/> - </include> - <exclude> - <test name="PaypalIncompatibleTest"/> - </exclude> - </suite> -</suites> -``` - -This example declares a suite with the name `PaypalConfiguration`: - -- `<before>` block persists a Paypal Configuration enabling all tests in this suite to run under the newly reconfigured Magento instance. -- `<after>` block deletes the persisted configuration, returning Magento to its initial state. -- The suite includes all tests from the `Catalog` module, except the `PaypalIncompatibleTest` test. - -## Elements reference - -### suites {#suites-tag} - -The root element for suites. - -### suite {#suite-tag} - -A set of "before" and "after" preconditions, and test filters to include and exclude tests in the scope of suite. - -Attributes|Type|Use|Description ----|---|---|--- -`name`|string|required|Unique suite name identifier. -`remove`|boolean|optional|Removing the suite during merging. - -It can contain `<before>`, `<after>`, `<include>`, and `<exclude>`. - -### before {#before-tag} - -A suite hook with preconditions that executes once before the suite tests. - -It may contain test steps with any [actions] and [action groups]. - -<div class="bs-callout bs-callout-info"> -Tests in the suite are not run and screenshots are not saved in case of a failure in the before hook. -To troubleshoot the failure, run the suite locally. -</div> - -### after {#after-tag} - -A suite hook with postconditions executed once after the suite tests. - -It may contain test steps with any [actions] and [action groups]. - -### include {#include-tag} - -A set of filters that you can use to specify which tests to include in the test suite. - -It may contain filters by: - -- test which names a specific `<test>`. -- group which refers to a declared `group` annotation. -- module which refers to `test` files under a specific Magento Module. - -The element can contain [`<test>`], [`<group>`], and [`<module>`]. - -### exclude {#exclude-tag} - -A set of filters that you can use to specify which tests to exclude in the test suite. - -There are two types of behavior: - -1. Applying filters to the included tests when the suite contains [`<include>`] filters. - The MFTF will exclude tests from the previously included set and generate the remaining tests in the suite. -2. Applying filters to all tests when the suite does not contain [`<include>`] filters. - The MFTF will generate all existing tests except the excluded. - In this case, the custom suite will contain all generated tests except excluded, and the _default_ suite will contain the excluded tests only. - -It may contain filters by: - -- test which names a specific `<test>`. -- group which refers to a declared `group` annotation. -- module which refers to `test` files under a specific Magento Module. - -The element may contain [`<test>`], [`<group>`], and [`<module>`]. - -### test {#test-tag} - -Attributes|Type|Use|Description ----|---|---|--- -`name`|string|required|Filtering a test by its name. -`remove`|boolean|optional|Removing the filter during merging. - -### group {#group-tag} - -Attributes|Type|Use|Description ----|---|---|--- -`name`|string|required|Filtering tests by the `<group>` annotation. -`remove`|boolean|optional|Removing the filter during merging. - -### module {#module-tag} - -Attributes|Type|Use|Description ----|---|---|--- -`name`|string|required|Filtering tests by their location in the corresponding module. -`file`|string|optional|Filtering a specific test file in the module. -`remove`|boolean|optional|Removing the filter during merging. - -<!-- Link definitions --> -[actions]: test/actions.md -[action groups]: test/action-groups.md -[`<after>`]: #after-tag -[`<before>`]: #before-tag -[`generate:tests`]: commands/mftf.md#generatetests -[test]: test.md -[`<test>`]: #test-tag -[`<group>`]: #group-tag -[`<module>`]: #module-tag -[`<include>`]: #include-tag diff --git a/docs/test-prep.md b/docs/test-prep.md deleted file mode 100644 index b344fcf9f..000000000 --- a/docs/test-prep.md +++ /dev/null @@ -1,407 +0,0 @@ -# Preparing a test for MFTF - -This tutorial demonstrates the process of converting a raw functional test into a properly abstracted test file, ready for publishing. - -## The abstraction process - -When first writing a test for a new piece of code such as a custom extension, it is likely that values are hardcoded for the specific testing environment while in development. To make the test more generic and easier for others to update and use, we need to abstract the test. -The general process: - -1. Convert the manual test to a working, hard-coded test. -1. Replace hardcoded selectors to a more flexible format such as [parameterized selectors][]. -1. Convert hardcoded form values and other data to data entities. -1. Convert [actions][] into [action groups][]. - -## The manual test - -Manual tests are just that: A series of manual steps to be run. - -```xml -<!-- Navigate to Catalog -> Products page (or just open by link) --> -<!-- Fill field "Name" with "Simple Product %unique_value%" --> -<!-- Fill field "SKU" with "simple_product_%unique_value%" --> -<!-- Fill field "Price" with "500.00" --> -<!-- Fill field "Quantity" with "100" --> -<!-- Fill field "Weight" with "100" --> -<!-- Click "Save" button --> -<!-- See success save message "You saved the product." --> -<!-- Navigate to Catalog -> Products page (or just open by link) --> -<!-- See created product is in grid --> -<!-- See "Name" in grid is valid --> -<!-- See "SKU" in grid is valid --> -<!-- See "Price" in grid is valid --> -<!-- See "Quantity" in grid is valid --> -<!-- Open Storefront Product Page and verify "Name", "SKU", "Price" --> -``` - -## The raw test - -This test works just fine. But it will only work if everything referenced in the test stays exactly the same. This neither reusable nor extensible. -Hardcoded selectors make it impossible to reuse sections in other action groups and tasks. They can also be brittle. If Magento happens to change a `class` or `id` on an element, the test will fail. - -Some data, like the SKU in this example, must be unique for every test run. Hardcoded values will fail here. [Data entities][] allow for `suffix` and `prefix` for ensuring unique data values. - -For our example, we have a test that creates a simple product. Note the hardcoded selectors, data values and lack of action groups. We will focus on the "product name". - -```xml -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ ---> - -<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> - <test name="CreateSimpleProductTest"> - <annotations> - <features value="Catalog"/> - <stories value="Create Product"/> - <title value="Admin should be able to create simple product."/> - <description value="Admin should be able to create simple product."/> - <severity value="MAJOR"/> - <group value="Catalog"/> - <group value="alex" /> - </annotations> - <before> - <!-- Login to Admin panel --> - <amOnPage url="admin" stepKey="openAdminPanelPage" /> - <fillField selector="#username" userInput="admin" stepKey="fillLoginField" /> - <fillField selector="#login" userInput="123123q" stepKey="fillPasswordField" /> - <click selector="#login-form .action-login" stepKey="clickLoginButton" /> - </before> - <after> - <!-- Logout from Admin panel --> - </after> - - <!-- Navigate to Catalog -> Products page (or just open by link) --> - <amOnPage url="admin/catalog/product/index" stepKey="openProductGridPage" /> - - <!-- Click "Add Product" button --> - <click selector="#add_new_product-button" stepKey="clickAddProductButton" /> - <waitForPageLoad stepKey="waitForNewProductPageOpened" /> - - <!-- Fill field "Name" with "Simple Product %unique_value%" --> - -----><fillField selector="input[name='product[name]']" userInput="Simple Product 12412431" stepKey="fillNameField" /> - - <!-- Fill field "SKU" with "simple_product_%unique_value%" --> - <fillField selector="input[name='product[sku]']" userInput="simple-product-12412431" stepKey="fillSKUField" /> - - <!-- Fill field "Price" with "500.00" --> - <fillField selector="input[name='product[price]']" userInput="500.00" stepKey="fillPriceField" /> - - <!-- Fill field "Quantity" with "100" --> - <fillField selector="input[name='product[quantity_and_stock_status][qty]']" userInput="100" stepKey="fillQtyField" /> - - <!-- Fill field "Weight" with "100" --> - <fillField selector="input[name='product[weight]']" userInput="100" stepKey="fillWeightField" /> - - ... - </test> -</tests> -``` - -## Extract the CSS selectors - -First we will extract the hardcoded CSS selector values into variables. -For instance: `input[name='product[name]']` becomes `{{AdminProductFormSection.productName}}`. -In this example `AdminProductFormSection` refers to the `<section>` in the XML file which contains an `<element>` node named `productName`. This element contains the value of the selector that was previously hardcoded: `input[name='product[name]']` - -```xml -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ ---> - -<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> - <test name="CreateSimpleProductTest"> - <annotations> - <features value="Catalog"/> - <stories value="Create Product"/> - <title value="Admin should be able to create simple product."/> - <description value="Admin should be able to create simple product."/> - <severity value="MAJOR"/> - <group value="Catalog"/> - <group value="alex" /> - </annotations> - <before> - <before> - <!-- Login to Admin panel --> - <amOnPage url="admin" stepKey="openAdminPanelPage" /> - <fillField selector="#username" userInput="admin" stepKey="fillLoginField" /> - <fillField selector="#login" userInput="123123q" stepKey="fillPasswordField" /> - <click selector="#login-form .action-login" stepKey="clickLoginButton" /> - </before> - <after> - <!-- Logout from Admin panel --> - </after> - - <!-- Navigate to Catalog -> Products page (or just open by link) --> - <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="openProductGridPage" /> - - <!-- Click "Add Product" button --> - <click selector="{{AdminProductGridActionSection.addProductBtn}}" stepKey="clickAddProductButton" /> - <waitForPageLoad stepKey="waitForNewProductPageOpened" /> - - <!-- Fill field "Name" with "Simple Product %unique_value%" --> - -----><fillField selector="{{AdminProductFormSection.productName}}" userInput="Simple Product 12412431" stepKey="fillNameField" /> - <!-- Fill field "SKU" with "simple_product_%unique_value%" --> - <fillField selector="{{AdminProductFormSection.productSku}}" userInput="simple-product-12412431" stepKey="fillSKUField" /> - - <!-- Fill field "Price" with "500.00" --> - <fillField selector="{{AdminProductFormSection.productPrice}}" userInput="500.00" stepKey="fillPriceField" /> - - <!-- Fill field "Quantity" with "100" --> - <fillField selector="{{AdminProductFormSection.productQuantity}}" userInput="100" stepKey="fillQtyField" /> - - <!-- Fill field "Weight" with "100" --> - <fillField selector="{{AdminProductFormSection.productWeight}}" userInput="100" stepKey="fillWeightField" /> - ... - </test> -</tests> -``` - -## The section file - -We abstract these selector values to a file named `AdminProductFormSection.xml` which is kept in the `Section` folder. -Within this file, there can be multiple `<section>` nodes which contains data for different parts of the test. -Here we are interested in `<section name="AdminProductFormSection">`, where we are keeping our extracted values from above. - -```xml -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd"> ---> <section name="AdminProductFormSection"> - <element name="attributeSet" type="select" selector="div[data-index='attribute_set_id'] .admin__field-control"/> - <element name="attributeSetFilter" type="input" selector="div[data-index='attribute_set_id'] .admin__field-control input" timeout="30"/> - <element name="attributeSetFilterResult" type="input" selector="div[data-index='attribute_set_id'] .action-menu-item._last" timeout="30"/> - <element name="attributeSetFilterResultByName" type="text" selector="//label/span[text() = '{{var}}']" timeout="30" parameterized="true"/> - -----><element name="productName" type="input" selector="input[name='product[name]']"/> - <element name="RequiredNameIndicator" type="text" selector=" return window.getComputedStyle(document.querySelector('._required[data-index=name]>.admin__field-label span'), ':after').getPropertyValue('content');"/> - <element name="RequiredSkuIndicator" type="text" selector=" return window.getComputedStyle(document.querySelector('._required[data-index=sku]>.admin__field-label span'), ':after').getPropertyValue('content');"/> - <element name="productSku" type="input" selector="input[name='product[sku]']"/> - <element name="enableProductAttributeLabel" type="text" selector="//span[text()='Enable Product']/parent::label"/> - <element name="enableProductAttributeLabelWrapper" type="text" selector="//span[text()='Enable Product']/parent::label/parent::div"/> - <element name="productStatus" type="checkbox" selector="input[name='product[status]']"/> - ... - </section> - <section name="ProductInWebsitesSection"> - <element name="sectionHeader" type="button" selector="div[data-index='websites']" timeout="30"/> - <element name="website" type="checkbox" selector="//label[contains(text(), '{{var1}}')]/parent::div//input[@type='checkbox']" parameterized="true"/> - </section> -``` - -## Data entities - -The hardcoded values of these form elements are abstracted to a "data entity" XML file. -We replace the hardcoded values with variables and the MFTF will do the variable substitution. - -```xml -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ ---> - -<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> - <test name="CreateSimpleProductTest"> - <annotations> - <features value="Catalog"/> - <stories value="Create Product"/> - <title value="Admin should be able to create simple product."/> - <description value="Admin should be able to create simple product."/> - <severity value="MAJOR"/> - <group value="Catalog"/> - <group value="alex" /> - </annotations> - <before> - <!-- Login to Admin panel --> - <amOnPage url="admin" stepKey="openAdminPanelPage" /> - <fillField selector="#username" userInput="admin" stepKey="fillLoginField" /> - <fillField selector="#login" userInput="123123q" stepKey="fillPasswordField" /> - <click selector="#login-form .action-login" stepKey="clickLoginButton" /> - </before> - <after> - <!-- Logout from Admin panel --> - </after> - - <!-- Navigate to Catalog -> Products page (or just open by link) --> - <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="openProductGridPage" /> - - <!-- Click "Add Product" button --> - <click selector="{{AdminProductGridActionSection.addProductBtn}}" stepKey="clickAddProductButton" /> - <waitForPageLoad stepKey="waitForNewProductPageOpened" /> - - <!-- Fill field "Name" with "Simple Product %unique_value%" --> - ----><fillField selector="{{AdminProductFormSection.productName}}" userInput="{{_defaultProduct.name}}" stepKey="fillNameField" /> - - <!-- Fill field "SKU" with "simple_product_%unique_value%" --> - <fillField selector="{{AdminProductFormSection.productSku}}" userInput="{{_defaultProduct.sku}}" stepKey="fillSKUField" /> - - <!-- Fill field "Price" with "500.00" --> - <fillField selector="{{AdminProductFormSection.productPrice}}" userInput="{{_defaultProduct.price}}" stepKey="fillPriceField" /> - - <!-- Fill field "Quantity" with "100" --> - <fillField selector="{{AdminProductFormSection.productQuantity}}" userInput="{{_defaultProduct.quantity}}" stepKey="fillQtyField" /> - - <!-- Fill field "Weight" with "100" --> - <fillField selector="{{AdminProductFormSection.productWeight}}" userInput="{{_defaultProduct.weight}}" stepKey="fillWeightField" /> - - ... - </test> -</tests> -``` - -One of the reasons that we abstract things is so that they are more flexible and reusable. In this case, we can leverage this flexibility and use an existing data file. For this scenario, we are using [this file](https://raw.githubusercontent.com/magento-pangolin/magento2/MageTestFest/app/code/Magento/Catalog/Test/Mftf/Data/ProductData.xml). - -Data entities are important because this is where a `suffix` or `prefix` can be defined. This ensures that data values can be unique for every test run. - -Notice that the `<entity>` name is `_defaultProduct` as referenced above. Within this entity is the `name` value. - -```xml -<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd"> - <entity name="_defaultProduct" type="product"> - <data key="sku" unique="suffix">testSku</data> - <data key="type_id">simple</data> - <data key="attribute_set_id">4</data> - <data key="visibility">4</data> - ---> <data key="name" unique="suffix">testProductName</data> - <data key="price">123.00</data> - <data key="urlKey" unique="suffix">testurlkey</data> - <data key="status">1</data> - <data key="quantity">100</data> - <data key="weight">1</data> - <requiredEntity type="product_extension_attribute">EavStockItem</requiredEntity> - <requiredEntity type="custom_attribute_array">CustomAttributeCategoryIds</requiredEntity> - </entity> -``` - -The `unique="suffix"` attribute appends a random numeric string to the end of the actual data string. This ensures that unique values are used for each test run. -See [Input testing data][] for more information. - -## Convert actions to action groups - -Action groups are sets of steps that are run together. Action groups are designed to break up multiple individual steps into logical groups. For example: logging into the admin panel requires ensuring the login form exists, filling in two form fields and clicking the **Submit** button. These can be bundled into a single, reusable "LoginAsAdmin" action group that can be applied to any other test. This leverages existing code and prevents duplication of effort. We recommend that all steps in a test be within an action group. - -Using action groups can be very useful when testing extensions. -Extending the example above, assume the first extension adds a new field to the admin log in, a Captcha for example. -The second extension we are testing needs to log in AND get past the Captcha. - -1. The admin login is encapsulated in an action group. -2. The Captcha extension properly extends the `LoginAsAdmin` capture group using the `merge` functionality. -3. Now the second extension can call the `LoginAsAdmin` action group and because of the `merge`, it will automatically include the Captcha field. - -In this case, the action group is both reusable and extensible! - -We further abstract the test by putting these action groups in their own file: ['app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminProductActionGroup.xml'](https://raw.githubusercontent.com/magento-pangolin/magento2/e5671d84aa63cad772fbba757005b3d89ddb79d9/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminProductActionGroup.xml) - -To create an action group, take the steps and put them within an `<actionGroup>` element. Note that the `<argument>` node defines the `_defaultProduct` data entity that is required for the action group. - -```xml -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> -<!--Fill main fields in create product form--> - <actionGroup name="fillMainProductForm"> - <arguments> - <argument name="product" defaultValue="_defaultProduct"/> - </arguments> - -----><fillField selector="{{AdminProductFormSection.productName}}" userInput="{{product.name}}" stepKey="fillProductName"/> - <fillField selector="{{AdminProductFormSection.productSku}}" userInput="{{product.sku}}" stepKey="fillProductSku"/> - <fillField selector="{{AdminProductFormSection.productPrice}}" userInput="{{product.price}}" stepKey="fillProductPrice"/> - <fillField selector="{{AdminProductFormSection.productQuantity}}" userInput="{{product.quantity}}" stepKey="fillProductQty"/> - <selectOption selector="{{AdminProductFormSection.productStockStatus}}" userInput="{{product.status}}" stepKey="selectStockStatus"/> - <selectOption selector="{{AdminProductFormSection.productWeightSelect}}" userInput="This item has weight" stepKey="selectWeight"/> - <fillField selector="{{AdminProductFormSection.productWeight}}" userInput="{{product.weight}}" stepKey="fillProductWeight"/> - <click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSection"/> - <fillField userInput="{{product.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}" stepKey="fillUrlKey"/> - </actionGroup> -``` - -Note how the `<argument>` node takes in the `_defaultProduct` data entity and renames it to `product`, which is then used for the `userInput` values. - -Now we can reference this action group within our test (and any other test). - -```xml -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ ---> - -<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> - <test name="CreateSimpleProductTest"> - <annotations> - <features value="Catalog"/> - <stories value="Create Product"/> - <title value="Admin should be able to create simple product."/> - <description value="Admin should be able to create simple product."/> - <severity value="MAJOR"/> - <group value="Catalog"/> - <group value="alex" /> - </annotations> - <before> - <!-- Login to Admin panel --> - <actionGroup ref="LoginAsAdmin" stepKey="loginToAdminPanel" /> - </before> - <after> - <!-- Logout from Admin panel --> - </after> - - <!-- Navigate to Catalog -> Products page (or just open by link) --> - <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="openProductGridPage" /> - <waitForPageLoad stepKey="waitForProductGridPageLoaded" /> - - <!-- Click "Add Product" button --> - <actionGroup ref="goToCreateProductPage" stepKey="goToCreateProductPage" /> - -----><fillField selector="{{AdminProductFormSection.productName}}" userInput="{{product.name}}" stepKey="fillProductName"/> - <actionGroup ref="fillMainProductForm" stepKey="fillProductForm"> - <argument name="product" value="_defaultProduct" /> - </actionGroup> - - <!-- See success save message "You saved the product." --> - <actionGroup ref="saveProductForm" stepKey="clickSaveOnProductForm" /> - - <actionGroup ref="AssertProductInGridActionGroup" stepKey="assertProductInGrid" /> - - <!-- Open Storefront Product Page and verify "Name", "SKU", "Price" --> - <actionGroup ref="AssertProductInStorefrontProductPage" stepKey="assertProductInStorefrontProductPage"> - <argument name="product" value="_defaultProduct" /> - </actionGroup> - </test> -</tests> -``` - -A well written test will end up being a set of action groups. -The finished test is fully abstracted in such a way that it is short and readable and importantly, the abstracted data and action groups can be used again. - -<!-- Link Definitions --> -[actions]: https://devdocs.magento.com/mftf/docs/test/actions.html -[action groups]: https://devdocs.magento.com/mftf/docs/test/action-groups.html -[Data entities]: https://devdocs.magento.com/mftf/docs/data.html -[Input testing data]: https://devdocs.magento.com/mftf/docs/data.html -[parameterized selectors]: https://devdocs.magento.com/mftf/docs/section/parameterized-selectors.html diff --git a/docs/test.md b/docs/test.md deleted file mode 100644 index 4a77016f1..000000000 --- a/docs/test.md +++ /dev/null @@ -1,142 +0,0 @@ -# Test - -Test cases in the Magento Functional Testing Framework (MFTF) are defined in XML as [`<tests>`]. -`<tests>` is a [Codeception test container][Codeception] that contains individual test [`<test>`] with its metadata ([`<annotations>`]), before ([`<before>`]) and after ([`<after>`]) section. - -MFTF `<test>` is considered a sequence of actions with associated parameters. -Any failed [assertion] within a test constitutes a failed test. - -<div class="bs-callout bs-callout-info" markdown="1"> - `<before>` and `<after>` hooks are not global within `<tests>`. -They only apply to the `<test>` in which they are declared. -The steps in `<after>` are run in both successful **and** failed test runs. -</div> - -The following diagram shows the structure of an MFTF test case: - -![Structure of MFTF test case](img/test-dia.svg) - -## Format - -The format of a test XML file is: - -```xml -<?xml version="1.0" encoding="UTF-8"?> - -<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> - <test name="" insertBefore="" insertAfter=""> - <annotations> - <!-- TEST ANNOTATIONS --> - </annotations> - <before> - <!-- ACTIONS AND ACTION GROUPS PERFORMED BEFORE THE TEST --> - </before> - <after> - <!-- ACTIONS AND ACTION GROUPS PERFORMED AFTER THE TEST --> - </after> - <!-- TEST ACTIONS, ACTION GROUPS, AND ASSERTIONS--> - </test> -</tests> -``` - -## Principles - -The following conventions apply to MFTF tests: - -* One `<test>` tag is allowed per test XML file. -* All names within the framework are in the **PascalCase** format and must be alphanumeric. -* Each action and action group call should have its own identifier `<stepKey>`. -* A test may have any number of [assertions][assertion] at any point within the `<test>`. -* If `<test>` is included in [`<suite>`][suites], it **cannot be generated in isolation** from `<before>` and `<after>` section of the suite (see [suites] for details). - -## Elements reference - -There are several XML elements that are used within `<test>` in the MFTF. - -### tests {#tests-tag} - -`<tests>` is a container for test and must contain exactly one [`<test>`]. - -### test {#test-tag} - -`<test>` is a set of steps, including [actions], [assertions][assertion] and Action Group calls. It is a sequence of test steps that define test flow within a test method. - -Attribute|Type|Use|Description ----|---|---|--- -`name`|string|optional|The test identifier. -`remove`|boolean|optional|Set `true` to remove the test when merging. -`insertBefore`|string|optional| This option is used for [merging]. It enables you to add all test actions contained in the original test into a test with the same name BEFORE the test step with `stepKey` that you assigned in `insertBefore`. -`insertAfter`|string|optional| Set `stepKey` of the test step after which you want to insert the test when [merging]. -`deprecated`|string|optional|Used to warn about the future deprecation of the test. String will appear in Allure reports and console output at runtime. -`extends`|string|optional|A name of the parent test to [extend]. - -`<test>` may also contain [`<annotations>`], [`<before>`], [`<after>`], any [action][actions], or [`<actionGroup>`]. - -### annotations {#annotations-tag} - -[Annotations] are supported by both [Codeception] and [Allure]. - -Codeception annotations typically provide metadata and are able to influence test selection. -Allure annotations provide metadata for reporting. - -### before {#before-tag} - -`<before>` wraps the steps that are preconditions for the [`<test>`]. For example: Change configuration, create Customer Account, Create Category and Product. - -`<before>` may contain these child elements: - -* Any [Action][actions] -* [`<actionGroup>`] - -### after {#after-tag} - -`<after>` wraps the steps to perform after the [`<test>`]. The steps are run in both successful **and** failed test runs. The goal of this section is to perform cleanup (revert the environment to the pre-test state). - -`<after>` may contain: - -* Any [Action][actions] -* [`<actionGroup>`] - -### actionGroup {#actiongroup-tag} - -`<actionGroup>` calls a corresponding [action group]. - -Attribute|Type|Use|Description ----|---|---|--- -`ref`|string|required|References the required action group by its `name`. -`stepKey`|string|required| Identifies the element within `<test>`. -`before`|string|optional| `<stepKey>` of an action or action group that must be executed next while merging. -`after`|string|optional| `<stepKey>` of an action or action group that must be executed one step before the current one while merging. - -`<actionGroup>` may contain [`<argument>`]. - -### argument {#argument-tag} - -`<argument>` sets an argument that is used in the parent [`<actionGroup>`]. - -Attribute|Type|Use ----|---|--- -`name`|string|optional| Name of the argument. -`value`|string|optional| Value of the argument. - -See [Action groups][action group] for more information. - -<!-- Link definitions --> - -[`<actionGroup>`]: #actiongroup-tag -[`<after>`]: #after-tag -[`<annotations>`]: #annotations-tag -[`<argument>`]: #argument-tag -[`<before>`]: #before-tag -[`<test>`]: #test-tag -[`<tests>`]: #tests-tag -[action group]: ./test/action-groups.md -[actions]: ./test/actions.md -[Allure]: https://github.com/allure-framework/ -[Annotations]: ./test/annotations.md -[assertion]: ./test/assertions.md -[Codeception]: https://codeception.com/docs/07-AdvancedUsage -[extend]: extending.md -[merging]: ./merging.md#insert-after -[suites]: ./suite.md diff --git a/docs/test/action-groups.md b/docs/test/action-groups.md deleted file mode 100644 index 05adf795e..000000000 --- a/docs/test/action-groups.md +++ /dev/null @@ -1,306 +0,0 @@ -# Action groups - -In the MFTF, you can re-use a group of [actions][], such as logging in as an administrator or a customer, declared in an XML file when you need to perform the same sequence of actions multiple times. - -The following diagram shows the structure of an MFTF action group: - -![Structure of MFTF action group](../img/action-groups-dia.svg) - -## Principles - -{% raw %} - -The following conventions apply to MFTF action groups: - -- All action groups are declared in XML files and stored in the `<module>/Test/Mftf/ActionGroup/` directory. -- Every file name ends with `ActionGroup` suffix. For exampe `LoginAsAdminActionGroup.xml`. -- Action group name should be the same as file name without extension. -- One `<actionGroup>` tag is allowed per action group XML file. - -The XML format for the `actionGroups` declaration is: - -```xml -<?xml version="1.0" encoding="UTF-8"?> - -<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> - <actionGroup name=""> - <arguments> - <argument name=""/> - <argument name="" defaultValue=""/> - <argument name="" defaultValue="" type=""/> - </arguments> - </actionGroup> -</actionGroups> -``` - -## Example - -These examples build a declaration for a group of actions that grant authorization to the Admin area, and use the declaration in a test. - -The _Magento/Backend/Test/Mftf/ActionGroup/LoginAsAdminActionGroup.xml_ `<actionGroup>` relates to the functionality of the _Magento_Backend_ module. - -In [test][], the name and identifier of the `<actionGroup>` is used as a reference in the `ref` parameter, such as `ref="LoginAsAdminActionGroup"`. - -### Create an action group declaration - -To create the `<actionGroup>` declaration: - -1. Begin with a template for the `<actionGroup>`: - - ```xml - <?xml version="1.0" encoding="UTF-8"?> - - <actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> - <actionGroup name="{Action Group Name}"> - - </actionGroup> - </actionGroups> - ``` - -1. Add actions to the `actionGroup` arguments: - - ```xml - <actionGroup name="LoginAsAdminActionGroup"> - <fillField stepKey="fillUsername" selector="#username" userInput="{{adminUser.username}}" /> - <fillField stepKey="fillPassword" selector="#password" userInput="{{adminUser.password}}" /> - <click stepKey="click" selector="#login" /> - </actionGroup> - ``` - -1. The `userInput` variable must contain a data value for test. - Add a default data value for the variable to use in the most common cases. - For this example, the default value is `_defaultAdmin`. - - ```xml - <argument name="adminUser" defaultValue="_defaultAdmin"/> - ``` - -1. The following example shows the complete declaration: - - ```xml - <?xml version="1.0" encoding="UTF-8"?> - - <actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> - <actionGroup name="LoginAsAdmin"> - <annotations> - <description>Login to Backend Admin using provided User Data. PLEASE NOTE: This Action Group does NOT validate that you are Logged In.</description> - </annotations> - <arguments> - <argument name="adminUser" type="entity" defaultValue="DefaultAdminUser"/> - </arguments> - - <amOnPage url="{{AdminLoginPage.url}}" stepKey="navigateToAdmin"/> - <fillField selector="{{AdminLoginFormSection.username}}" userInput="{{adminUser.username}}" stepKey="fillUsername"/> - <fillField selector="{{AdminLoginFormSection.password}}" userInput="{{adminUser.password}}" stepKey="fillPassword"/> - <click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickLogin"/> - <closeAdminNotification stepKey="closeAdminNotification"/> - </actionGroup> - </actionGroups> - ``` - -### Use the declaration in a test - -In this test example, we want to add the following set of actions: - -```xml -<fillField selector="{{AdminLoginFormSection.username}}" userInput="{{adminUser.username}}" stepKey="fillUsername"/> -<fillField selector="{{AdminLoginFormSection.password}}" userInput="{{adminUser.password}}" stepKey="fillPassword"/> -<click selector="{{AdminLoginFormSection.signIn}}" stepKey="clickLogin"/> -``` - -Instead of adding this set of actions, use the _LoginAsAdminActionGroup_ `<actionGroup>` declaration in tests: - -1. Reference the `LoginAsAdminActionGroup` action group: - - ```xml - <actionGroup stepKey="loginToAdminPanel" ref="LoginAsAdminActionGroup"/> - ``` - -1. Update the argument name/value pair to `adminUser` and `CustomAdminUser`: - - ```xml - <actionGroup stepKey="loginToAdminPanel" ref="LoginAsAdminActionGroup"> - <argument name="adminUser" value="CustomAdminUser"/> - </actionGroup> - ``` - -## Data type usage - -By default, an [`argument`][] expects an entire `entity` when the `type` value is not defined. -There are cases when you use a string instead of a whole entity. - -For example, the following defines the replacement argument `relevantString` using a primitive data type: - -```xml -<actionGroup name="fillExample"> - <arguments> - <argument name="relevantString" defaultValue="defaultString" type="string"/> - </arguments> - <fillField stepKey="fillField1" selector="#input" userInput="{{relevantString}}"/> - <click stepKey="clickSave" selector="#save"/> - <see stepKey="seeItWorked" selector="#outputArea" userInput="{{relevantString}}"/> - <click stepKey="clickParameterizedSelector" selector="{{SomeSection.parameterizedElement(relevantString)}}"/> -</actionGroup> -``` - -The `string` argument type provides a method to pass a single piece of data to the `<actionGroup>`during a test instead of passing an entire entity. - -### Explicitly define the argument value - -```xml -<actionGroup stepKey="fillWithStringLiteral" ref="fillExample"> - <argument name="relevantString" value="overrideString"/> -</actionGroup> -``` - -### Use persisted data references to define the argument value - -```xml -<actionGroup stepKey="fillWithStringLiteral" ref="fillExample"> - <argument name="relevantString" value="$persistedData.field1$"/> -</actionGroup> -``` - -The `relevantString` argument value points to the data [created][] in the `stepKey="persistedData"` test step. -`field1` is a data key of the required data string. -Even with the `persistedData` data entity, the MFTF interprets the `$persistedData.field1$` value as a string. - -### Define the argument value based on data entity resolution - -The argument value points to a piece of data defined in a `data.xml` file. -The `field1` data contains the required string. -MFTF resolves `{{myCustomEntity.field1}}` the same as it would in a `selector` or `userInput` attribute. - -```xml -<actionGroup stepKey="fillWithXmlData" ref="fillExample"> - <argument name="relevantString" value="{{myCustomEntity.field1}}"/> -</actionGroup> -``` - -## Return a value - -Action groups can return a value using a `return` tag. - -```xml -<actionGroup name="GetOrderIdActionGroup"> - <seeElement selector="{{CheckoutSuccessMainSection.orderLink}}" stepKey="assertOrderLink"/> - <grabTextFrom selector="{{CheckoutSuccessMainSection.orderLink}}" stepKey="orderId"/> - <return value="{$orderId}" stepKey="returnOrderId"/> -</actionGroup> -``` - -The value returned can be accessed in later steps using action group step key `{$getOrderId}`. -```xml -<actionGroup ref="GetOrderIdActionGroup" stepKey="getOrderId"/> -<!--Filter the Order using Order ID --> -<actionGroup ref="FilterOrderGridByIdActionGroup" stepKey="filterOrderGridById"> - <argument name="orderId" value="{$getOrderId}"/> -</actionGroup> -``` -### Convention to return a value - -The following conventions apply to action groups returning a value: -- Only action groups can return value. Use of `return` tag is dis-allowed in tests and suites. -- An action group does not support multiple `return` tags. -- For [merging action groups](../merging.md#merge-action-groups), `return` is allowed only in one of the merging action groups. -- Value returned by an action group can only be referenced within the scope that the action group is defined in (`test`, `before/after`). - -## Optimizing action group structures - -Structuring properly an action group increases code reusability and readability. - -Starting with an action group such as: - -```xml -<actionGroup name="CreateCategory"> - <arguments> - <argument name="categoryEntity" defaultValue="_defaultCategory"/> - </arguments> - <seeInCurrentUrl url="{{AdminCategoryPage.url}}" stepKey="seeOnCategoryPage"/> - <click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" stepKey="clickOnAddSubCategory"/> - <see selector="{{AdminHeaderSection.pageTitle}}" userInput="New Category" stepKey="seeCategoryPageTitle"/> - <fillField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="{{categoryEntity.name}}" stepKey="enterCategoryName"/> - <click selector="{{AdminCategorySEOSection.SectionHeader}}" stepKey="openSEO"/> - <fillField selector="{{AdminCategorySEOSection.UrlKeyInput}}" userInput="{{categoryEntity.name_lwr}}" stepKey="enterURLKey"/> - <click selector="{{AdminCategoryMainActionsSection.SaveButton}}" stepKey="saveCategory"/> - <seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" stepKey="assertSuccess"/> - <seeInTitle userInput="{{categoryEntity.name}}" stepKey="seeNewCategoryPageTitle"/> - <seeElement selector="{{AdminCategorySidebarTreeSection.categoryInTree(categoryEntity.name)}}" stepKey="seeCategoryInTree"/> -</actionGroup> -``` - -It can be reworked into more manageable pieces, as below. These smaller steps are easier to read, update, and reuse. -* GoToCategoryGridAndAddNewCategory - ```xml - <actionGroup name="GoToCategoryGridAndAddNewCategory"> - <seeInCurrentUrl url="{{AdminCategoryPage.url}}" stepKey="seeOnCategoryPage"/> - <click selector="{{AdminCategorySidebarActionSection.AddSubcategoryButton}}" stepKey="clickOnAddSubCategory"/> - <see selector="{{AdminHeaderSection.pageTitle}}" userInput="New Category" stepKey="seeCategoryPageTitle"/> - </actionGroup> - ``` -* FillInBasicCategoryFields - ```xml - <actionGroup name="FillInBasicCategoryFields"> - <arguments> - <argument name="categoryEntity" defaultValue="_defaultCategory"/> - </arguments> - <fillField selector="{{AdminCategoryBasicFieldSection.CategoryNameInput}}" userInput="{{categoryEntity.name}}" stepKey="enterCategoryName"/> - <click selector="{{AdminCategorySEOSection.SectionHeader}}" stepKey="openSEO"/> - <fillField selector="{{AdminCategorySEOSection.UrlKeyInput}}" userInput="{{categoryEntity.name_lwr}}" stepKey="enterURLKey"/> - </actionGroup> - ``` -* SaveAndVerifyCategoryCreation - ```xml - <actionGroup name="SaveAndVerifyCategoryCreation"> - <click selector="{{AdminCategoryMainActionsSection.SaveButton}}" stepKey="saveCategory"/> - <seeElement selector="{{AdminCategoryMessagesSection.SuccessMessage}}" stepKey="assertSuccess"/> - <seeInTitle userInput="{{categoryEntity.name}}" stepKey="seeNewCategoryPageTitle"/> - <seeElement selector="{{AdminCategorySidebarTreeSection.categoryInTree(categoryEntity.name)}}" stepKey="seeCategoryInTree"/> - </actionGroup> - ``` - -<!-- {% endraw %} --> - -## Elements reference - -### actionGroups {#actiongroups-tag} - -The `<actionGroups>` element is a root element that contains XML configuration attributes. - -Attribute|Value|Description ----|---|--- -`xmlns:xsi`|`"http://www.w3.org/2001/XMLSchema-instance"`|Tells the XML parser to validate this document against a schema. -`xsi:noNamespaceSchemaLocation`|`"urn:magento:mftf:Test/etc/actionGroupSchema.xsd"`|Relative path to the corresponding schema. - -It may contain one or more `<actionGroup>`. - -### actionGroup {#actiongroup-tag} - -Attribute|Type|Use|Description ----|---|---|--- -`name`|string|required|Identifier of the action group. -`extends`|string|optional|Identifies the action group to extend. -`deprecated`|string|optional|Used to warn about the future deprecation of the actionGroup. String will appear in Allure reports and console output at runtime. - -It may contain `<arguments>`. - -### arguments {#arguments-tag} - -The `<arguments>` element is a wrapper for an array of `<argument>` elements. - -### argument {#argument-tag} - -Attribute|Type|Use|Description ----|---|---|--- -`name`|string|required|Identifier of an argument in the scope of the corresponding action group. -`defaultValue`|string|optional|Provides a default data value. -`type`|Possible values: `string`, `entity` (default).|optional|Defines the argument data type; Defaults to `entity`. - -<!-- Link Definitions --> -[actions]: ./actions.md -[test]: ../test.md -[`argument`]: #argument-tag -[created]: ../data.md#persist-data diff --git a/docs/test/actions.md b/docs/test/actions.md deleted file mode 100644 index 94db9c989..000000000 --- a/docs/test/actions.md +++ /dev/null @@ -1,2571 +0,0 @@ -# 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](https://codeception.com/docs/modules/WebDriver#Actions). -Some actions drive browser elements, while others use REST APIs. - -## Common attributes - -All `<actions>` contain the following attributes that are useful for merging needs. - -### `stepKey` - -`stepKey` is a required attribute that stores a unique identifier of the action. - -Example test step of the `myAction` action with the `conditionalClickStep1` identifier: - -```xml -<myAction stepKey="conditionalClickStep1"/> -``` - -This step can be referenced within the test using `conditionalClickStep1`. - -The value format should met the following principles: - -* Must be unique within [`<test>`](../test.md#test-tag). -* Naming should be as descriptive as possible: - * Describe the action performed. - * Briefly describe the purpose. - * Describe which data is in use. -* Should be in camelCase with lowercase first letter. -* Should be the last attribute of an element. - -### `before` and `after` - -`before` and `after` are optional attributes that insert the action into the test while merging. The action will be executed before or after the one set in these attributes. The value here is the `stepKey` of reference action. - -Example with `before`: - -```xml -<myAction before="fillField" stepKey="conditionalClickStep1"/> -``` - -`myAction` will be executed before the action, which has `stepKey="fillField"`. - -Example with `after`: - -```xml -<myAction after="fillField" stepKey="seeResult"/> -``` - -`myAction` will be executed after the action, which has `stepKey="fillField"`. - -## Examples - -<!-- {% raw %} --> - -The following example contains four actions: - -1. [Open the Sign In page for a Customer](#example-step1). -2. [Enter a customer's email](#example-step2). -3. [Enter a customer's password](#example-step3). -4. [Click the Sign In button](#example-step4). - - ```xml - <amOnPage url="{{StorefrontCustomerSignInPage.url}}" stepKey="amOnSignInPage"/> - <fillField userInput="$$customer.email$$" selector="{{StorefrontCustomerSignInFormSection.emailField}}" stepKey="fillEmail"/> - <fillField userInput="$$customer.password$$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}" stepKey="fillPassword"/> - <click selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}" stepKey="clickSignInAccountButton"/> - ``` - -### 1. Open the Sign In page for a customer {#example-step1} - -```xml -<amOnPage url="{{StorefrontCustomerSignInPage.url}}" stepKey="amOnSignInPage"/> -``` - -The Customer Sign In page is declared in the `.../Customer/Page/StorefrontCustomerSignInPage.xml` file. -The given relative URI is declared in `StorefrontCustomerSignInPage.url`. - -Source code (`StorefrontCustomerSignInPage.xml` ): - -```xml -<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/PageObject.xsd"> - <page name="StorefrontCustomerSignInPage" url="/customer/account/login/" module="Magento_Customer"> - <section name="StorefrontCustomerSignInFormSection" /> - </page> -</config> -``` - -[`<amOnPage>`](#amonpage) is an action that opens a page for a given URI. It has a key `"amOnSignInPage"` that will be used as a reference for merging needs in other modules. -This action uses the `url` attribute value for the given relative URI to open a browser page. -Here, `url` contains a pointer to a `url` attribute of the `StorefrontCustomerSignInPage`. - -### 2. Enter a customer's email {#example-step2} - -```xml -<fillField userInput="$customer.email$" selector="{{StorefrontCustomerSignInFormSection.emailField}}" stepKey="fillEmail"/> -``` - -[`<fillField>`](#fillfield) fills a text field with the given string. - -The customer's email is stored in the `email` parameter of the `customer` entity created somewhere earlier in the test using a [`<createData>`](#createdata) tag. -`userInput` points to that data. - -`selector` points to the field where you enter the data. -A required selector is stored in the `emailField` element of the `StorefrontCustomerSignInFormSection` section. - -This section is declared in `.../Customer/Section/StorefrontCustomerSignInFormSection.xml` file: - -```xml -<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd"> - <section name="StorefrontCustomerSignInFormSection"> - <element name="emailField" type="input" selector="#email"/> - <element name="passwordField" type="input" selector="#pass"/> - <element name="signInAccountButton" type="button" selector="#send2" timeout="30"/> - </section> -</config> -``` - -### 3. Enter a customer's password {#example-step3} - -```xml -<fillField userInput="$customer.password$" selector="{{StorefrontCustomerSignInFormSection.passwordField}}" stepKey="fillPassword"/> -``` - -This `<action>` is very similar to the `<action>` in a previous step. -The only difference is that different data is assigned to the attributes, which set a field with a password. - -### 4. Click the Sign In button {#example-step4} - -```xml -<click selector="{{StorefrontCustomerSignInFormSection.signInAccountButton}}" stepKey="clickSignInAccountButton"/> -``` - -<!-- {% endraw %} --> - -Here, [`<click>`](#click) performs a click on a button that can be found by the selector that is stored in the `signInAccountButton` of the `StorefrontCustomerSignInFormSection`. - -## Actions returning a variable - -The following test actions return a variable: - -* [grabAttributeFrom](#grabattributefrom) -* [grabCookie](#grabcookie) -* [grabCookieAttributes](#grabcookieattributes) -* [grabFromCurrentUrl](#grabfromcurrenturl) -* [grabMultiple](#grabmultiple) -* [grabPageSource](#grabpagesource) -* [grabTextFrom](#grabtextfrom) -* [grabValueFrom](#grabvaluefrom) -* [executeJS](#executejs) -* [getOTP](#getotp) -* [return](#return) - -Learn more in [Using data returned by test actions](../data.md#use-data-returned-by-test-actions). - -## Actions handling data entities - -The following test actions handle data entities using [metadata](../metadata.md): - -* [createData](#createdata) -* [deleteData](#deletedata) -* [updateData](#updatedata) -* [getData](#getdata) - -Learn more in [Handling a REST API response](../metadata.md#rest-response). - -## Actions specifying HTML values - -To use HTML in actions you must encode the HTML string. We recommend using [CyberChef](https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity(false,'Numeric%20entities')). Using CyberChef or a similar tool is straightforward: enter in your HTML string, copy the encoded result, and paste that value into your MFTF test. - -For example, we want to ensure that this value is presented as a string and not rendered as a H1 tag: `<h1 class="login-header">` - -After passing `<h1 class="login-header">` through CyberChef we get `<h1 class="login-header">` which can be used in a test like: - -```xml -<dontSeeInSource html="<h1 class="login-header">" stepKey="dontSeeInSource"/> -``` - -## Reference - -The following list contains reference documentation about all action elements available in the MFTF. -If the description of an element does not include a link to Codeception analogue, it means that the action is developed by Magento for specific MFTF needs. - -### acceptPopup - -Accepts the current popup visible on the page. - -See [acceptPopup docs on codeception.com](https://codeception.com/docs/modules/WebDriver#acceptPopup). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<!-- Accept the current popup visible on the page. --> -<acceptPopup stepKey="acceptPopup"/> -``` - -### amOnPage - -Opens the page by the URL relative to the one set in the `MAGENTO_BASE_URL` configuration variable. - -See [amOnPage docs on codeception.com](https://codeception.com/docs/modules/WebDriver#amOnPage). - -Attribute|Type|Use|Description ----|---|---|--- -`url`|string|optional| A path to the page relative to the `MAGENTO_BASE_URL`. -`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. - -#### Example - -```xml -<!-- Open the `(baseURL)/admin` page. --> -<amOnPage url="{{AdminLogoutPage.url}}" stepKey="goToLogoutPage"/> -``` - -### amOnSubdomain - -Takes the base URL and changes the subdomain. - -See [amOnSubdomain docs on codeception.com](https://codeception.com/docs/modules/WebDriver#amOnSubdomain). - -Attribute|Type|Use|Description ----|---|---|--- -`url`|string|optional| The name of the subdomain. -`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. - -#### Example - -Pre-condition: the current base URL is `https://www.magento.com`. - -```xml -<!-- Change the sub-domain to `https://devdocs.magento.com`. --> -<amOnSubdomain url="devdocs" stepKey="changeSubdomain"/> -<!-- Open the page `https://devdocs.magento.com` --> -<amOnPage url="/" stepKey="goToDataPage"/> -``` - -### amOnUrl - -Opens a page by the absolute URL. - -See [amOnUrl docs on codeception.com](https://codeception.com/docs/modules/WebDriver#amOnUrl). - -Attribute|Type|Use|Description ----|---|---|--- -`url`|string|optional| The absolute URL to be used in subsequent steps. -`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. - -#### Example - -```xml -<!-- Set url to be used in the next steps to https://www.magento.com/ --> -<amOnUrl url="https://www.magento.com/" stepKey="amOnUrl"/> -``` - -### appendField - -See [appendField docs on codeception.com](https://codeception.com/docs/modules/WebDriver#appendField). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector used to identify the form field. -`userInput`|string|optional| Value to append to the form field. -`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. - -#### Example - -```xml -<!-- Append the "Sample Text" string to the selected input element --> -<appendField userInput="Sample Text" selector="input#name" stepKey="appendSuffix"/> -``` - -### attachFile - -See [attachFile docs on codeception.com](https://codeception.com/docs/modules/WebDriver#attachFile). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional|The selector identifying the corresponding HTML element (`<input type="file">`). -`userInput`|string|optional|The name of attaching file. The file must be placed in the `tests/_data` directory. -`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. - -#### Example - -```xml -<!-- Upload a file from the `tests/_data` directory with the `image.png` name to the selected input element. --> -<attachFile userInput="image.png" selector="input#imgUpload" stepKey="uploadFile"/> -``` - -### cancelPopup - -See [cancelPopup docs on codeception.com](https://codeception.com/docs/modules/WebDriver#cancelPopup). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<!-- Cancel the current popup visible on the page. --> -<cancelPopup stepKey="cancelPopup"/> -``` - -### checkOption - -See [checkOption docs on codeception.com](https://codeception.com/docs/modules/WebDriver#checkOption). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`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. - -#### Example - -```xml -<!-- Ensure the checkbox `<input type="checkbox" id="checkbox" ... >...</input>` is checked. --> -<checkOption selector="input#checkbox" stepKey="checkCheckbox"/> -``` - -### clearField - -Clears a text input field. -Equivalent to using [`<fillField>`](#fillfield) with an empty string. - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|required| The selector identifying the corresponding HTML element to be cleared. -`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. - -#### Example - -```xml -<!-- Clear the selected field. --> -<clearField selector="input#name" stepKey="clearField"/> -``` - -### click - -See [click docs on codeception.com](https://codeception.com/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](https://codeception.com/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. -`after`|string|optional| `stepKey` of preceding action. - -#### Example - -```xml -<!-- Click the selected button. --> -<click selector="button#clickable" stepKey="clickButton"/> -``` - -```xml -<!-- Click on the "<a href=...>Login</a>" link. --> -<click selectorArray="['link' => 'Login']" stepKey="clickButton2"/> -``` - -### clickWithLeftButton - -See [clickWithLeftButton docs on codeception.com](https://codeception.com/docs/modules/WebDriver#clickWithLeftButton). - -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]. -`x`|string|optional| The x-axis value in pixels for the click location. -`y`|string|optional| The y-axis value in pixels for the click location. -`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. - -#### Examples - -```xml -<!-- Left click on the center of the `<button id="clickable" />` element. --> -<clickWithLeftButton selector="button#clickable" stepKey="clickButton1"/> -``` - -```xml -<!-- Left click on the point that is 50 px from the top of the window and 50 px from the left of the window. --> -<clickWithLeftButton x="50" y="50" stepKey="clickButton2"/> -``` - -```xml -<!-- Left click on the point that is 50 px from the top and 50 px from the left of of the `<button id="clickable" />` element.. --> -<clickWithLeftButton selector="button#clickable" x="50" y="50" stepKey="clickButton3"/> -``` - -### clickWithRightButton - -See [clickWithRightButton docs on codeception.com](https://codeception.com/docs/modules/WebDriver#clickWithRightButton). - -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]. -`x`|string|optional| The x-axis value in pixels for the click location. -`y`|string|optional| The y-axis value in pixels for the click location. -`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. - -#### Examples - -```xml -<!-- Right click on the center of the `<button id="clickable" />` element. --> -<clickWithRightButton selector="button#clickable" stepKey="clickButton1"/> -``` - -```xml -<!-- Right click on the point that is 50 px from the top of the window and 50 px from the left of the window. --> -<clickWithRightButton x="50" y="50" stepKey="clickButton2"/> -``` - -```xml -<!-- Right click on the point that is 50 px from the top and 50 px from the left of of the `<button id="clickable" />` element.. --> -<clickWithRightButton selector="button#clickable" x="50" y="50" stepKey="clickButton3"/> -``` - -### closeAdminNotification - -Remove from the DOM all elements with the CSS classes `.modal-popup` or `.modals-overlay`. - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<!-- Remove elements of the `.modal-popup` or `.modals-overlay` CSS classes. --> -<closeAdminNotification stepKey="closeAdminNotification"/> -``` - -### closeTab - -See [closeTab docs on codeception.com](https://codeception.com/docs/modules/WebDriver#closeTab). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<!-- Close the active tab. --> -<closeTab stepKey="closeTab"/> -``` - -### comment - -Allows input of a string as a PHP code comment. -This tag is not executed. -It is intended to aid documentation and clarity of tests. - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|required| PHP comment that will be written in generated test file. -`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. - -```xml -<!-- Open the specified page and print a comment "I am on the login page" in the log during test execution. --> -<amOnPage url="/login" stepKey="goToLoginPage"/> -<comment userInput="I am on the login page" stepKey="loginPageComment"/> -``` - -### conditionalClick - -Conditionally clicks on an element if, and only if, another element is visible or not. - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the HTML element to be clicked. -`dependentSelector`|string|optional| The selector of the HTML element whose visibility is checked for to activate the click. -`visible`|boolean|optional| Determines whether the conditional click is activated by the element being visible or hidden. -`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. - -#### Examples - -```xml -<!-- Click on the element with `id="foo"` if the element with `id="bar"` is visible. --> -<conditionalClick selector="#foo" dependentSelector="#bar" visible="true" stepKey="click1"/> -``` - -### createData - -Creates an entity (for example, a category or product). -To create an entity, the MFTF makes a `POST` request to the Magento API according to the [data](../data.md) and [metadata](../metadata.md) of the entity to be created. - -Attribute|Type|Use|Description ----|---|---|--- -`entity`|string|required| Type of entity to be created. -`storeCode`|string|optional| ID of the store within which the data is created. -`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. - -It can optionally contain one or more `requiredEntity` child elements. - -#### Example - -```xml -<!-- Create an entity with the "SampleProduct" name. --> -<createData entity="SampleProduct" stepKey="createSampleProduct"/> -``` - -#### requiredEntity - -Specify relationships amongst data to be created. -For example, a complex Product object may contain within it a pointer (an ID) to a complex Category object. - -##### Example - -```xml -<!-- Create an entity with the "SampleCategory" name. --> -<createData entity="SampleCategory" stepKey="createCategory"/> -<!-- Create the "SampleProduct" product in that category. --> -<createData entity="SampleProduct" stepKey="createProduct"> - <requiredEntity createDataKey="createCategory"/> -</createData> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`createDataKey`|string|required| Name of the required entity. -`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. - -#### field - -Persists a custom field (as a part of the entity) overriding the matching declaration in static data. -This field is replaced at a top level only (nested values such as custom attributes or extension attributes are not replaced). - -Attribute|Type|Use|Description ----|---|---|--- -`key`|string|required| Name of the field to be replaced or added. - -##### Example - -To overwrite the `name` field in a particular product, specify a field element during its creation. - -```xml -<createData entity="SampleProduct" stepKey="createProduct"> - <field key="name">myCustomProductName</field> -</createData> -``` - -### deleteData - -Delete an entity that was previously created. - -Attribute|Type|Use|Description ----|---|---|--- -`createDataKey`|string|optional| Reference to `stepKey` of the `createData` action . -`url`|string|optional| REST API route to send a DELETE request. -`storeCode`|string|optional| ID of the store from which to delete the data. -`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. - -#### Examples - -Delete the entity that was previously created using [`createData`](#createdata) in the scope of the [test](../test.md#test-tag). - -1. Create _SampleCategory_: - -```xml -<createData entity="SampleCategory" stepKey="createCategory"/> -``` - -1. Delete _SampleCategory_: - -```xml -<deleteData createDataKey="createCategory" stepKey="deleteCategory"/> -``` - -#### Example of existing data deletion - -Delete an entity using [REST API](https://devdocs.magento.com/redoc/2.3/) request to the corresponding route: - -```xml -<grabFromCurrentUrl regex="/^.+id\/([\d]+)/" stepKey="grabId"/> -<deleteData url="V1/categories/{$grabId}" stepKey="deleteCategory"/> -``` - -### dontSee - -See [the codeception.com documentation for more information about this action](https://codeception.com/docs/modules/WebDriver#dontSee). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Value for the form field. -`selector`|string|optional| The selector identifying the corresponding HTML element. -`selectorArray`|string|optional| Array of selectors to evaluate. -`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. - -#### Example - -```xml -<!-- Check that the page does not contain the `<h2 id="title">Sample title</h2>` element. --> -<dontSee userInput="Sample title" selector="h2#title" stepKey="dontSeeTitle"/> -``` - -### dontSeeCheckboxIsChecked - -See [dontSeeCheckboxIsChecked docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeCheckboxIsChecked). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`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. - -#### Example - -```xml -<!-- Verify that the page does not contain the `<input type="checkbox" id="option1" ... >...</input>` element. --> -<dontSeeCheckboxIsChecked selector="input#option1" stepKey="checkboxNotChecked"/> -``` - -### dontSeeCookie - -See [dontSeeCookie docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeCookie). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Value for the form field. -`parameterArray`|string|optional| Parameters to search for within the cookie. -`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. - -#### Examples - -```xml -<!-- Verify that there is no cookie with the given name `cookie1`. --> -<dontSeeCookie userInput="cookie1" stepKey="cookie1NotPresent"/> -``` - -```xml -<!-- Verify that there is no cookie with the given name `cookie1` from the domain `www.example.com`. --> -<dontSeeCookie userInput="cookie1" parameterArray="['domainName' => '.example.com']" stepKey="dontSeeCookieInExampleDomain"/> -``` - -### dontSeeCurrentUrlEquals - -See [dontSeeCurrentUrlEquals docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeCurrentUrlEquals). - -Attribute|Type|Use|Description ----|---|---|--- -`url`|string|optional| URL to be compared with the current URL. -`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. - -#### Example - -```xml -<!-- Verify that the relative URL of the current page does not match `/admin`. --> -<dontSeeCurrentUrlEquals url="/admin" stepKey="notOnAdminPage"/> -``` - -### dontSeeCurrentUrlMatches - -See [dontSeeCurrentUrlMatches docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeCurrentUrlMatches) - -Attribute|Type|Use|Description ----|---|---|--- -`regex`|string|optional| Regular expression against the current URI. -`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. - -#### Example - -```xml -<!-- Verify that the relative URL of the current page does not match the `~$/users/(\d+)~` regular expression. --> -<dontSeeCurrentUrlMatches regex="~$/users/(\d+)~" stepKey="dontSeeCurrentUrlMatches"/> -``` - -### dontSeeElement - -See [dontSeeElement docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeElement). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`parameterArray`|string|optional| Parameters to search for within the selected element. -`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. - -#### Example - -```xml -<!-- Verify that `<div id="box" ... >...</div>` is missing or invisible on the current page. --> -<dontSeeElement selector="div#box" stepKey="dontSeeBox"/> -``` - -### dontSeeElementInDOM - -See [dontSeeElementInDOM docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeElementInDOM). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`parameterArray`|string|optional| Array of parameters to search for within the selector. -`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. - -#### Example - -```xml -<!-- Verify that `<div id="box" ... >...</div>` is completely missing on the current page. --> -<dontSeeElementInDOM selector="div#box" stepKey="dontSeeBoxInDOM"/> -``` - -### dontSeeInCurrentUrl - -See [dontSeeInCurrentUrl docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeInCurrentUrl). - -Attribute|Type|Use|Description ----|---|---|--- -`url`|string|optional| String to search for within the current URL. -`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. - -#### Example - -```xml -<!-- Verify that the url of the current active tab does not contain the string "/users/". --> -<dontSeeInCurrentUrl url="/users/" stepKey="dontSeeInCurrentUrl"/> -``` - -### dontSeeInField - -See [dontSeeInField docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeInField). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`selectorArray`|string|optional| Array of selectors to be searched. -`userInput`|string|optional| Value for the form field. -`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. - -#### Example - -```xml -<!-- Verify that `<input id="field" ... >...</input>` does not contain the text "Sample text". --> -<dontSeeInField userInput="Sample text" selector="input#field" stepKey="dontSeeInField1"/> -``` - -### dontSeeInFormFields - -See [dontSeeInFormFields docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeInFormFields). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`parameterArray`|string|optional| Array of name/value pairs of the form fields to check against. -`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. - -#### Example - -```xml -<!-- Verify that `<form name="myform" ... >...</form>` with the input elements `<input name="input1">...</input>` and `<input name="input2">...</input>`, do not have the values of `value1` and `value2` respectively. --> -<dontSeeInFormFields selector="form[name=myform]" parameterArray="['input1' => 'value1', 'input2' => 'value2']" stepKey="dontSeeInFormFields"/> -``` - -### dontSeeInPageSource - -See [dontSeeInPageSource docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeInPageSource). - -Attribute|Type|Use|Description ----|---|---|--- -`html`|string|required| HTML code to be searched for within the page source. The value must be entity-encoded. See example. -`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. - -#### Example - -```xml -<!-- Verify that the page source does not contain the raw source code `<h1 class="login-header">`. --> -<dontSeeInPageSource userInput="<h1 class="login-header">" stepKey="dontSeeInPageSource"/> -``` - -### dontSeeInSource - -See [dontSeeInSource docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeInSource). - -Attribute|Type|Use|Description ----|---|---|--- -`html`|string|required| HTML code to be searched for within the page source. The value must be entity-encoded. See example. -`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. - -#### Example - -You must encode the `html` using a tool such as [CyberChef](https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity(false,'Numeric%20entities')). - -```xml -<!-- Verify that the page source does not contain the raw source code `<h1 class="login-header">`. --> -<dontSeeInSource html="<h1 class="login-header">" stepKey="dontSeeInSource"/> -``` - -### dontSeeInTitle - -See [dontSeeInTitle docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeInTitle). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Value to be located in the page title. -`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. - -#### Example - -```xml -<!-- Verify that the title of the current active window does not contain the text "Page Title". --> -<dontSeeInTitle userInput="Page Title" stepKey="dontSeeInTitle"/> -``` - -### dontSeeJsError - -Ensure that the current page does not have JavaScript errors. - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<!-- Verify there are no JavaScript errors in the current active window. --> -<dontSeeJsError stepKey="dontSeeJsError"/> -``` - -### dontSeeLink - -See [dontSeeLink docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeLink). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Text of the link field to search for. -`url`|string|optional| Value of the href attribute to search for. -`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. - -#### Examples - -```xml -<!-- Verify that there is no hyperlink tag on the page with the text "External link". --> -<dontSeeLink userInput="External link" stepKey="dontSeeLink"/> -``` - -```xml -<!-- Verify that there is no hyperlink tag with the text "External link" and the `href` attribute of `/admin`. --> -<dontSeeLink userInput="External link" url="/admin" stepKey="dontSeeAdminLink"/> -``` - -### dontSeeOptionIsSelected - -See [dontSeeOptionIsSelected docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dontSeeOptionIsSelected). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding select element. -`userInput`|string|optional| Name of the option to look for. -`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. - -#### Example - -```xml -<!-- Verify that `<select id="myselect" ... >...</select>` does not have the option `option1` selected --> -<dontSeeOptionIsSelected userInput="option1" selector="select#myselect" stepKey="dontSeeOption1"/> -``` - -### doubleClick - -See [doubleClick docs on codeception.com](https://codeception.com/docs/modules/WebDriver#doubleClick). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`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. - -#### Example - -```xml -<!-- Click the selected element twice in succession. --> -<doubleClick selector="button#mybutton" stepKey="doubleClickButton"/> -``` - -### dragAndDrop - -See [dragAndDrop docs on codeception.com](https://codeception.com/docs/modules/WebDriver#dragAndDrop). - -Attribute|Type|Use|Description ----|---|---|--- -`selector1`|string|optional|A selector for the HTML element to drag. -`selector2`|string|optional|A selector for the HTML element to drop onto. -`x`|int|optional| X offset applied to drag-and-drop destination. -`y`|int|optional| Y offset applied to drag-and-drop destination. -`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. - -#### Examples - -```xml -<!-- Click and drag `<div id="block1" ... >...</div>` to the middle of `<div id="block2" ... >...</div>` --> -<dragAndDrop selector1="div#block1" selector2="div#block2" stepKey="dragAndDrop"/> -``` - -```xml -<!-- Click and drag `<div id="block1" ... >...</div>` to the middle of `<div id="block2" ... >...</div>` with a left offset of 50px and top offset of 50px. --> -<dragAndDrop selector1="#block1" selector2="#block2" x="50" y="50" stepKey="dragAndDrop"/> -``` - -### rapidClick - -See [rapidClick docs on codeception.com](https://codeception.com/docs/modules/WebDriver#rapidClick). - -| Attribute | Type | Use | Description | -|------------|--------|----------|-------------------------------------------------| -| `selector` | string | optional | A selector for the HTML element to rapid click. | -| `count` | string | required | Click count. | -| `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. | - -#### Examples - -```xml -<!-- Rapid click the selected element as per given count number --> -<rapidClick selector="#selector" count="50" stepKey="rapidClick"/> -``` - -### executeJS - -See [executeJS docs on codeception.com](https://codeception.com/docs/modules/WebDriver#executeJS). - -Attribute|Type|Use|Description ----|---|---|--- -`function`|string|optional| JavaScript to be executed. -`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. - -#### Example - -```xml -<!-- Return the time in seconds since Unix Epoch (January 1, 1970) using the JavaScript Date() function. -To access this value, use `{$returnTime}` in later actions. --> -<executeJS function="return Math.floor(new Date() / 1000);" stepKey="returnTime"/> -``` - -To access this value you would use `{$returnTime}` in later actions. - -### fillField - -See [fillField docs on codeception.com](https://codeception.com/docs/modules/WebDriver#fillField). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`selectorArray`|string|optional| Array of name/value pairs with which to populate the form. -`userInput`|string|optional| Value for the form field. -`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. - -#### Example - -```xml -<!-- Fill in `<input id="myfield" ... >...</input>` with the text "Sample text". --> -<fillField userInput="Sample text" selector="input#myfield" stepKey="fillField"/> -``` - -### 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|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. - -### generateDate - -Generates a date for use in `{$stepKey}` format in other test actions. - -Attribute|Type|Use|Description ----|---|---|--- -`date`|string|required| Date input to parse. Uses the same functionality as the PHP `strtotime()` function. -`format`|string|required| Format in which to save the given date. Uses the same formatting as the PHP `date()` function. -`timezone`|string|optional| Timezone to use when generating date, defaults to `America/Los_Angeles`. -`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. - -#### Example - -```xml -<!-- Generate a date that is 1 minute after the current date using Pacific Standard Time. For example "07/11/2020 7:00 AM". -To access this value, use `{$generateDate}` in later actions. --> -<generateDate date="+1 minute" format="m/d/Y g:i A" stepKey="generateDate"/> -``` - -### getData - -Gets an entity (for example, a category), from the Magento API according to the data and metadata of the entity type that is requested. - -Attribute|Type|Use|Description ----|---|---|--- -`storeCode`|string|optional| Identifier of the store from which to get the data. -`index`|integer|optional| The index in the returned data array. -`entity`|string|required| Name of the entity from which to get the data. -`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. - -#### Example - -```xml -<!-- Get the product attribute that was created using `<createData stepKey="productAttributeHandle" ... />`. --> -<getData entity="ProductAttributeOptionGetter" index="1" stepKey="getAttributeOption1Handle"> - <requiredEntity createDataKey="productAttributeHandle"/> -</getData> -``` - -The `ProductAttributeOptionGetter` entity must be defined in the corresponding [data `*.xml`](../data.md). - -This action can optionally contain one or more [requiredEntity](#requiredentity) child elements. - -### getOTP - -Generate a one-time password (OTP) based on a saved `secret` at path `magento/tfa/OTP_SHARED_SECRET` in a MFTF credential storage. -The one-time password (OTP) is returned and accessible through the stepkey. - -MFTF use TOTP from [Spomky-Labs/otphp](https://github.com/Spomky-Labs/otphp), if you want to learn more about this action. - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<getOTP stepKey="getOtp"/> -``` - -### grabAttributeFrom - -See [grabAttributeFrom docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabAttributeFrom). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`userInput`|string|optional| Name of tag attribute to grab. -`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. - -#### Example - -```xml -<!-- Grab the `title` attribute from `<input id="myinput" ... >...</input>`. -To access this value, use `{$grabAttributeFromInput}` in later actions. --> -<grabAttributeFrom userInput="title" selector="input#myinput" stepKey="grabAttributeFromInput"/> -``` - -### grabCookie - -See [grabCookie docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabCookie). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Name of the cookie to grab. -`parameterArray`|string|optional| Array of cookie parameters to grab. -`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. - -#### Examples - -```xml -<!-- Grab the cookie with the given name `cookie1`. -To access this value, use `{$grabCookie1}` in later actions. --> -<grabCookie userInput="cookie1" stepKey="grabCookie1"/> -``` - -```xml -<!-- Grab the cookie with the given name `cookie1` from the domain `www.example.com`. -To access this value, use `{$grabCookieExampleDomain}` in later actions. --> -<grabCookie userInput="cookie1" parameterArray="['domainName' => '.example.com']" stepKey="grabCookieExampleDomain"/> -``` - -### grabCookieAttributes - -See [grabCookieAttributes docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabCookieAttributes). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Name of the cookie to grab. -`parameterArray`|string|optional| Array of cookie parameters to grab. -`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. - -#### Examples - -```xml -<!-- Grab the cookie attributes with the given name `cookie1`. -To access these values, use `{$grabCookie1}` in later actions. --> -<grabCookieAttributes userInput="cookie1" stepKey="grabCookie1"/> -``` - -```xml -<!-- Grab the cookie attributes with the given name `cookie1` from the domain `www.example.com`. -To access these values, use `{$grabCookieExampleDomain}` in later actions. -To access expiry date, use `{$grabCookieExampleDomain.expiry}` in later actions. ---> -<grabCookieAttributes userInput="cookie1" parameterArray="['domainName' => '.example.com']" stepKey="grabCookieExampleDomain"/> -``` - -### grabFromCurrentUrl - -See [grabFromCurrentUrl docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabFromCurrentUrl).. - -Attribute|Type|Use|Description ----|---|---|--- -`regex`|string|optional| Regular expression against the current URI. -`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. - -#### Example - -```xml -<!-- Grab the text from the current URL that matches the regex expression `~$/user/(\d+)/~`. -To access this value, use `{$grabFromCurrentUrl}` in later actions. --> -<grabFromCurrentUrl regex="~$/user/(\d+)/~" stepKey="grabFromCurrentUrl"/> -``` - -### grabMultiple - -See [grabMultiple docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabMultiple).. - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`userInput`|string|optional| Name of the tag attribute to grab. -`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. - -#### Examples - -```xml -<!-- Grab every element on the page with the class `myElement` and return them as an array. -To access this value, use `{$grabAllMyElements}` in later actions. --> -<grabMultiple selector="div.myElement" stepKey="grabAllMyElements"/> -``` - -```xml -<!-- Grab the `href` tag from every `a` element on the page and return them as an array. -To access this value, use `{$grabAllLinks}` in later actions. --> -<grabMultiple userInput="href" selector="a" stepKey="grabAllLinks"/> -``` - -### grabPageSource - -See [grabPageSource docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabPageSource). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<!-- Store the page source code as text -To access this value, use `{$grabPageSource}` in later actions. --> -<grabPageSource stepKey="grabPageSource"/> -``` - -### grabTextFrom - -See [grabTextFrom docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabTextFrom). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`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. - -#### Example - -```xml -<!-- Store the text currently displayed by the selected element. -To access this value, use `{$grabTitle}` in later actions. --> -<grabTextFrom selector="h2#title" stepKey="grabTitle"/> -``` - -### grabValueFrom - -See [grabValueFrom docs on codeception.com](https://codeception.com/docs/modules/WebDriver#grabValueFrom). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`selectorArray`|string|optional| Array of selectors for the form fields to be selected. -`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. - -#### Example - -```xml -<!-- Store the value currently entered in <input id="name" ... >...</input>. -To access this value, use `{$grabInputName}` in later actions. --> -<grabValueFrom selector="input#name" stepKey="grabInputName"/> -``` - -### return - -Specifies what value is returned by an action group. The value can be then accessed in later steps using the action group stepKey. See [Action groups returning a value](./action-groups.md#return-a-value) for usage information. - -Attribute|Type|Use|Description ----|---|---|--- -`value`|string|required| value returned by action group. -`stepKey`|string|required| A unique identifier of the action. - -#### Example - -```xml -<!-- Returns value of $grabInputName to the calling --> -<return value="{$grabInputName}" stepKey="returnInputName"/> -``` - -### loadSessionSnapshot - -See [loadSessionSnapshot docs on codeception.com](https://codeception.com/docs/modules/WebDriver#loadSessionSnapshot). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Name of saved cookie. -`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. - -#### Example - -```xml -<!-- Load all cookies saved via `<saveSessionSnapshot name="savedSnapshot" ... />`. -To access this value, use the `loadSessionSnapshot` action --> -<loadSessionSnapshot userInput="savedSnapshot" stepKey="loadSnapshot"/> -``` - -### magentoCLI - -Specifies a CLI command to execute in a Magento environment. - -Attribute|Type|Use|Description ----|---|---|--- -`command`|string |optional| CLI command to be executed in Magento environment. -`arguments`|string |optional| Unescaped arguments to be passed in with the CLI command. -`timeout`|string|optional| Number of seconds CLI command can run without outputting anything. -`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. - -#### Example - -```xml -<!-- Re-index all indices via the command line. --> -<magentoCLI command="indexer:reindex" stepKey="reindex"/> -``` - -### magentoCron - -Used to execute Magento Cron jobs. Groups may be provided optionally. Internal mechanism of `<magentoCron>` ensures that Cron Job of single group is ran with 60 seconds interval. - -Attribute|Type|Use|Description ----|---|---|--- -`groups`|string |optional| Run only specified groups of Cron Jobs -`arguments`|string |optional| Unescaped arguments to be passed in with the CLI command. -`timeout`|string|optional| Number of seconds CLI command can run without outputting anything. -`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. - -#### Example -```xml -<magentoCron stepKey="runStagingCronJobs" groups="staging"/> -<!-- No interval here --> -<magentoCron stepKey="runIndexCronJobs" groups="index"/> -<!-- 60 seconds interval takes place here --> -<magentoCron stepKey="runAllCronJobs"/> -``` - -### makeScreenshot - -See [makeScreenshot docs on codeception.com](https://codeception.com/docs/modules/WebDriver#makeScreenshot). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Name of PNG file to be created. -`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. - -Note that the makeScreenshot action does not automatically add the screenshot to Allure reports. - -#### Example - -```xml -<!-- Take a screenshot of the page and save it to the directory `tests/_output/debug` under the name `example.png`. --> -<makeScreenshot userInput="example" stepKey="screenshotPage"/> -``` - -<div class="bs-callout bs-callout-info"> -This action does not add a screenshot to the Allure [report](../reporting.md).</div> - -### maximizeWindow - -See [maximizeWindow docs on codeception.com](https://codeception.com/docs/modules/WebDriver#maximizeWindow). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<!-- Maximize the current window. --> -<maximizeWindow stepKey="maximizeWindow"/> -``` - -### moveBack - -See [moveBack docs on codeception.com](https://codeception.com/docs/modules/WebDriver#moveBack). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<!-- Move back one page in history. --> -<moveBack stepKey="moveBack"/> -``` - -### moveForward - -See [moveForward docs on codeception.com](https://codeception.com/docs/modules/WebDriver#moveForward).. - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -```xml -<!-- Move forward one page in history. --> -<moveForward stepKey="moveForward"/> -``` - -### moveMouseOver - -See [moveMouseOver docs on codeception.com](https://codeception.com/docs/modules/WebDriver#moveMouseOver). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`selectorArray`|string|optional| Array of selectors. -`x`|string|optional| Number of pixels on the x-axis to offset from the selected element. -`y`|string|optional| Number of pixels on the y-axis to offset from the selected element. -`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. - -#### Example - -```xml -<!-- Move the mouse cursor over the selected element. --> -<moveMouseOver selector="button#product1" stepKey="hoverOverProduct1"/> -``` - -```xml -<!-- Move the mouse cursor over the selected element with an offset of 50px from the top and 50px from the left. --> -<moveMouseOver selector="button#product1" x="50" y="50" stepKey="hoverOverProduct2"/> -``` - -### mSetLocale - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Value of the expected locale. -`locale`|string|optional| Number of the locale value to be set. -`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. - -### mResetLocale - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### openNewTab - -See [openNewTab docs on codeception.com](https://codeception.com/docs/modules/WebDriver#openNewTab). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<!-- Open and switch to a new browser tab. --> -<openNewTab stepKey="openNewTab"/> -``` - -### parseFloat - -Parses float number with thousands separator. - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Float value to be parsed. -`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. - -### pause - -See usage of `<pause` in [interactive-pause](../interactive-pause.md) and [pause docs on codeception.com](https://codeception.com/docs/02-GettingStarted#Interactive-Pause). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<!-- Halt test execution until the `enter` key is pressed to continue. --> -<pause stepKey="pause"/> -``` - -### pressKey - -See [pressKey docs on codeception.com](https://codeception.com/docs/modules/WebDriver#pressKey). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`userInput`|string|optional| Key to be pressed. -`parameterArray`|string|optional| Array of keys to be pressed and functions to be run for the action. -`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. - -#### Examples - -```xml -<!-- Press the `a` key within the selected area. --> -<pressKey userInput="a" selector="#targetElement" stepKey="pressA"/> -``` - -The `parameterArray` attribute value must begin with `[` and end with `]`. -To press more than one key at a time, wrap the keys in secondary `[]`. - -```xml -<!-- Press the delete within the selected area uses key constants from the WebDriverKeys class. --> -<pressKey selector="#targetElement" parameterArray="[['ctrl', 'a'], \Facebook\WebDriver\WebDriverKeys::DELETE]" stepKey="pressDelete"/> -``` - -### reloadPage - -See [reloadPage docs on codeception.com](https://codeception.com/docs/modules/WebDriver#reloadPage). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<!-- Reload the current page. --> -<reloadPage stepKey="reloadPage"/> -``` - -### remove - -Removes action by its `stepKey`. - -Attribute|Type|Use|Description ----|---|---|--- -`keyForRemoval`|string|required| Set `stepKey` of the action you want to remove. - -#### Example - -```xml -<!-- Remove an action in the test with the stepKey of `stepKeyToRemove`. --> -<remove keyForRemoval="stepKeyToRemove"/> -``` - -### resetCookie - -See [resetCookie docs on codeception.com](https://codeception.com/docs/modules/WebDriver#resetCookie). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Name of the cookie to be reset. -`parameterArray`|string|optional| Array of key/values to get reset within the cookie. -`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. - -#### Examples - -```xml -<!-- Reset a cookie with the name `cookie1`. --> -<resetCookie userInput="cookie1" stepKey="resetCookie1"/> -``` - -```xml -<!-- Reset a cookie with the given name `cookie1` from the domain `www.example.com`. --> -<resetCookie userInput="cookie1" parameterArray="['domainName' => '.example.com']" stepKey="resetCookieExampleDomain"/> -``` - -### resizeWindow - -See [resizeWindow docs on codeception.com](https://codeception.com/docs/modules/WebDriver#resizeWindow). - -Attribute|Type|Use|Description ----|---|---|--- -`width`|string|optional| The new width of the window in pixels. -`height`|string|optional| The new height of the window in pixels. -`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. - -#### Examples - -```xml -<!-- Resize the current window to a width of 800px and a height of 600px. --> -<resizeWindow width="800" height="600" stepKey="resizeWindow"/> -``` - -### saveSessionSnapshot - -See [saveSessionSnapshot docs on codeception.com](https://codeception.com/docs/modules/WebDriver#saveSessionSnapshot). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Name of snapshot where cookies are to be saved. -`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. - -#### Example - -```xml -<!-- Save all of the current cookies under the name `savedSnapshot`. --> -<saveSessionSnapshot userInput="savedSnapshot" stepKey="saveCurrentCookies"/> -``` - -### scrollTo - -See [scrollTo docs on codeception.com](https://codeception.com/docs/modules/WebDriver#scrollTo). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`selectorArray`|string|optional| Array of selectors to return. -`x`|string|optional| x offset of the element to be scrolled to. -`y`|string|optional| y offset of the element to be scrolled to. -`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. - -#### Examples - -```xml -<!-- Move the page to the middle of the selected area. --> -<scrollTo selector="div#anchor" stepKey="scrollToAnchor"/> -``` - -```xml -<!-- Move the page to the middle of the selected area with an offset of 50px from the top and 50px from the left. --> -<scrollTo selector="div#anchor" x="50" y="50" stepKey="scrollToAnchor2"/> -``` - -### scrollToTopOfPage - -A convenience function that executes `window.scrollTo(0,0)` as JavaScript, thus returning to the top of the page. - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Examples - -```xml -<!-- Move the page to the uppermost, leftmost position. --> -<scrollToTopOfPage stepKey="scrollToTopOfPages"/> -``` - -### searchAndMultiSelectOption - -Search for and select options from a Magento multi-select drop-down menu. -For example, the drop-down menu you use to assign Products to Categories. - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|required|The selector of a multi select HTML element (drop-down menu). -`parameterArray`|array|required| Items to search and select in the selected drop-down menu. -`requiredAction`|boolean|optional|Clicks **Done** after selections if `true`. -`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. - -#### Example - -```xml -<!-- Search and select for "Item 1" amd "Item 2" in the Magento multiselect element with the id of `multiSelect`. --> -<searchAndMultiSelectOption selector="#multiSelect" parameterArray="['Item 1', 'Item 2']" stepKey="searchAndMultiSelect1"/> -``` - -On this test step the MFTF: - -1. Searches for a drop-down HTML element that matches the `#stuff` selector. -2. Opens the drop-down menu. -3. Enters **Item 1** in a search field of the drop-down element. -4. Selects first element from the filtered results. -5. Enters **Item 2** in a search field of the drop-down element. -6. Selects first element from the filtered results. - -### see - -See [see docs on codeception.com](https://codeception.com/docs/modules/WebDriver#see). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| The text to be searched for within the selector. -`selector`|string|optional| The selector identifying the corresponding HTML element to be searched for. -`selectorArray`|string|optional| Array of selectors to be searched for. -`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. - -#### Example - -```xml -<!-- Verify that the selected element contains the text "Sample title". --> -<see userInput="Sample title" selector="h2#title" stepKey="seeTitle"/> -``` - -### seeCheckboxIsChecked - -See [seeCheckboxIsChecked docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeCheckboxIsChecked). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`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. - -#### Example - -```xml -<!-- Verify `<input type="checkbox" id="option1" ... >...</input>` is checked. --> -<seeCheckboxIsChecked selector="input#option1" stepKey="seeCheckboxChecked"/> -``` - -### seeCookie - -See [seeCookie docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeCookie). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Name of the cookie to be searched for. -`parameterArray`|string|optional| Cookie parameters to be searched for. -`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. - -#### Examples - -```xml -<!-- Verify that there is a cookie with the given name `cookie1`. --> -<seeCookie userInput="cookie1" stepKey="cookie1Present"/> -``` - -```xml -<!-- Verify that there is a cookie with the given name `cookie1` from the domain `www.example.com`. --> -<seeCookie userInput="cookie1" parameterArray="['domainName' => 'www.example.com']" stepKey="seeCookieInExampleDomain"/> -``` - -### seeCurrentUrlEquals - -See [seeCurrentUrlEquals docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeCurrentUrlEquals). - -Attribute|Type|Use|Description ----|---|---|--- -`url`|string|optional| The full URL to be searched for. -`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. - -#### Example - -```xml -<!-- Verify that the relative URL of the current page matches `/admin`. --> -<seeCurrentUrlEquals url="/admin" stepKey="onAdminPage"/> -``` - -### seeCurrentUrlMatches - -See [seeCurrentUrlMatches docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeCurrentUrlMatches). - -Attribute|Type|Use|Description ----|---|---|--- -`regex`|string|optional| Regular expression against the current URI. -`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. - -#### Example - -```xml -<!-- Verify that the relative URL of the current page matches the `~$/users/(\d+)~` regular expression. --> -<seeCurrentUrlMatches regex="~$/users/(\d+)~" stepKey="seeCurrentUrlMatches"/> -``` - -### seeElement - -See [seeElement docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeElement). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`selectorArray`|string|optional| Array of selectors to be searched for. -`parameterArray`|string|optional| Array of parameters to be searched for within the selector. -`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. - -#### Example - -```xml -<!-- Verify that `<div id="box" ... >...</div>` is available and visible on the current page. --> -<seeElement selector="div#box" stepKey="seeBox"/> -``` - -### seeElementInDOM - -See [seeElementInDOM docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeElementInDOM). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`parameterArray`|string|optional| Array of parameters to be searched for within the selected element. -`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. - -#### Example - -```xml -<!-- Verify that `<div id="box" ... >...</div>` is available on the current page. --> -<seeElementInDOM selector="div#box" stepKey="seeBoxInDOM"/> -``` - -### seeInCurrentUrl - -See [seeInCurrentUrl docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInCurrentUrl). - -Attribute|Type|Use|Description ----|---|---|--- -`url`|string|optional| String to be searched for within the current URL. -`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. - -#### Example - -```xml -<!-- Verify that the url of the current active tab contains the string "/users/". --> -<seeInCurrentUrl url="/users/" stepKey="seeInCurrentUrl"/> -``` - -### seeInField - -See [seeInField docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInField). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`selectorArray`|string|optional| Array of selectors to be searched. -`userInput`|string|optional| Value to be searched for within the selected form field. -`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. - -#### Example - -```xml -<!-- Verify that `<input id="field" ... >...</input>` contains the text "Sample text". --> -<seeInField userInput="Sample text" selector="input#field" stepKey="seeInField"/> -``` - -### seeInFormFields - -See [seeInFormFields docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInFormFields). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`parameterArray`|string|optional| Array of parameters to be searched for within the selector. -`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. - -#### Example - -```xml -<!-- Verify that `<form name="myform" ... >...</form>` with the input elements `<input name="input1">...</input>` and `<input name="input2">...</input>`, has the values of `value1` and `value2` respectively. --> -<seeInFormFields selector="form[name=myform]" parameterArray="['input1' => 'value1', 'input2' => 'value2']" stepKey="seeInFormFields"/> -``` - -### seeInPageSource - -See [seeInPageSource docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInPageSource). - -Attribute|Type|Use|Description ----|---|---|--- -`html`|string|required| HTML code to be searched for within the page source. The value must be entity-encoded. See example. -`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. - -#### Example - -You must encode the `html` using a tool such as [CyberChef](https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity(false,'Numeric%20entities')). - -```xml -<!-- Verify that the page source contains the raw source code `<h1 class="login-header">`. --> -<seeInPageSource html="<h1 class="login-header">" stepKey="seeInPageSource"/> -``` - -### seeInPopup - -See [seeInPopup docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInPopup). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| String to be searched for within the popup. -`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. - -#### Example - -```xml -<!-- Verify the current popup on the page contains the string "Sample text". --> -<seeInPopup userInput="Sample text" stepKey="seeInPopup"/> -``` - -### seeInSource - -See [seeInSource docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInSource). - -Attribute|Type|Use|Description ----|---|---|--- -`html`|string|required| HTML code to be searched for within the page source. The value must be entity-encoded. See example. -`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. - -#### Example - -You must encode the `html` using a tool such as [CyberChef](https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity(false,'Numeric%20entities')). - -```xml -<!-- Verify that the page source contains the raw source code `<h1 class="login-header">`. --> -<seeInSource html="<h1 class="login-header">" stepKey="seeInSource"/> -``` - -### seeInTitle - -See [seeInTitle docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeInTitle). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| String to be searched for within the current page title. -`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. - -#### Example - -```xml -<!-- Verify that the title of the current active window contains the text "Page Title". --> -<seeInTitle userInput="Page Title" stepKey="seeInTitle"/> -``` - -### seeLink - -See [seeLink docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeLink). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| String to be searched for within the text of the link. -`url`|string|optional| Hyperlink to be searched. -`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. - -#### Example - -```xml -<!-- Verify that there is a hyperlink tag on the page with the text "External link". --> -<seeLink userInput="External link" stepKey="seeLink"/> -``` - -```xml -<!-- Verify that there is a hyperlink tag with the text "External link" and the `href` attribute of `/admin`. --> -<seeLink userInput="External link" url="/admin" stepKey="seeAdminLink"/> -``` - -### seeNumberOfElements - -See [seeNumberOfElements docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeNumberOfElements). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`userInput`|string|optional| Number of instances of the specified selector to be found. -`parameterArray`|string|optional| Array of parameters to be searched for within the selector. -`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. - -#### Examples - -```xml -<!-- Verify there are 10 `<div class="product" ... >...</div>` elements on the page. --> -<seeNumberOfElements userInput="10" selector="div.product" stepKey="seeTenProducts"/> -``` - -```xml -<!-- Verify there are between 5 and 10 `<div class="product" ... >...</div>` elements on the page. --> -<seeNumberOfElements parameterArray="[5, 10]" selector="div.product" stepKey="seeFiveToTenProducts"/> -``` - -### seeOptionIsSelected - -See [seeOptionIsSelected docs on codeception.com](https://codeception.com/docs/modules/WebDriver#seeOptionIsSelected). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`userInput`|string|optional| The name of the option that should be selected. -`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. - -#### Example - -```xml -<!-- Verify that `<select id="myselect" ... >...</select>` has the option `option1` selected --> -<seeOptionIsSelected userInput="option1" selector="select#myselect" stepKey="seeOption1"/> -``` - -### selectOption - -See [selectOption docs on codeception.com](https://codeception.com/docs/modules/WebDriver#selectOption). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`userInput`|string|optional| The name of the option to be selected. -`parameterArray`|string|optional| Array of options to be selected. -`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. - -#### Example - -```xml -<!-- Select `option1` from `<select id="mySelect" ... >...</select>`. --> -<selectOption userInput="option1" selector="select#mySelect" stepKey="selectOption1"/> -``` - -### selectMultipleOptions - -Selects all given options in the given Magento drop-down element. - -Attribute|Type|Use|Description ----|---|---|--- -`filterSelector`|string|required| The selector for the text filter field. -`optionSelector`|string|required| The selector used to select the corresponding options based on the filter field. -`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. - -It contains a child element `<array>` where you specify the options that must be selected using an array format like `['opt1', 'opt2']`. - -#### Example - -```xml -<!-- Select the options `opt1` and `opt2` from `<option class="option" ... >...</option>` and `<input class="filter" ...>...</input>` --> -<selectMultipleOptions filterSelector=".filter" optionSelector=".option" stepKey="selectMultipleOpts1"> - <array>['opt1', 'opt2']</array> -</selectMultipleOptions> -``` - -### setCookie - -See [setCookie docs on codeception.com](https://codeception.com/docs/modules/WebDriver#setCookie). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| The name of the cookie to be set. -`parameterArray`|string|optional| Array of name/value pairs to be set within the cookie. -`value`|string|optional| Value to be written to the cookie. -`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. - -#### Examples - -```xml -<!-- Set a cookie with the name of `cookieName` and value of `cookieValue`. --> -<setCookie userInput="cookieName" value="cookieValue" stepKey="setCookie"/> -``` - -### submitForm - -See [submitForm docs on codeception.com](https://codeception.com/docs/modules/WebDriver#submitForm). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`parameterArray`|string|optional| An array of form field names and their corresponding values. -`button`|string|optional| Selector for the form submit button. -`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. - -#### Examples - -```xml -<!-- Submit a value of `admin` for `<input name="username" ... >...</input>`, a value of `123123q` for `<input name="password" ... >...</input>` for the form `<form id="loginForm" ...>...</form>` and a submit button of `<button id="submit" ... >...</button>` --> -<submitForm selector="#loginForm" parameterArray="['username' => 'admin','password' => '123123q']" button="#submit" stepKey="submitForm"/> -``` - -### switchToIFrame - -See [switchToIFrame docs on codeception.com](https://codeception.com/docs/modules/WebDriver#switchToIFrame). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`userInput`|string|optional| The name of the IFrame to set focus to. -`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. - -#### Example - -```xml -<!-- Set the focus to <iframe name="embeddedFrame" ... /> --> -<switchToIFrame userInput="embeddedFrame" stepKey="switchToIFrame"/> -``` - -### switchToNextTab - -See [switchToNextTab docs on codeception.com](https://codeception.com/docs/modules/WebDriver#switchToNextTab). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Offset of the tab to open, usually a number. -`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. - -#### Examples - -```xml -<!-- Switch to the next tab. --> -<switchToNextTab stepKey="switchToNextTab"/> -``` - -```xml -<!-- Switch to the third next tab. --> -<switchToNextTab userInput="3" stepKey="switchToThirdNextTab"/> -``` - -### switchToPreviousTab - -See [switchToPreviousTab docs on codeception.com](https://codeception.com/docs/modules/WebDriver#switchToPreviousTab). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| Number of tabs to go back. -`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. - -#### Examples - -```xml -<!-- Switch to the previous tab. --> -<switchToPreviousTab stepKey="switchToPreviousTab"/> -``` - -```xml -<!-- Switch to the third previous tab. --> -<switchToPreviousTab userInput="3" stepKey="switchToThirdPreviousTab"/> -``` - -### switchToWindow - -See [switchToWindow docs on codeception.com](https://codeception.com/docs/modules/WebDriver#switchToWindow). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| The name of new window to be opened. -`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. - -#### Example - -```xml -<!-- Switch to a window with the `name` parameter of `newWindow`. --> -<switchToWindow userInput="newWindow" stepKey="switchToWindow"/> -``` - -### typeInPopup - -See [typeInPopup docs on codeception.com](https://codeception.com/docs/modules/WebDriver#typeInPopup). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| String to be added to the current popup. -`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. - -#### Example - -```xml -<!-- Type the text "Sample Text" into the current popup visible on the page. --> -<typeInPopup userInput="Sample Text" stepKey="typeInPopup"/> -``` - -### uncheckOption - -See [uncheckOption docs on codeception.com](https://codeception.com/docs/modules/WebDriver#uncheckOption). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`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. - -#### Example - -```xml -<!-- Ensure the checkbox `<input type="checkbox" id="checkbox" ... >...</input>` is unchecked. --> -<uncheckOption selector="input#checkbox" stepKey="uncheckCheckbox"/> -``` - -### unselectOption - -See [unselectOption docs on codeception.com](https://codeception.com/docs/modules/WebDriver#unselectOption). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`userInput`|string|optional| The name of the option to deselect. -`parameterArray`|string|optional| Array of options to be deselected. -`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. - -#### Example - -```xml -<!-- Deselect `option1` from `<select id="mySelect" ... >...</select>`. --> -<unselectOption userInput="option1" selector="select#myselect" stepKey="unselectOption1"/> -``` - -### updateData - -When you create a data entity using `createData`, you may need to update it later in the test. -The `updateData` action allows this. - -For example, to change the price of a product: - -```xml -<updateData entity="AdjustPriceProduct" createDataKey="productHandle" stepKey="updateProduct"/> -``` - -Where `AdjustPriceProduct` simply looks like this: - -```xml -<entity name="AdjustPriceProduct" type="product"> - <data key="price">321.00</data> -</entity> -``` - -Only the fields that you want to update are set. - -Attribute|Type|Use|Description ----|---|---|--- -`storeCode`|string|optional| ID of the store in which to apply the updated data. -`entity`|string|required| The name of the `updateData` entity being created. -`createDataKey`|string|required| Key of the data entity to be updated. -`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. - -This action can optionally contain one or more [requiredEntity](#requiredentity) child elements. - -### wait - -See [wait docs on codeception.com](https://codeception.com/docs/modules/WebDriver#wait). - -Attribute|Type|Use|Description ----|---|---|--- -`time`|string|optional| The number of seconds to wait. -`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. - -#### Example - -```xml -<!-- Halt test execution for 10 seconds before continuing. --> -<wait time="10" stepKey="waitTenSeconds"/> -``` - -### waitForAjaxLoad - -Wait for all AJAX calls to finish. - -Attribute|Type|Use|Description ----|---|---|--- -`time`|string|optional| The number of seconds to wait for Ajax calls to finish. -`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. - -#### Example - -```xml -<!-- Wait up to 30 seconds for all AJAX calls to finish before continuing. --> -<waitForAjaxLoad stepKey="waitForAjaxLoad"/> -``` - -### waitForElementChange - -See [waitForElementChange docs on codeception.com](https://codeception.com/docs/modules/WebDriver#waitForElementChange). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the HTML element to be changed. -`function`|string|optional| The function to be run after the element changes. -`time`|string|optional| The number of seconds to wait for the change. Default is 30. -`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. - -#### Example - -```xml -<!-- Wait up to 30 seconds for `<div id="changedElement" ... >...</div>` to change to displayed before continuing. --> -<waitForElementChange selector="div#changedElement" function="function(\WebDriverElement $el) {return $el->isDisplayed();}" stepKey="waitForElementChange"/> -``` - -### waitForElement - -See [waitForElement docs on codeception.com](https://codeception.com/docs/modules/WebDriver#waitForElement). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`time`|string|optional| The number of seconds to wait for the element to appear. -`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. - -#### Example - -```xml -<!-- Wait up to 30 seconds for `<div id="changedElement" ... >...</div>` to be appear on the page before continuing. --> -<waitForElement selector="#changedElement" stepKey="waitForElement"/> -``` - -### waitForElementNotVisible - -See [waitForElementNotVisible docs on codeception.com](https://codeception.com/docs/modules/WebDriver#waitForElementNotVisible). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`time`|string|optional| The number of seconds to wait for the element to become not visible. -`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. - -#### Example - -```xml -<!-- Wait up to 30 seconds for `<div id="changedElement" ... >...</div>` to become non-visible on the page before continuing. --> -<waitForElementNotVisible selector="#changedElement" stepKey="waitForElementNotVisible"/> -``` - -### waitForElementVisible - -See [waitForElementVisible docs on codeception.com](https://codeception.com/docs/modules/WebDriver#waitForElementVisible). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`time`|string|optional| The number of seconds to wait for the element to appear. -`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. - -#### Example - -```xml -<waitForElementVisible selector="#changedElement" stepKey="waitForElementVisible"/> -``` - -### waitForElementClickable - -See [waitForElementClickable docs on codeception.com](https://codeception.com/docs/modules/WebDriver#waitForElementClickable). - -Attribute|Type|Use|Description ----|---|---|--- -`selector`|string|optional| The selector identifying the corresponding HTML element. -`time`|string|optional| The number of seconds to wait for the element to appear. -`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. - -#### Example - -```xml -<!-- Waits up to $timeout seconds for the given element to be clickable. If element doesn’t become clickable, a timeout exception is thrown. --> -<waitForElementClickable selector="#changedElement" stepKey="waitForElementClickable"/> -``` - -### waitForJS - -See [waitForJS docs on codeception.com](https://codeception.com/docs/modules/WebDriver#waitForJS). - -Attribute|Type|Use|Description ----|---|---|--- -`function`|string|optional| The function to be run after all JavaScript finishes. -`time`|string|optional| The number of seconds to wait for JavaScript to finish. -`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. - -#### Example - -```xml -<!-- Wait for all jQuery AJAX requests to finish before continuing. --> -<waitForJS function="return $.active == 0;" stepKey="waitForJS"/> -``` - -### waitForLoadingMaskToDisappear - -Wait for all Magento loading overlays to disappear. - -<div class="bs-callout bs-callout-info"> -The CSS class for loading masks is not used consistently throughout Magento. -Therefore, this convenience function tries to wait for various specific selectors.</div> - -```config -# Wait for these classes to not be visible - -//div[contains(@class, "loading-mask")] -//div[contains(@class, "admin_data-grid-loading-mask")] -//div[contains(@class, "admin__data-grid-loading-mask")] -//div[contains(@class, "admin__form-loading-mask")] -//div[@data-role="spinner"] -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -#### Example - -```xml -<!-- Wait up to 30 seconds for all Magento loading overlays to disappear before continuing. --> -<waitForLoadingMaskToDisappear stepKey="waitForLoadingMaskToDisappear"/> -``` - -### waitForPageLoad - -Wait for AJAX, Magento loading overlays, and `document.readyState == "complete"`. - -Attribute|Type|Use|Description ----|---|---|--- -`time`|string|optional| Number of seconds to wait for the page to load. -`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. - -#### Example - -```xml -<!-- Wait up to 30 seconds for the current page to fully load before continuing. --> -<waitForPageLoad stepKey="waitForPageLoad"/> -``` - -### waitForPwaElementNotVisible - -Waits up to the given `time` for a PWA Element to disappear from the screen. - -Attribute|Type|Use|Description ----|---|---|--- -`time`|string|optional| Number of seconds to wait for the element to disappear. -`selector`|string|required| The selector identifying the corresponding HTML element. -`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. - -#### Example - -```xml -<!-- Wait for the PWA element to disappear. --> -<waitForPwaElementNotVisible time="1" stepKey="waitForPwaElementNotVisible"/> -``` - -### waitForPwaElementVisible - -Waits up to the given 'time' for a PWA Element to appear on the screen. - -Attribute|Type|Use|Description ----|---|---|--- -`time`|string|optional| Number of seconds to wait for the selected element. -`selector`|string|required| The selector identifying the corresponding HTML element. -`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. - -#### Example - -```xml -<!-- Wait for the selected element to appear. --> -<waitForPwaElementVisible stepKey="waitForPwaElementVisible"/> -``` - -### waitForText - -See [waitForText docs on codeception.com](https://codeception.com/docs/modules/WebDriver#waitForText). - -Attribute|Type|Use|Description ----|---|---|--- -`userInput`|string|optional| The string to wait for. -`time`|string|optional| The number of seconds to wait for the text to appear. -`selector`|string|optional| The selector identifying the corresponding HTML element. -`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. - -#### Example - -```xml -<!-- Wait for text "Sample Text" to appear in the selected area before continuing. --> -<waitForText userInput="Sample Text" selector="div#page" stepKey="waitForText"/> -``` diff --git a/docs/test/annotations.md b/docs/test/annotations.md deleted file mode 100644 index cd3a672a1..000000000 --- a/docs/test/annotations.md +++ /dev/null @@ -1,243 +0,0 @@ -# Annotations - - -Annotations are essentially comments in the code. In PHP, they all are marked by a preceding `@` symbol. - -Within [tests], annotations are contained within their own node. - -## Principles - -The following conventions apply to annotations in the Magento Functional Testing Framework (MFTF): - -- All annotations are within an `<annotations>` element. -- Each element within corresponds to a supported annotation type. -- There is no distinction made in XML between Codeception annotations and Allure annotations. -- Each annotation contains only one value. -If multiple annotation values are supported and required each value requires a separate annotation. -- Tests must contain all of the following annotations: stories, title, description, severity. - -Recommended use cases of the annotation types: - -- [stories] - report grouping, a set of tests that verify a story. -- [title] - description of the test purpose. -- [group] - general functionality grouping. -- [description] - description of how the test achieves the purpose defined in the title. -- [skip] - a label for the test to be skipped during generation (for example, an incomplete test blocked by an issue) - -## Example - -```xml -<annotations> - <stories value="Category Creation"/> - <title value="Create a Category via Admin"/> - <description value="Test logs into admin backend and creates a category."/> - <severity value="CRITICAL"/> - <group value="category"/> -</annotations> -``` - -## Reference - -### description - -The `<description>` element is an implementation of a [`@Description`] Allure tag; Metadata for report. - -Attribute|Type|Use ----|---|-- -`value`|string|required - -#### Example - -```xml -<description value="Add Catalog via Admin"/> -``` - -### features - -The `<features>` element is an implementation of a [`@Features`] Allure tag. - -`<features>` sets a string that will be displayed as a feature within the Allure report. Tests under the same feature are grouped together in the report. - -Attribute|Type|Use ----|---|-- -`value`|string|required - -#### Example - -```xml -<features value="Catalog"/> -<features value="Add/Edit"/> -``` - -### group - -The `<group>` element is an implementation of a [`@group`] Codeception tag. - -`<group>` specifies a string to identify and collect tests together. -Any test can be a part of multiple groups. -The purpose of grouping is to create a set of test for a functionality or purpose, such as all cart tests or all slow tests and run them together locally. - -<div class="bs-callout bs-callout-warning" markdown="1"> -Group values cannot collide with [suite][] names. -</div> - -<div class="bs-callout bs-callout-tip" markdown="1"> -Add `<skip>` to the test to skip it during test run. -</div> - -Attribute|Type|Use|Definition ----|---|---|--- -`value`|string|required|A value that is used to group tests. It should be lower case. - -#### Example - -```xml -<group value="category"/> -``` - -### return - -The `<return>` element is an implementation of a [`@return`] Codeception tag. -It specifies what is returned from a test execution. - -Attribute|Type|Use ----|---|-- -`value`|string|required - -#### Example - -```xml -<return value="void"/> -``` - -### severity - -The `<severity>` element is an implementation of the [`@Severity`] Allure annotation, which is used to prioritise tests by severity. - -Attribute|Type|Use|Acceptable values ----|---|---|--- -`value`|string|required|`MINOR`, `AVERAGE`, `MAJOR`, `CRITICAL`, `BLOCKER` - -#### Example - -```xml -<severity value="CRITICAL"/> -``` - -#### Usage guidelines - -Severity Level|Usage ----|--- -`BLOCKER`|If this test fails, the customer is completely blocked from purchasing a product. -`CRITICAL`|This is a serious problem impacting conversion, or affecting the operation of the store. -`MAJOR`|Store conversion rate is reduced owing to this issue. For example, something is broken or missing that impacts checkout frequency or cart volume. -`AVERAGE`|A fault on the storefront that can negatively impact conversion rate (like UI errors or omissions), or problems with Magento admin functionality. -`MINOR`|An application or configuration fault that has no impact on conversion rate. - -### skip - -Use the `<skip>` element to skip a test. -It contains one or more child elements `<issueId>` to specify one or more issues that cause the test skipping. - -#### issueId - -This element under `<skip>` is required at least once and contains references to issues that cause the test to be skipped. - -Attribute|Type|Use ----|---|-- -`value`|string|required - -#### Example - -```xml -<skip> - <issueId value="#117"/> - <issueId value="MC-345"/> -</skip> -``` - -### stories - -The `<stories>` element is an implementation of a [`@Stories`] Allure tag. -It has the same functionality as [features], within the Story report group. - -Attribute|Type|Use ----|---|-- -`value`|string|required - -#### Example - -```xml -<stories value="Add Catalog"/> -<stories value="Edit Catalog"/> -``` - -### testCaseId - -The `<testCaseId>` element is an implementation of a [`@TestCaseId`] Allure tag. -It specifies a ZephyrId for a test. - -This tag is prefixed to a title of the test annotation to make the test title unique in Allure. - -If the linkage is set up correctly in the Allure config, the test will have a hyperlink to the Zephyr test case in the report. - -Learn more about [setup instructions in Allure]. - -Attribute|Type|Use ----|---|-- -`value`|string|required - -#### Example - -```xml -<testCaseId value="#"/> -``` - -### title - -The `<title>` element is an implementation of [`@Title`] Allure tag; Metadata for report. - -Attribute|Type|Use ----|---|-- -`value`|string|required - -#### Example - -```xml -<title value="Add Catalog"/> -``` - -### useCaseId - -The `<useCaseId>` element is an implementation of a `@UseCaseId` custom tag. It specifies the use case ID for a test and is ignored by Allure configuration at the moment, as Allure implementation is not complete. - -Attribute|Type|Use ----|---|-- -`value`|string|required - -#### Example - -```xml -<useCaseId value="USECASE-1"/> -``` - -<!-- Link definitions --> - -[`@Description`]: https://github.com/allure-framework/allure-phpunit#extended-test-class-or-test-method-description -[`@Features`]: https://github.com/allure-framework/allure-phpunit#map-test-classes-and-test-methods-to-features-and-stories -[`@group`]: https://codeception.com/docs/07-AdvancedUsage#Groups -[`@return`]: https://codeception.com/docs/07-AdvancedUsage#Examples -[`@Severity`]: https://github.com/allure-framework/allure-phpunit#set-test-severity -[`@Stories`]: https://github.com/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 -[`@Title`]: https://github.com/allure-framework/allure-phpunit#human-readable-test-class-or-test-method-title -[description]: #description -[features]: #features -[group]: #group -[setup instructions in Allure]: https://github.com/allure-framework/allure1/wiki/Test-Case-ID -[severity]: #severity -[stories]: #stories -[suite]: ../suite.md -[tests]: ../test.md -[title]: #title -[skip]: #skip diff --git a/docs/test/assertions.md b/docs/test/assertions.md deleted file mode 100644 index a3e97cf51..000000000 --- a/docs/test/assertions.md +++ /dev/null @@ -1,704 +0,0 @@ -# Assertions - -Assertions serve to pass or fail the [test](../test.md#test-tag) if a condition is not met. These assertions will look familiar to you if you've used any other testing framework, like PHPUnit. - -All assertions contain the same [common actions attributes](./actions.md#common-attributes): `stepKey`, `before`, and `after`. - -Most assertions contain a `message` attribute that specifies the text of an informational message to help you identify the cause of the failure. - -## Principles - -The [principles for actions](../test.md#principles) are also applicable to assertions. - -Assertion actions have nested self-descriptive elements, `<expectedResult>` and `<actualResult>`. These elements contain a result type and a value: - -* `type` - * `const` (default) - * `int` - * `float` - * `bool` - * `string` - * `variable` - * `array` -* `value` - -If `variable` is used, the test transforms the corresponding value to `$variable`. Use the `stepKey` of a test, that returns the value you want to use, in assertions: - -`actual="stepKeyOfGrab" actualType="variable"` - -To use variables embedded in a string in `expected` and `actual` of your assertion, use the `{$stepKey}` format: - -`actual="A long assert string {$stepKeyOfGrab} with an embedded variable reference." actualType="variable"` - -In case of `assertContains` actions, `<expectedResult>` is the needle and `<actualResult>` is the haystack. - -## Example - -The following example shows a common test that gets text from a page and asserts that it matches what we expect to see. If it does not, the test will fail at the assert step. - -```xml -<!-- Grab a value from the page using any grab action --> -<grabTextFrom selector="#elementId" stepKey="stepKeyOfGrab"/> - -<!-- Ensure that the value we grabbed matches our expectation --> -<assertEquals message="This is an optional human readable hint that will be shown in the logs if this assert fails." stepKey="assertEquals1"> - <expectedResult type="string">Some String</expectedResult> - <actualResult type="string">A long assert string {$stepKeyOfGrab} with an embedded variable reference.</actualResult> -</assertEquals> -``` - -## Elements reference - -### assertElementContainsAttribute - -The `<assertElementContainsAttribute>` asserts that the selected html element contains and matches the expected value for the given attribute. - -Example: - -```xml -<assertElementContainsAttribute stepKey="assertElementContainsAttribute"> - <expectedResult selector=".admin__menu-overlay" attribute="style" type="string">color: #333;</expectedResult> -</assertElementContainsAttribute> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertArrayIsSorted - -The `<assertArrayIsSorted>` asserts that the array is sorted according to a specified sort order, ascending or descending. - -Example: - -```xml -<assertArrayIsSorted sortOrder="asc" stepKey="assertSorted"> - <array>[1,2,3,4,5,6,7]</array> -</assertArrayIsSorted> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`sortOrder`|Possible values: `asc`, `desc`|required| A sort order to assert on array values. -`stepKey`|string|required| A unique identifier of the test step. -`before`|string|optional| `stepKey` of action that must be executed next. -`after`|string|optional| `stepKey` of the preceding action. - -It contains an `<array>` child element that specifies an array to be asserted for proper sorting. -It must be in typical array format like `[1,2,3,4,5]` or `[alpha, brontosaurus, zebra]`. - -### assertArrayHasKey - -See [assertArrayHasKey docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertArrayHasKey) - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertArrayNotHasKey - -See [assertArrayNotHasKey docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertArrayNotHasKey). - -Attribute|Type|Use|Description ----|---|---|--- -`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](https://codeception.com/docs/modules/Asserts#assertContains). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertStringContainsString - -See [assertStringContainsString docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertStringContainsString). - -Example: - -```xml -<assertStringContainsString stepKey="assertDropDownTierPriceTextProduct1"> - <expectedResult type="string">Buy 5 for $5.00 each and save 50%</expectedResult> - <actualResult type="variable">DropDownTierPriceTextProduct1</actualResult> -</assertStringContainsString> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`message`|string|optional|Text describing the cause of the failure. -`stepKey`|string|required| Unique identifier of the text step. -`before`|string|optional| `stepKey` of the action that must be executed next. -`after`|string|optional| `stepKey` of the preceding action. - -### assertStringContainsStringIgnoringCase - -See [assertStringContainsStringIgnoringCase docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertStringContainsStringIgnoringCase). - -Example: - -```xml -<assertStringContainsStringIgnoringCase stepKey="verifyContentType"> - <actualResult type="variable">grabContentType</actualResult> - <expectedResult type="string">{{image.extension}}</expectedResult> -</assertStringContainsStringIgnoringCase> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`message`|string|optional|Message describing the cause of failure. -`stepKey`|string|required| A unique identifier of the text step. -`before`|string|optional| `stepKey` of the action that must be executed next. -`after`|string|optional| `stepKey` of the preceding action. - -### assertCount - -See [assertCount docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertCount). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertEmpty - -See [assertEmpty docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertEmpty). - -Example: - -```xml -<assertEmpty stepKey="assertSearchButtonEnabled"> - <actualResult type="string">$grabSearchButtonAttribute</actualResult> -</assertEmpty> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertEquals - -See [assertEquals docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertEquals). - -Example: - -```xml -<assertEquals message="ExpectedPrice" stepKey="assertBundleProductPrice"> - <actualResult type="variable">grabProductPrice</actualResult> - <expectedResult type="string">$75.00</expectedResult> -</assertEquals> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertEqualsWithDelta - -See [assertEqualsWithDelta docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertEqualsWithDelta). - -Attribute|Type|Use|Description ----|---|---|--- -`delta`|string|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. - -### assertEqualsCanonicalizing - -See [assertEqualsCanonicalizing docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertEqualsCanonicalizing). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertEqualsIgnoringCase - -See [assertEqualsIgnoringCase docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertEqualsIgnoringCase). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertFalse - -See [assertFalse docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertFalse). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertFileExists - -See [assertFileExists docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertFileExists). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertFileNotExists - -See [assertFileNotExists docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertFileNotExists). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertGreaterOrEquals - -See [assertGreaterOrEquals docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertGreaterOrEquals). - -Example: - -```xml -<assertGreaterOrEquals stepKey="checkStatusSortOrderAsc" after="getOrderStatusSecondRow"> - <actualResult type="const">$getOrderStatusSecondRow</actualResult> - <expectedResult type="const">$getOrderStatusFirstRow</expectedResult> -</assertGreaterOrEquals> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertGreaterThan - -See [assertGreaterThan docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertGreaterThan). - -Example: - -```xml -<assertGreaterThan stepKey="checkQuantityWasChanged"> - <actualResult type="const">$grabEndQuantity</actualResult> - <expectedResult type="const">$grabStartQuantity</expectedResult> -</assertGreaterThan> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertGreaterThanOrEqual - -See [assertGreaterThanOrEqual docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertGreaterThanOrEqual). - -Example: - -```xml -<assertGreaterThanOrEqual stepKey="checkStatusSortOrderAsc" after="getOrderStatusSecondRow"> - <actualResult type="const">$getOrderStatusSecondRow</actualResult> - <expectedResult type="const">$getOrderStatusFirstRow</expectedResult> -</assertGreaterThanOrEqual> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertInstanceOf - -See [assertInstanceOf docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertInstanceOf). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertIsEmpty - -See [assertIsEmpty docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertIsEmpty). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertLessOrEquals - -See [assertLessOrEquals docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertLessOrEquals). - -Example: - -```xml -<assertLessOrEquals stepKey="checkHeightIsCorrect"> - <actualResult type="variable">getImageHeight</actualResult> - <expectedResult type="variable">getSectionHeight</expectedResult> -</assertLessOrEquals> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertLessThan - -See [assertLessThan docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertLessThan). - -Example: - -```xml -<assertLessThan stepKey="assertLessImages"> - <expectedResult type="variable">initialImages</expectedResult> - <actualResult type="variable">newImages</actualResult> -</assertLessThan> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertLessThanOrEqual - -See [assertLessThanOrEqual docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertLessThanOrEqual). - -Example: - -```xml -<assertLessThanOrEqual stepKey="checkHeightIsCorrect"> - <actualResult type="variable">getImageHeight</actualResult> - <expectedResult type="variable">getSectionHeight</expectedResult> -</assertLessThanOrEqual> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertNotContains - -See [assertNotContains docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertNotContains). - -Example: - -```xml -<assertNotContains stepKey="assertCustomerGroupNotInOptions"> - <actualResult type="variable">customerGroups</actualResult> - <expectedResult type="string">{{customerGroup.code}}</expectedResult> -</assertNotContains> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertStringNotContainsString - -See [assertStringNotContainsString docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertStringNotContainsString). - -Example: - -```xml -<assertStringNotContainsString stepKey="checkoutAsGuest"> - <expectedResult type="string">{{CaptchaData.checkoutAsGuest}}</expectedResult> - <actualResult type="variable">$formItems</actualResult> -</assertStringNotContainsString> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertStringContainsStringIgnoringCase - -See [assertStringNotContainsStringIgnoringCase docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertStringNotContainsStringIgnoringCase). - -Example: - -```xml -<assertStringContainsStringIgnoringCase stepKey="verifyContentType"> - <actualResult type="variable">grabContentType</actualResult> - <expectedResult type="string">{{image.extension}}</expectedResult> -</assertStringContainsStringIgnoringCase> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertNotEmpty - -See [assertNotEmpty docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertNotEmpty). - -Example: - -```xml -<assertNotEmpty stepKey="checkSwatchFieldForAdmin"> - <actualResult type="const">$grabSwatchForAdmin</actualResult> -</assertNotEmpty> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertNotEquals - -See [assertNotEquals docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertNotEquals). - -Example: - -```xml -<assertNotEquals stepKey="assertNotEquals"> - <actualResult type="string">{$grabTotalAfter}</actualResult> - <expectedResult type="string">{$grabTotalBefore}</expectedResult> -</assertNotEquals> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertNotEqualsWithDelta - -See [assertNotEqualsWithDelta docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertNotEqualsWithDelta). - -Attribute|Type|Use|Description ----|---|---|--- -`delta`|string|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. - -### assertNotEqualsCanonicalizing - -See [assertNotEqualsCanonicalizing docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertNotEqualsCanonicalizing). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertNotEqualsIgnoringCase - -See [assertNotEqualsIgnoringCase docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertNotEqualsIgnoringCase). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertNotInstanceOf - -See [assertNotInstanceOf docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertNotInstanceOf). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertNotNull - -See [assertNotNull docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertNotNull). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertNotRegExp - -See [assertNotRegExp docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertNotRegExp). - -Example: - -```xml -<assertNotRegExp stepKey="simpleThumbnailIsNotDefault"> - <actualResult type="const">$getSimpleProductThumbnail</actualResult> - <expectedResult type="const">'/placeholder\/thumbnail\.jpg/'</expectedResult> -</assertNotRegExp> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertNotSame - -See [assertNotSame docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertNotSame). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertNull - -See [assertNull docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertNull). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertRegExp - -See [assertRegExp docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertRegExp). - -Example: - -```xml -<assertRegExp message="adminAnalyticsMetadata object is invalid" stepKey="validateadminAnalyticsMetadata"> - <expectedResult type="string">#var\s+adminAnalyticsMetadata\s+=\s+{\s+("[\w_]+":\s+"[^"]*?",\s+)*?("[\w_]+":\s+"[^"]*?"\s+)};#s</expectedResult> - <actualResult type="variable">$pageSource</actualResult> -</assertRegExp> -``` - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertSame - -See [assertSame docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertSame). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertStringStartsNotWith - -See [assertStringStartsNotWith docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertStringStartsNotWith). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertStringStartsWith - -See [assertStringStartsWith docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertStringStartsWith). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### assertTrue - -See [assertTrue docs on codeception.com](https://codeception.com/docs/modules/Asserts#assertTrue). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### expectException - -See [expectException docs on codeception.com](https://codeception.com/docs/modules/Asserts#expectException). - -Attribute|Type|Use|Description ----|---|---|--- -`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. - -### fail - -See [fail docs on codeception.com](https://codeception.com/docs/modules/Asserts#fail). - -Attribute|Type|Use|Description ----|---|---|--- -`message`|string|required| -`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. diff --git a/docs/tips-tricks.md b/docs/tips-tricks.md deleted file mode 100644 index a2300c3bf..000000000 --- a/docs/tips-tricks.md +++ /dev/null @@ -1,423 +0,0 @@ -# Tips and Tricks - -Sometimes, little changes can make a big difference in your project. Here are some test writing tips to keep everything running smoothly. - -## Actions and action groups - -### Use parameterized selectors in action groups with argument references - -Clarity and readability are important factors in good test writing. -Having to parse through unreadable code can be time consuming. Save time by writing clearly. -The good example clearly shows what the selector arguments refer to. -In the bad example we see two parameters being passed into the selector with little clue as to their purpose. - -**Why?** The next person maintaining the test or extending it may not be able to understand what the parameters are referencing. - -<span style="color:green"> -Good -</span> - -<!-- {% raw %} --> - -```xml -<test> - <actionGroup ref="VerifyOptionInProductStorefront" stepKey="verifyConfigurableOption" after="AssertProductInStorefrontProductPage"> - <argument name="attributeCode" value="$createConfigProductAttribute.default_frontend_label$"/> - <argument name="optionName" value="$createConfigProductAttributeOption1.option[store_labels][1][label]$"/> - </actionGroup> -</test> - -<actionGroup name="VerifyOptionInProductStorefront"> - <arguments> - <argument name="attributeCode" type="string"/> - <argument name="optionName" type="string"/> - </arguments> - <seeElement selector="{{StorefrontProductInfoMainSection.attributeOptionByAttributeID(attributeCode, optionName)}}" stepKey="verifyOptionExists"/> -</actionGroup> -``` - -<span style="color:red"> -Bad -</span> - -```xml -<test> - <seeElement selector="{{StorefrontProductInfoMainSection.attributeOptionByAttributeID($createConfigProductAttribute.default_frontend_label$, $createConfigProductAttributeOption1.option[store_labels][1][label]$)}}" stepKey="verifyOptionExists"/> -</test> -``` - -### Perform the most critical actions first in the `<after>` block - -Perform non-browser driving actions first. These are more likely to succeed as no UI is involved. -In the good example, `magentoCLI` and `deleteData` are run first to ensure a proper state. -In the bad example, we perform some heavy UI steps first. - -**Why?** If something goes wrong there, then the critical `magentoCLI` commands may not get a chance to run, leaving Magento configured incorrectly for any upcoming tests. - -<span style="color:green"> -Good: -</span> - -```xml -<after> - <magentoCLI command="indexer:set-mode" arguments="schedule" stepKey="setIndexerMode"/> - <magentoCLI command="config:set catalog/frontend/flat_catalog_category 0" stepKey="setFlatCatalogCategory"/> - <deleteData createDataKey="category" stepKey="deleteCategory"/> - <deleteData createDataKey="createSimpleProduct" stepKey="deleteSimpleProduct"/> - <actionGroup ref="AdminDeleteStoreViewActionGroup" stepKey="deleteStoreViewEn"> - <argument name="customStore" value="customStoreEN"/> - </actionGroup> - <actionGroup ref="AdminDeleteStoreViewActionGroup" stepKey="deleteStoreViewFr"> - <argument name="customStore" value="customStoreFR"/> - </actionGroup> - <actionGroup ref="logout" stepKey="logout"/> -</after> -``` - -<span style="color:red"> -Bad: -</span> - -```xml -<after> - <actionGroup ref="AdminDeleteStoreViewActionGroup" stepKey="deleteStoreViewEn"> - <argument name="customStore" value="customStoreEN"/> - </actionGroup> - <actionGroup ref="AdminDeleteStoreViewActionGroup" stepKey="deleteStoreViewFr"> - <argument name="customStore" value="customStoreFR"/> - </actionGroup> - <deleteData createDataKey="category" stepKey="deleteCategory"/> - <deleteData createDataKey="createSimpleProduct" stepKey="deleteSimpleProduct"/> - <magentoCLI command="config:set catalog/frontend/flat_catalog_category 0" stepKey="setFlatCatalogCategory"/> - <magentoCLI command="indexer:set-mode" arguments="schedule" stepKey="setIndexerMode"/> - <actionGroup ref="logout" stepKey="logout"/> -</after> -``` - -### When to use see vs. seeElement - -Use `see` and `seeElement` wisely. -If you need to see some element and verify that the text inside is shown correctly, use the `see` action. -If you need to verify that element present on page, use `seeElement`. -But never use `seeElement` and build a xPath which contains the expected text. - -**Why?** For `see` it will output something similar to this: -`Failed asserting that any element by #some_selector contains text "some_text"` -And for `seeElement` it will output something like this: -`Element by #some_selector is not visible.` -There is a subtle distinction: The first is a failure but it is the desired result: a 'positive failure'. -The second is a proper result of the action. - -<span style="color:green"> -Good: -</span> - -```xml -<see selector="//div[@data-element='content']//p" userInput="SOME EXPECTED TEXT" stepKey="seeSlide1ContentStorefront"/> -``` - -<span style="color:red"> -Bad: -</span> - -```xml -<seeElement selector="//div[@data-element='content']//p[.='SOME EXPECTED TEXT']" stepKey="seeSlide1ContentStorefront"/> -``` - -### Always specify a default value for action group arguments - -Whenever possible, specify a `defaultValue` for action group arguments. - -<span style="color:green"> -GOOD: -</span> - -```xml -<actionGroup name="StorefrontAssertProductImagesOnProductPageActionGroup"> - <arguments> - <argument name="productImage" type="string" defaultValue="Magento_Catalog/images/product/placeholder/image.jpg" /> - </arguments> - <waitForElementNotVisible selector="{{StorefrontProductMediaSection.gallerySpinner}}" stepKey="waitGallerySpinnerDisappear" /> - <seeElement selector="{{StorefrontProductMediaSection.gallery}}" stepKey="seeProductGallery" /> - <seeElement selector="{{StorefrontProductMediaSection.productImage(productImage)}}" stepKey="seeProductImage" /> - <click selector="{{StorefrontProductMediaSection.productImage(productImage)}}" stepKey="openFullscreenImage" /> - <waitForPageLoad stepKey="waitForGalleryLoaded" /> - <seeElement selector="{{StorefrontProductMediaSection.productImageFullscreen(productImage)}}" stepKey="seeFullscreenProductImage" /> - <click selector="{{StorefrontProductMediaSection.closeFullscreenImage}}" stepKey="closeFullScreenImage" /> - <waitForPageLoad stepKey="waitForGalleryDisappear" /> -</actionGroup> -``` - -<span style="color:red"> -BAD: -</span> - -```xml -<actionGroup name="StorefrontAssertProductImagesOnProductPageActionGroup"> - <arguments> - <argument name="productImage" type="string" /> - </arguments> - <waitForElementNotVisible selector="{{StorefrontProductMediaSection.gallerySpinner}}" stepKey="waitGallerySpinnerDisappear" /> - <seeElement selector="{{StorefrontProductMediaSection.gallery}}" stepKey="seeProductGallery" /> - <seeElement selector="{{StorefrontProductMediaSection.productImage(productImage)}}" stepKey="seeProductImage" /> - <click selector="{{StorefrontProductMediaSection.productImage(productImage)}}" stepKey="openFullscreenImage" /> - <waitForPageLoad stepKey="waitForGalleryLoaded" /> - <seeElement selector="{{StorefrontProductMediaSection.productImageFullscreen(productImage)}}" stepKey="seeFullscreenProductImage" /> - <click selector="{{StorefrontProductMediaSection.closeFullscreenImage}}" stepKey="closeFullScreenImage" /> - <waitForPageLoad stepKey="waitForGalleryDisappear" /> -</actionGroup> -``` - -### Build tests from action groups - -Build your tests using action groups, even if an action group contains a single action. - -**Why?** For extension developers, this will make it easier to extend or customize tests. -Extending a single action group will update all tests that use this group. -This improves maintainability as multiple instances of a failure can be fixed with a single action group update. - -<span style="color:green"> -GOOD: -</span> - -```xml -<test name="NavigateClamberWatchEntityTest"> - <annotations> - <!--some annotations--> - </annotations> - - <actionGroup ref="StorefrontOpenProductPageActionGroup" stepKey="openProductPage"> - <argument name="productUrl" value="{{ClamberWatch.url_key}}" /> - </actionGroup> - <actionGroup ref="StorefrontAssertProductNameOnProductPageActionGroup" stepKey="assertProductName"> - <argument name="productName" value="{{ClamberWatch.name}}" /> - </actionGroup> - <actionGroup ref="StorefrontAssertProductSkuOnProductPageActionGroup" stepKey="assertProductSku"> - <argument name="productSku" value="{{ClamberWatch.sku}}" /> - </actionGroup> - <actionGroup ref="StorefrontAssertProductPriceOnProductPageActionGroup" stepKey="assertProductPrice"> - <argument name="productPrice" value="{{ClamberWatch.price}}" /> - </actionGroup> - <actionGroup ref="StorefrontAssertProductImagesOnProductPageActionGroup" stepKey="assertProductImage"> - <argument name="productImage" value="{{ClamberWatch.image}}" /> - </actionGroup> -</test> -``` - -<span style="color:red"> -BAD: -</span> - -```xml -<test name="NavigateClamberWatchEntityTest"> - <annotations> - <!--some annotations--> - </annotations> - - <amOnPage url="{{StorefrontProductPage.url(ClamberWatch.url_key)}}" stepKey="openProductPage"/> - <see selector="{{StorefrontProductInfoMainSection.productName}}" userInput="{{ClamberWatch.name}}" stepKey="seeProductName" /> - <see selector="{{StorefrontProductInfoMainSection.productSku}}" userInput="{{ClamberWatch.sku}}" stepKey="seeProductSku" /> - <see selector="{{StorefrontProductInfoMainSection.price}}" userInput="{{ClamberWatch.price}}" stepKey="seeProductPrice" /> - <waitForElementNotVisible selector="{{StorefrontProductMediaSection.gallerySpinner}}" stepKey="waitGallerySpinnerDisappear" /> - <seeElement selector="{{StorefrontProductMediaSection.gallery}}" stepKey="seeProductGallery" /> - <seeElement selector="{{StorefrontProductMediaSection.productImage(ClamberWatch.productImage)}}" stepKey="seeProductImage" /> - <click selector="{{StorefrontProductMediaSection.productImage(ClamberWatch.productImage)}}" stepKey="openFullscreenImage" /> - <waitForPageLoad stepKey="waitForGalleryLoaded" /> - <seeElement selector="{{StorefrontProductMediaSection.productImageFullscreen(ClamberWatch.productImage)}}" stepKey="seeFullscreenProductImage" /> -</test> -``` - -### Use descriptive stepKey names - -Make `stepKeys` values as descriptive as possible. -Do not use numbers to make a `stepKey` unique. - -**Why?** This helps with readability and clarity. - -<span style="color:green"> -GOOD: -</span> - -```xml -<click selector="{{StorefrontNavigationSection.topCategory(SimpleSubCategory.name)}}" stepKey="clickSimpleSubCategoryLink" /> -<waitForPageLoad stepKey="waitForSimpleSubCategoryPageLoad" /> -<click selector="{{StorefrontCategoryMainSection.productLinkByHref(SimpleProduct.urlKey)}}" stepKey="clickSimpleProductLink" /> -<waitForPageLoad stepKey="waitForSimpleProductPageLoad" /> - -<!-- Perform some actions / Assert product page --> - -<click selector="{{StorefrontNavigationSection.topCategory(CustomCategory.name)}}" stepKey="clickCustomCategoryLink" /> -<waitForPageLoad stepKey="waitForCustomCategoryPageLoad" /> -<click selector="{{StorefrontCategoryMainSection.productLinkByHref(CustomSimpleProduct.urlKey)}}" stepKey="clickCustomSimpleProductLink" /> -<waitForPageLoad stepKey="waitForCustomSimpleProductPageLoad" /> -``` - -<span style="color:red"> -BAD: -</span> - -```xml -<click selector="{{StorefrontNavigationSection.topCategory(SimpleSubCategory.name)}}" stepKey="clickCategoryLink1" /> -<waitForPageLoad stepKey="waitForPageLoad1" /> -<click selector="{{StorefrontCategoryMainSection.productLinkByHref(SimpleProduct.urlKey)}}" stepKey="clickProductLink1" /> -<waitForPageLoad stepKey="waitForPageLoad2" /> - -<!-- Perform some actions / Assert product page --> - -<click selector="{{StorefrontNavigationSection.topCategory(CustomCategory.name)}}" stepKey="clickCategoryLink2" /> -<waitForPageLoad stepKey="waitForPageLoad3" /> -<click selector="{{StorefrontCategoryMainSection.productLinkByHref(CustomSimpleProduct.urlKey)}}" stepKey="clickProductLink2" /> -<waitForPageLoad stepKey="waitForPageLoad4" /> -``` - -**Exception:** - -Use numbers within `stepKeys` when order is important, such as with testing sort order. - -```xml -<createData entity="BasicMsiStock1" stepKey="createCustomStock1"/> -<createData entity="BasicMsiStock2" stepKey="createCustomStock2"/> -<createData entity="BasicMsiStock3" stepKey="createCustomStock3"/> -<createData entity="BasicMsiStock4" stepKey="createCustomStock4"/> -``` - -## Selectors - -### Use contains() around text() - -When possible, use `contains(text(), 'someTextHere')` rather than `text()='someTextHere'`. -`contains()` ignores whitespace while `text()` accounts for it. - -**Why?** -If you are comparing text within a selector and have an unexpected space, or a blank line above or below the string, `text()` will fail while the `contains(text())` format will catch it. -In this scenario `text()` is more exacting. Use it when you need to be very precise about what is getting compared. - -<span style="color:green"> -GOOD: -</span> - -`//span[contains(text(), 'SomeTextHere')]` - -<span style="color:red"> -BAD: -</span> - -`//span[text()='SomeTextHere']` - -### Build selectors in proper order - -When building selectors for form elements, start with the parent context of the form element. -Then specify the element `name` attribute in your selector to ensure the correct element is targeted. -To build a selector for an input, use the pattern: `{{section_selector}} {{input_selector}}` or for a button: `{{section_selector}} {{button_selector}}` - -**Why?** Traversing the DOM takes a finite amount of time and reducing the scope of the selector makes the selector lookup as efficient as possible. - -Example: - -```xml -<div class="admin__field _required" data-bind="css: $data.additionalClasses, attr: {'data-index': index}, visible: visible" data-index="name"> - <div class="admin__field-label" data-bind="visible: $data.labelVisible"> - <span data-bind="attr: {'data-config-scope': $data.scopeLabel}, i18n: label" data-config-scope="[STORE VIEW]">Product Name</span> - </div> - <div class="admin__field-control" data-bind="css: {'_with-tooltip': $data.tooltip, '_with-reset': $data.showFallbackReset && $data.isDifferedFromDefault}"> - <input class="admin__control-text" type="text" name="product[name]" aria-describedby="notice-EXNI71H" id="EXNI71H" maxlength="255" data-bind=" - attr: { - name: inputName, - placeholder: placeholder, - maxlength: 255}"/> - </div> -</div> -``` - -<span style="color:green"> -GOOD: -</span> - -```xml -<element name="productName" type="input" selector="*[data-index='product-details'] input[name='product[name]']"/> -``` - -<span style="color:red"> -BAD: -</span> - -```xml -<element name="productName" type="input" selector=".admin__field[data-index=name] input"/> -``` - -## General tips - -### Use data references to avoid hardcoded values - -If you need to run a command such as `<magentoCLI command="config:set" />`, do not hardcode paths and values to the command. -Rather, create an appropriate `ConfigData.xml` file, which contains the required parameters for running the command. -It will simplify the future maintanence of tests. - - <span style="color:green"> -GOOD: -</span> - -```xml -<magentoCLI command="config:set {{StorefrontCustomerCaptchaLength3ConfigData.path}} {{StorefrontCustomerCaptchaLength3ConfigData.value}}" stepKey="setCaptchaLength" /> -``` - - <span style="color:red"> -BAD: -</span> - -```xml -<magentoCLI command="config:set customer/captcha/length 3" stepKey="setCaptchaLength" /> -``` - -For example: -[This test][] refers to this [Data file][]. - -### Use descriptive variable names - -Use descriptive variable names to increase readability. -**Why?** It makes the code easier to follow and update. - - <span style="color:green"> -GOOD: -</span> - -```xml -<element name="storeName" type="checkbox" selector="//label[contains(text(),'{{storeName}}')]" parameterized="true"/> -``` - -<span style="color:red"> -BAD: -</span> - -```xml -<element name="storeName" type="checkbox" selector="//label[contains(text(),'{{var1}}')]" parameterized="true"/> -``` - -### Use proper checkbox actions - -When working with input type `checkbox`, do not use the `click` action; use `checkOption` or `uncheckOption` instead. -**Why?** A click does not make it clear what the ending state will be; it will simply toggle the current state. Using the proper actions will ensure the expected state of the checkbox. - -<span style="color:green"> -GOOD: -</span> - -```xml -<checkOption selector="{{ProductInWebsitesSection.website('Second Website')}}" stepKey="selectSecondWebsite"/> -<uncheckOption selector="{{ProductInWebsitesSection.website('Second Website')}}" stepKey="unselectSecondWebsite"/> -``` - -<span style="color:red"> -BAD: -</span> - -```xml -<click selector="{{ProductInWebsitesSection.website('Second Website')}}" stepKey="selectSecondWebsite"/> -<click selector="{{ProductInWebsitesSection.website('Second Website')}}" stepKey="unselectSecondWebsite"/> -``` - -<!--{% endraw %}--> - -<!-- Link Definitions --> -[This test]: https://github.com/magento/magento2/blob/2.3/app/code/Magento/Captcha/Test/Mftf/Test/StorefrontCaptchaRegisterNewCustomerTest.xml#L24 -[Data file]: https://github.com/magento/magento2/blob/2.3/app/code/Magento/Captcha/Test/Mftf/Data/CaptchaConfigData.xml diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md deleted file mode 100644 index d2a7dcabe..000000000 --- a/docs/troubleshooting.md +++ /dev/null @@ -1,65 +0,0 @@ -# Troubleshooting - -Having a little trouble with the MFTF? See some common errors and fixes below. - -## AcceptanceTester class issues - -If you see the following error: - -```terminal -AcceptanceTester class doesn't exist in suite folder. -Run the 'build' command to generate it -``` - -### Reason - -Something went wrong during the `mftf build:project` command that prevented the creation of the AcceptanceTester class. - -### Solution - -This issue is fixed in the MFTF 2.5.0. - -In versions of the MFTF lower than 2.5.0 you should: - -1. Open the functional.suite.yml file at: - - ```terminal - <magento root directory>/dev/tests/acceptance/tests/functional.suite.yml - ``` -1. Add quotation marks (`"`) around these values: - - 1. `%SELENIUM_HOST%` - 1. `%SELENIUM_PORT%` - 1. `%SELENIUM_PROTOCOL%` - 1. `%SELENIUM_PATH%` - -1. Run the `vendor/bin/mftf build:project` command again. -1. You should see the AcceptanceTester class is created at: - - ```terminal - <magento root directory>/vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/AcceptanceTester.php - ``` - -## WebDriver issues - -Troubleshoot your WebDriver issues on various browsers. - -### PhantomJS - -You are unable to upload file input using the MFTF actions and are seeing the following exception: - -```terminal -[Facebook\WebDriver\Exception\NoSuchDriverException] -No active session with ID e56f9260-b366-11e7-966b-db3e6f35d8e1 -``` - -#### Reason - -Use of PhantomJS is not supported by the MFTF. - -#### Solution - -For headless browsing, the [Headless Chrome][]{:target="\_blank"} has better compatibility with the MFTF. - -<!-- Link Definitions --> -[Headless Chrome]: https://developers.google.com/web/updates/2017/04/headless-chrome diff --git a/docs/update.md b/docs/update.md deleted file mode 100644 index 284730430..000000000 --- a/docs/update.md +++ /dev/null @@ -1,53 +0,0 @@ -# Update the Magento Functional Testing Framework - -<div class="bs-callout bs-callout-info" markdown="1"> -[Find your version] of MFTF. -The latest Magento 2.4.x release supports MFTF 3.x. -The latest Magento 2.3.x release supports MFTF 2.6.x. -</div> - -Tests and the Framework itself are stored in different repositories. - -* Tests are stored in Module's directory. -* MFTF is installed separately (usually as a Composer dependency) - -To understand different types of update - please follow the [Versioning][] page. - -## Patch version update - -Takes place when **third** digit of version number changes. - -1. Make sure that [Security settings][] are set appropriately. -1. Get latest Framework version with `composer update magento/magento2-functional-testing-framework --with-dependencies` -1. Generate updated tests with `vendor/bin/mftf generate:tests` - -## Minor version update - -Takes place when **second** digit of version number changes. - -1. Check details about backward incompatible changes in the [Changelog][] and update your new or customized tests. -1. Perform all the actions provided for [Patch Version Update][] -1. When updating from versions below `2.5.0`, verify [WYSIWYG settings][] -1. You may need to run the `upgrade:tests` using `vendor/bin/mftf upgrade:tests` - -## Major version update - -Takes place when **first** digit of version number changes. - -1. Check detailed explanation and instructions on major version upgrade in [Backward Incompatible Changes][] and upgrade your new or customized tests. -1. Perform all the actions provided for [Minor Version Update][] - -## After updating - -1. It is a good idea to regenerate your IDE Schema Definition catalog with `vendor/bin/mftf generate:urn-catalog .idea/misc.xml` -1. Update your tests, including data, metadata and other resources. Check if they contain tags that are unsupported in the newer version. -1. Remove the references to resources (ActionGroups, Sections, Tests) marked as deprecated. - -<!-- Link Definitions --> -[Changelog]: https://github.com/magento/magento2-functional-testing-framework/blob/master/CHANGELOG.md -[Backward Incompatible Changes]: backward-incompatible-changes.md -[WYSIWYG settings]: getting-started.md#wysiwyg-settings -[Security settings]: getting-started.md#security-settings -[Find your version]: introduction.md#find-your-mftf-version -[Versioning]: versioning.md#versioning-policy -[Patch Version Update]: #patch-version-update diff --git a/docs/versioning.md b/docs/versioning.md deleted file mode 100644 index 3cb51e405..000000000 --- a/docs/versioning.md +++ /dev/null @@ -1,71 +0,0 @@ -# MFTF versioning schema - -This document describes the versioning policy for the Magento Functional Testing Framework (MFTF), including the version numbering schema. - -## Backward compatibility - -In this context, backward compatibility means that when changes are made to the MFTF, all existing tests still run normally. -If a modification to MFTF forces tests to be changed, this is a backward incompatible change. - -## Find your MFTF version number - -To find the version of MFTF that you are using, run the Magento CLI command: - -```bash -vendor/bin/mftf --version -``` - -## Versioning Policy - -MFTF versioning policy follows [Semantic Versioning](https://semver.org/) guidelines. - -### 3-component version numbers - -Version numbering schemes help users to understand the scope of the changes made a new release. - -```tree -X.Y.Z -| | | -| | +-- Backward Compatible changes (Patch release - bug fixes, small additions) -| +---- Backward Compatible changes (Minor release - small new features, bug fixes) -+------ Backward Incompatible changes (Major release - new features and/or major changes) -``` - -For example: - -- Magento 2 ships with MFTF version 2.3.9 -- A patch is added to fix a bug: 2.3.10 (Increment Z = backward compatible change) -- New action command added: 2.4.0 (Increment Y, set Z to 0 = backward compatible change) -- New action added: 2.4.1 (Increment Z = backward compatible change) -- Major new features added to MFTF to support changes in Magento codebase: 3.0.0. (Increment X, reset Y and Z to 0 = backward incompatible change) - -### Z release - patch - -Patch version **Z** MUST be incremented for a release that introduces only backward compatible changes. - -### Y release - minor - -Minor version **Y** MUST be incremented for a release that introduces new, backward compatible features. -It MUST be incremented if any test or test entity is marked as deprecated. -It MAY include patch level changes. Patch version MUST be reset to 0 when minor version is incremented. - -### X release - major - -Major version **X** MUST be incremented for a release that introduces backward incompatible changes. -A major release can also include minor and patch level changes. -You must reset the patch and minor version to 0 when you change the major version. - -## Magento 2 compatibility - -This table lists the version of the MFTF that was released with a particular version of Magento. - -|Magento version| MFTF version| -|--- |--- | -| 2.4.0 | 3.0.0 | -| 2.3.5 | 2.6.4 | -| 2.3.4 | 2.5.3 | -| 2.3.3 | 2.4.5 | -| 2.3.2 | 2.3.14 | -| 2.3.1 | 2.3.13 | -| 2.3.0 | 2.3.9 | -| 2.2.8 | 2.3.13 | From 97e682d40ae8381497c69b83c492b43f5015b3ba Mon Sep 17 00:00:00 2001 From: Global <global@del1-lmc-n71255.local> Date: Thu, 22 Sep 2022 10:16:56 +0530 Subject: [PATCH 269/674] ACQE-4040 | creare dir --- .../Console/GenerateTestsCommand.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index 525b4dea3..ee4f211cf 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -564,6 +564,10 @@ private function array2Json(array $array) if (isset($_ENV['MAGENTO_BP'])) { $testDependencyFileLocation = self::TEST_DEPENDENCY_FILE_LOCATION_STANDALONE; } + $testDependencyFileLocationDir = dirname($testDependencyFileLocation); + if (!is_dir($testDependencyFileLocationDir)) { + mkdir($testDependencyFileLocationDir, 0777, true); + } $file = fopen($testDependencyFileLocation, 'w'); $json = json_encode($array, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); fwrite($file, $json); From 665b11449f54a57804d3b022617325a5cc0aa4bf Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 6 Oct 2022 19:17:44 +0530 Subject: [PATCH 270/674] fix --- .../StaticCheck/DuplicateStepKeysCheck.php | 213 ++++++++++++++++++ .../StaticCheck/StaticChecksList.php | 6 +- 2 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 src/Magento/FunctionalTestingFramework/StaticCheck/DuplicateStepKeysCheck.php diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/DuplicateStepKeysCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/DuplicateStepKeysCheck.php new file mode 100644 index 000000000..4f6d94da7 --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/DuplicateStepKeysCheck.php @@ -0,0 +1,213 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\FunctionalTestingFramework\StaticCheck; + +use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; +use InvalidArgumentException; +use Exception; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; +use Magento\FunctionalTestingFramework\Exceptions\XmlException; +use Magento\FunctionalTestingFramework\Page\Objects\SectionObject; +use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; +use Magento\FunctionalTestingFramework\Page\Objects\ElementObject; +use Magento\FunctionalTestingFramework\Test\Objects\ActionGroupObject; +use Magento\FunctionalTestingFramework\Page\Objects\PageObject; +use Magento\FunctionalTestingFramework\Test\Objects\TestObject; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Finder\Finder; +use Magento\FunctionalTestingFramework\Util\Script\ScriptUtil; +use Magento\FunctionalTestingFramework\DataGenerator\Handlers\OperationDefinitionObjectHandler; +use Magento\FunctionalTestingFramework\DataGenerator\Objects\OperationDefinitionObject; +use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; +use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject; +use Symfony\Component\Finder\SplFileInfo; +use DOMNodeList; +use DOMElement; + +/** + * Class CreatedDataFromOutsideActionGroupCheck + * @package Magento\FunctionalTestingFramework\StaticCheck + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class DuplicateStepKeysCheck implements StaticCheckInterface +{ + const ERROR_LOG_FILENAME = 'duplicate-step-keys'; + const ERROR_LOG_MESSAGE = 'Duplicate Step Key Check'; + const STEP_KEY_REGEX_PATTERN = '/stepKey=["\']([^\'"]*)/'; + /** + * Array containing all errors found after running the execute() function + * + * @var array + */ + private $errors = []; + + /** + * String representing the output summary found after running the execute() function + * + * @var string + */ + private $output; + + /** + * ScriptUtil instance + * + * @var ScriptUtil + */ + private $scriptUtil; + + /** + * Checks test dependencies, determined by references in tests versus the + * dependencies listed in the Magento module + * + * @param InputInterface $input + * @return void + * @throws Exception + */ + public function execute(InputInterface $input) + { + $this->scriptUtil = new ScriptUtil(); + $this->loadAllXmlFiles($input); + $this->errors += $this->findReferenceErrorsInFiles($this->actionGroupXmlFile); + // hold on to the output and print any errors to a file + $this->output = $this->scriptUtil->printErrorsToFile( + $this->errors, + StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', + self::ERROR_LOG_MESSAGE + ); + } + + /** + * 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 Dependency errors found." + * + * @return string + */ + public function getOutput() + { + return $this->output; + } + + /** + * Read all XML files for scanning + * + * @param InputInterface $input + * @return void + * @throws Exception + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + private function loadAllXmlFiles($input) + { + $modulePaths = []; + $path = $input->getOption('path'); + if ($path) { + if (!realpath($path)) { + throw new InvalidArgumentException('Invalid --path option: ' . $path); + } + MftfApplicationConfig::create( + true, + MftfApplicationConfig::UNIT_TEST_PHASE, + false, + MftfApplicationConfig::LEVEL_DEFAULT, + true + ); + $modulePaths[] = realpath($path); + } else { + $modulePaths = $this->scriptUtil->getAllModulePaths(); + } + + // These files can contain references to other entities + $this->actionGroupXmlFile = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'ActionGroup'); + $this->testXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'Test'); + $this->suiteXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'Suite'); + + if (empty($this->actionGroupXmlFile)) { + if ($path) { + throw new InvalidArgumentException( + 'Invalid --path option: ' + . $path + . PHP_EOL + . 'Please make sure --path points to a valid MFTF Test Module.' + ); + } elseif (empty($this->rootSuiteXmlFiles)) { + throw new TestFrameworkException('No xml file to scan.'); + } + } + } + + /** + * Find reference errors in set of action files + * + * @param Finder $files + * @return array + * @throws XmlException + */ + private function findReferenceErrorsInFiles($files) + { + $testErrors = []; + /** @var SplFileInfo $filePath */ + foreach ($files as $filePath) { + $actionGroupReferencesDataArray = []; + $contents = file_get_contents($filePath); + preg_match_all(self::STEP_KEY_REGEX_PATTERN, $contents, $actionGroupReferences); + foreach ($actionGroupReferences[0] as $actionGroupReferencesData) { + $actionGroupReferencesDataArray[] = trim( + str_replace( + ['stepKey', '='], + [""], + $actionGroupReferencesData + ) + ).'"'; + } + $duplicateStepKeys = array_unique( + array_diff_assoc( + $actionGroupReferencesDataArray, + array_unique( + $actionGroupReferencesDataArray + ) + ) + ); + unset($actionGroupReferencesDataArray); + if (isset($duplicateStepKeys) && count($duplicateStepKeys) > 0) { + $testErrors = array_merge($testErrors, $this->setErrorOutput($duplicateStepKeys, $filePath)); + } + } + return $testErrors; + } + + /** + * Build and return error output for violating references + * + * @param array $violatingReferences + * @param SplFileInfo $path + * @return mixed + */ + private function setErrorOutput($violatingReferences, $path) + { + $testErrors = []; + + $filePath = StaticChecksList::getFilePath($path->getRealPath()); + + if (!empty($violatingReferences)) { + // Build error output + $errorOutput = "\nFile \"{$filePath}\""; + foreach ($violatingReferences as $stepKey) { + $errorOutput .= "\n\t has duplicate stepKey(s): ". $stepKey; + } + $testErrors[$filePath][] = $errorOutput; + } + return $testErrors; + } +} diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php index 7eda14f1b..bc0a03fc0 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php @@ -20,6 +20,7 @@ class StaticChecksList implements StaticCheckListInterface const PAUSE_ACTION_USAGE_CHECK_NAME = 'pauseActionUsage'; const CREATED_DATA_FROM_OUTSIDE_ACTIONGROUP = 'createdDataFromOutsideActionGroup'; const UNUSED_ENTITY_CHECK = 'unusedEntityCheck'; + const DUPLICATE_STEP_KEYS = 'duplicateStepKeys'; const STATIC_RESULTS = 'tests' . DIRECTORY_SEPARATOR .'_output' . DIRECTORY_SEPARATOR . 'static-results'; /** @@ -51,8 +52,9 @@ public function __construct(array $checks = []) 'annotations' => new AnnotationsCheck(), self::PAUSE_ACTION_USAGE_CHECK_NAME => new PauseActionUsageCheck(), self::UNUSED_ENTITY_CHECK => new UnusedEntityCheck(), - self::CREATED_DATA_FROM_OUTSIDE_ACTIONGROUP => new CreatedDataFromOutsideActionGroupCheck() - ] + $checks; + self::CREATED_DATA_FROM_OUTSIDE_ACTIONGROUP => new CreatedDataFromOutsideActionGroupCheck(), + self::DUPLICATE_STEP_KEYS => new DuplicateStepKeysCheck() + ] + $checks; // Static checks error files directory if (null === self::$errorFilesPath) { From 11d1f046e6daff78cf9ce0d54d684e51b9b60eed Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Fri, 7 Oct 2022 08:45:19 +0530 Subject: [PATCH 271/674] throw exception --- .../StaticCheck/ActionGroupArgumentsCheck.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php index 8b95fb9d5..891d434a4 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php @@ -14,6 +14,8 @@ use Magento\FunctionalTestingFramework\Util\Script\ScriptUtil; use Symfony\Component\Finder\SplFileInfo; use DOMElement; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; + /** * Class ActionGroupArgumentsCheck @@ -24,6 +26,7 @@ class ActionGroupArgumentsCheck implements StaticCheckInterface const ACTIONGROUP_NAME_REGEX_PATTERN = '/<actionGroup name=["\']([^\'"]*)/'; const ERROR_LOG_FILENAME = 'mftf-arguments-checks'; const ERROR_LOG_MESSAGE = 'MFTF Action Group Unused Arguments Check'; + const STEP_KEY_REGEX_PATTERN = '/stepKey=["\']([^\'"]*)/'; /** * Array containing all errors found after running the execute() function. @@ -100,6 +103,15 @@ private function findErrorsInFileSet($files) foreach ($files as $filePath) { $actionGroupToArguments = []; $contents = $filePath->getContents(); + preg_match_all(self::STEP_KEY_REGEX_PATTERN, $contents, $actionGroupReferences); + foreach ($actionGroupReferences[0] as $actionGroupReferencesData) { + $actionGroupReferencesDataArray[] = trim(str_replace(['stepKey','='],[""],$actionGroupReferencesData)).'"'; + } + $duplicateStepKeys = array_unique( array_diff_assoc( $actionGroupReferencesDataArray, array_unique( $actionGroupReferencesDataArray ) ) ); + unset( $actionGroupReferencesDataArray); + if (isset($duplicateStepKeys) && count($duplicateStepKeys) > 0) { + throw new TestFrameworkException('Action group has duplicate step keys'); + } /** @var DOMElement $actionGroup */ $actionGroup = $this->getActionGroupDomElement($contents); $arguments = $this->extractActionGroupArguments($actionGroup); From 5284e027b85238b03a16f91ecf73179eb204355c Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Fri, 7 Oct 2022 11:25:28 +0530 Subject: [PATCH 272/674] fix psr issues --- .../StaticCheck/ActionGroupArgumentsCheck.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php index 891d434a4..03b39c26c 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php @@ -16,7 +16,6 @@ use DOMElement; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; - /** * Class ActionGroupArgumentsCheck * @package Magento\FunctionalTestingFramework\StaticCheck @@ -105,12 +104,21 @@ private function findErrorsInFileSet($files) $contents = $filePath->getContents(); preg_match_all(self::STEP_KEY_REGEX_PATTERN, $contents, $actionGroupReferences); foreach ($actionGroupReferences[0] as $actionGroupReferencesData) { - $actionGroupReferencesDataArray[] = trim(str_replace(['stepKey','='],[""],$actionGroupReferencesData)).'"'; + $actionGroupReferencesDataArray[] = trim( + str_replace(['stepKey', '='], [""], $actionGroupReferencesData) + ).'"'; } - $duplicateStepKeys = array_unique( array_diff_assoc( $actionGroupReferencesDataArray, array_unique( $actionGroupReferencesDataArray ) ) ); - unset( $actionGroupReferencesDataArray); + $duplicateStepKeys = array_unique( + array_diff_assoc( + $actionGroupReferencesDataArray, + array_unique( + $actionGroupReferencesDataArray + ) + ) + ); + unset($actionGroupReferencesDataArray); if (isset($duplicateStepKeys) && count($duplicateStepKeys) > 0) { - throw new TestFrameworkException('Action group has duplicate step keys'); + throw new TestFrameworkException('Action group has duplicate step keys'); } /** @var DOMElement $actionGroup */ $actionGroup = $this->getActionGroupDomElement($contents); From c3f68e39176bc61088afec69c446d157fc9ef822 Mon Sep 17 00:00:00 2001 From: Rajesh Kumar <glo71317@adobe.com> Date: Fri, 7 Oct 2022 12:45:20 +0530 Subject: [PATCH 273/674] AC-2660::Upgrade allure-framework/allure-phpunit to the latest major version --- composer.json | 4 +- composer.lock | 310 +++++++------------------------- etc/config/codeception.dist.yml | 4 +- 3 files changed, 67 insertions(+), 251 deletions(-) diff --git a/composer.json b/composer.json index 0161b4883..382476546 100755 --- a/composer.json +++ b/composer.json @@ -9,14 +9,14 @@ "sort-packages": true }, "require": { - "php": ">7.3", + "php": "~7.4.0||~8.1.0", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", "ext-intl": "*", "ext-json": "*", "ext-openssl": "*", - "allure-framework/allure-codeception": "^1.4", + "allure-framework/allure-codeception": "^2", "aws/aws-sdk-php": "^3.132", "codeception/codeception": "^4.1", "codeception/module-asserts": "^1.1", diff --git a/composer.lock b/composer.lock index 1f79506a8..293f5c8d2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,38 +4,43 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "075f7ef8a19879334ba1e0443f4e9679", + "content-hash": "e6a0d4f12fc82c99080c3fd01eab38a7", "packages": [ { "name": "allure-framework/allure-codeception", - "version": "1.5.2", + "version": "v2.0.2", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-codeception.git", - "reference": "a6156aef942a4e4de0add34a73d066a9458cefc6" + "reference": "8ba63e1134f90d431dfaf6c4d7e4c7fdb12eabfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/a6156aef942a4e4de0add34a73d066a9458cefc6", - "reference": "a6156aef942a4e4de0add34a73d066a9458cefc6", + "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/8ba63e1134f90d431dfaf6c4d7e4c7fdb12eabfb", + "reference": "8ba63e1134f90d431dfaf6c4d7e4c7fdb12eabfb", "shasum": "" }, "require": { - "allure-framework/allure-php-api": "^1.3", - "codeception/codeception": "^2.5 | ^3 | ^4", + "allure-framework/allure-php-commons": "^2", + "codeception/codeception": "^4.1", "ext-json": "*", - "php": ">=7.1.3", - "symfony/filesystem": "^2.7 | ^3 | ^4 | ^5", - "symfony/finder": "^2.7 | ^3 | ^4 | ^5" + "php": "^8" + }, + "conflict": { + "codeception/phpunit-wrapper": "<9.0.1" }, "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^7.2 | ^8 | ^9" + "phpunit/phpunit": "^9", + "psalm/plugin-phpunit": "^0.16.1", + "remorhaz/php-json-data": "^0.5.3", + "remorhaz/php-json-path": "^0.7.7", + "squizlabs/php_codesniffer": "^3.6.2", + "vimeo/psalm": "^4.20" }, "type": "library", "autoload": { - "psr-0": { - "Yandex": "src/" + "psr-4": { + "Qameta\\Allure\\Codeception\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -47,6 +52,11 @@ "name": "Ivan Krutov", "email": "vania-pooh@aerokube.com", "role": "Developer" + }, + { + "name": "Edward Surov", + "email": "zoohie@gmail.com", + "role": "Developer" } ], "description": "Allure Codeception integration", @@ -65,38 +75,44 @@ "issues": "https://github.com/allure-framework/allure-codeception/issues", "source": "https://github.com/allure-framework/allure-codeception" }, - "time": "2021-06-04T13:24:36+00:00" + "time": "2022-05-11T13:17:21+00:00" }, { - "name": "allure-framework/allure-php-api", - "version": "1.3.1", + "name": "allure-framework/allure-php-commons", + "version": "v2.0.0", "source": { "type": "git", - "url": "https://github.com/allure-framework/allure-php-api.git", - "reference": "f64b69afeff472c564a4e2379efb2b69c430ec5a" + "url": "https://github.com/allure-framework/allure-php-commons2.git", + "reference": "946e375e90cce9e43d1622890fb5a312ec8086bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-api/zipball/f64b69afeff472c564a4e2379efb2b69c430ec5a", - "reference": "f64b69afeff472c564a4e2379efb2b69c430ec5a", + "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/946e375e90cce9e43d1622890fb5a312ec8086bb", + "reference": "946e375e90cce9e43d1622890fb5a312ec8086bb", "shasum": "" }, "require": { - "jms/serializer": "^1 | ^2 | ^3", - "php": ">=7.1.3", - "ramsey/uuid": "^3 | ^4", - "symfony/mime": "^4.3 | ^5" + "doctrine/annotations": "^1.12", + "ext-json": "*", + "php": "^8", + "psr/log": "^1 || ^2 || ^3", + "ramsey/uuid": "^3 || ^4" + }, + "conflict": { + "amphp/byte-stream": "<1.5.1" }, "require-dev": { - "phpunit/phpunit": "^7 | ^8 | ^9" + "jetbrains/phpstorm-attributes": "^1", + "phpunit/phpunit": "^9.5.10", + "psalm/plugin-phpunit": "^0.16.1", + "squizlabs/php_codesniffer": "^3.6.2", + "vimeo/psalm": "^4.15" }, "type": "library", "autoload": { - "psr-0": { - "Yandex": [ - "src/", - "test/" - ] + "psr-4": { + "Qameta\\Allure\\": "src", + "Yandex\\Allure\\Adapter\\": "src/Legacy" } }, "notification-url": "https://packagist.org/downloads/", @@ -105,25 +121,31 @@ ], "authors": [ { - "name": "Ivan Krutov", - "email": "vania-pooh@yandex-team.ru", + "name": "Dmitry Baev", + "email": "baev.dm@gmail.com", + "role": "Developer" + }, + { + "name": "Edward Surov", + "email": "zoohie@gmail.com", "role": "Developer" } ], - "description": "PHP API for Allure adapter", + "description": "Allure PHP commons", "homepage": "http://allure.qatools.ru/", "keywords": [ "allure", - "api", + "commons", "php", - "report" + "report", + "testing" ], "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" + "email": "allure@qameta.io", + "issues": "https://github.com/allure-framework/allure-php-commons2/issues", + "source": "https://github.com/allure-framework/allure-php-commons" }, - "time": "2021-03-26T14:32:27+00:00" + "time": "2021-12-28T12:03:10+00:00" }, { "name": "aws/aws-crt-php", @@ -1914,163 +1936,6 @@ ], "time": "2021-10-05T13:56:00+00:00" }, - { - "name": "jms/metadata", - "version": "2.5.1", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/metadata.git", - "reference": "a995e6cef6d6f56a6226e1616a519630e2ef0aeb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/a995e6cef6d6f56a6226e1616a519630e2ef0aeb", - "reference": "a995e6cef6d6f56a6226e1616a519630e2ef0aeb", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "require-dev": { - "doctrine/cache": "^1.0", - "doctrine/coding-standard": "^8.0", - "mikey179/vfsstream": "^1.6.7", - "phpunit/phpunit": "^8.5|^9.0", - "psr/container": "^1.0", - "symfony/cache": "^3.1|^4.0|^5.0", - "symfony/dependency-injection": "^3.1|^4.0|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Metadata\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "Class/method/property metadata management in PHP", - "keywords": [ - "annotations", - "metadata", - "xml", - "yaml" - ], - "support": { - "issues": "https://github.com/schmittjoh/metadata/issues", - "source": "https://github.com/schmittjoh/metadata/tree/2.5.1" - }, - "time": "2021-08-04T19:32:08+00:00" - }, - { - "name": "jms/serializer", - "version": "3.15.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/serializer.git", - "reference": "9d6d9b81889904603383722ca0cd7f7999baeebc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/9d6d9b81889904603383722ca0cd7f7999baeebc", - "reference": "9d6d9b81889904603383722ca0cd7f7999baeebc", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.10.4", - "doctrine/instantiator": "^1.0.3", - "doctrine/lexer": "^1.1", - "jms/metadata": "^2.0", - "php": "^7.2||^8.0", - "phpstan/phpdoc-parser": "^0.4 || ^0.5 || ^1.0" - }, - "require-dev": { - "doctrine/coding-standard": "^8.1", - "doctrine/orm": "~2.1", - "doctrine/persistence": "^1.3.3|^2.0|^3.0", - "doctrine/phpcr-odm": "^1.3|^2.0", - "ext-pdo_sqlite": "*", - "jackalope/jackalope-doctrine-dbal": "^1.1.5", - "ocramius/proxy-manager": "^1.0|^2.0", - "phpstan/phpstan": "^0.12.65", - "phpunit/phpunit": "^8.0||^9.0", - "psr/container": "^1.0", - "symfony/dependency-injection": "^3.0|^4.0|^5.0|^6.0", - "symfony/expression-language": "^3.0|^4.0|^5.0|^6.0", - "symfony/filesystem": "^3.0|^4.0|^5.0|^6.0", - "symfony/form": "^3.0|^4.0|^5.0|^6.0", - "symfony/translation": "^3.0|^4.0|^5.0|^6.0", - "symfony/validator": "^3.1.9|^4.0|^5.0|^6.0", - "symfony/yaml": "^3.3|^4.0|^5.0|^6.0", - "twig/twig": "~1.34|~2.4|^3.0" - }, - "suggest": { - "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", - "symfony/cache": "Required if you like to use cache functionality.", - "symfony/yaml": "Required if you'd like to use the YAML metadata format." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "JMS\\Serializer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", - "homepage": "http://jmsyst.com/libs/serializer", - "keywords": [ - "deserialization", - "jaxb", - "json", - "serialization", - "xml" - ], - "support": { - "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/3.15.0" - }, - "funding": [ - { - "url": "https://github.com/goetas", - "type": "github" - } - ], - "time": "2021-10-14T20:02:48+00:00" - }, { "name": "justinrainbow/json-schema", "version": "5.2.11", @@ -3033,55 +2898,6 @@ }, "time": "2021-09-10T09:02:12+00:00" }, - { - "name": "phpstan/phpdoc-parser", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/dbc093d7af60eff5cd575d2ed761b15ed40bd08e", - "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "symfony/process": "^5.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.2.0" - }, - "time": "2021-09-16T20:46:02+00:00" - }, { "name": "phpunit/php-code-coverage", "version": "9.2.7", @@ -7891,7 +7707,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">7.3", + "php": "~7.4.0||~8.1.0", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", diff --git a/etc/config/codeception.dist.yml b/etc/config/codeception.dist.yml index 30697dc8f..cc6a44b14 100755 --- a/etc/config/codeception.dist.yml +++ b/etc/config/codeception.dist.yml @@ -15,9 +15,9 @@ extensions: enabled: - Magento\FunctionalTestingFramework\Codeception\Subscriber\Console - Magento\FunctionalTestingFramework\Extension\TestContextExtension - - Magento\FunctionalTestingFramework\Allure\Adapter\MagentoAllureAdapter + - Qameta\Allure\Codeception\AllureCodeception config: - Magento\FunctionalTestingFramework\Allure\Adapter\MagentoAllureAdapter: + Qameta\Allure\Codeception\AllureCodeception: deletePreviousResults: false outputDirectory: allure-results ignoredAnnotations: From 031b5ae755a1ec16d066a5f5753ec7983b7b1915 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Fri, 7 Oct 2022 15:05:35 +0530 Subject: [PATCH 274/674] fix issue --- .../StaticCheck/ActionGroupArgumentsCheck.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php index 03b39c26c..f789d2e42 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php @@ -100,6 +100,7 @@ private function findErrorsInFileSet($files) $actionGroupErrors = []; /** @var SplFileInfo $filePath */ foreach ($files as $filePath) { + $actionGroupReferencesDataArray = []; $actionGroupToArguments = []; $contents = $filePath->getContents(); preg_match_all(self::STEP_KEY_REGEX_PATTERN, $contents, $actionGroupReferences); From d9313d4064883463dea413a52654113f575c1c06 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 10 Oct 2022 11:56:56 +0530 Subject: [PATCH 275/674] composer update --- composer.lock | 755 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 595 insertions(+), 160 deletions(-) diff --git a/composer.lock b/composer.lock index 1f79506a8..19c19952c 100644 --- a/composer.lock +++ b/composer.lock @@ -847,16 +847,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.2.11", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582" + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", - "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", "shasum": "" }, "require": { @@ -903,7 +903,7 @@ "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.11" + "source": "https://github.com/composer/ca-bundle/tree/1.3.3" }, "funding": [ { @@ -919,42 +919,124 @@ "type": "tidelift" } ], - "time": "2021-09-25T20:32:43+00:00" + "time": "2022-07-20T07:14:26+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "shasum": "" + }, + "require": { + "composer/pcre": "^2 || ^3", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.6", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/filesystem": "^5.4 || ^6", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + }, + "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": "2022-06-19T11:31:27+00:00" }, { "name": "composer/composer", - "version": "2.1.9", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "e558c88f28d102d497adec4852802c0dc14c7077" + "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/e558c88f28d102d497adec4852802c0dc14c7077", - "reference": "e558c88f28d102d497adec4852802c0dc14c7077", + "url": "https://api.github.com/repos/composer/composer/zipball/7d887621e69a0311eb50aed4a16f7044b2b385b9", + "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", + "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", + "composer/pcre": "^2 || ^3", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^2.0", + "composer/spdx-licenses": "^1.5.7", + "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "react/promise": "^1.2 || ^2.7", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "react/promise": "^2.8", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" + "seld/phar-utils": "^1.2", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.11 || ^6.0.11", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/finder": "^5.4 || ^6.0", + "symfony/polyfill-php73": "^1.24", + "symfony/polyfill-php80": "^1.24", + "symfony/process": "^5.4 || ^6.0" }, "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1", + "phpstan/phpstan-symfony": "^1.2.10", + "symfony/phpunit-bridge": "^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -967,7 +1049,12 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-main": "2.4-dev" + }, + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] } }, "autoload": { @@ -1001,7 +1088,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.1.9" + "source": "https://github.com/composer/composer/tree/2.4.2" }, "funding": [ { @@ -1017,7 +1104,7 @@ "type": "tidelift" } ], - "time": "2021-10-05T07:47:38+00:00" + "time": "2022-09-14T14:11:15+00:00" }, { "name": "composer/metadata-minifier", @@ -1088,25 +1175,96 @@ ], "time": "2021-04-07T13:37:33+00:00" }, + { + "name": "composer/pcre", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.0.0" + }, + "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": "2022-02-25T20:21:48+00:00" + }, { "name": "composer/semver", - "version": "3.2.5", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.54", + "phpstan/phpstan": "^1.4", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", @@ -1151,7 +1309,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.5" + "source": "https://github.com/composer/semver/tree/3.3.2" }, "funding": [ { @@ -1167,27 +1325,28 @@ "type": "tidelift" } ], - "time": "2021-05-24T12:41:47+00:00" + "time": "2022-04-01T19:23:25+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.5", + "version": "1.5.7", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "de30328a7af8680efdc03e396aad24befd513200" + "reference": "c848241796da2abf65837d51dce1fae55a960149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", - "reference": "de30328a7af8680efdc03e396aad24befd513200", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", + "reference": "c848241796da2abf65837d51dce1fae55a960149", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "extra": { @@ -1230,7 +1389,7 @@ "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" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" }, "funding": [ { @@ -1246,7 +1405,7 @@ "type": "tidelift" } ], - "time": "2020-12-03T16:04:16+00:00" + "time": "2022-05-23T07:37:50+00:00" }, { "name": "composer/xdebug-handler", @@ -2073,16 +2232,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.11", + "version": "5.2.12", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, "require": { @@ -2137,9 +2296,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" }, - "time": "2021-07-22T09:24:00+00:00" + "time": "2022-04-13T08:02:27+00:00" }, { "name": "laminas/laminas-diactoros", @@ -3554,20 +3713,20 @@ }, { "name": "psr/container", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", "autoload": { @@ -3596,9 +3755,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/1.1.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:50:12+00:00" }, { "name": "psr/http-client", @@ -4033,23 +4192,23 @@ }, { "name": "react/promise", - "version": "v2.8.0", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", + "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4067,7 +4226,23 @@ "authors": [ { "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com" + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", @@ -4077,9 +4252,19 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.8.0" + "source": "https://github.com/reactphp/promise/tree/v2.9.0" }, - "time": "2020-05-12T15:16:56+00:00" + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-02-11T10:27:51+00:00" }, { "name": "sebastian/cli-parser", @@ -5047,23 +5232,24 @@ }, { "name": "seld/jsonlint", - "version": "1.8.3", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" + "reference": "4211420d25eba80712bff236a98960ef68b866b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", + "reference": "4211420d25eba80712bff236a98960ef68b866b7", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" }, "bin": [ "bin/jsonlint" @@ -5094,7 +5280,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" + "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" }, "funding": [ { @@ -5106,20 +5292,20 @@ "type": "tidelift" } ], - "time": "2020-11-11T09:19:24+00:00" + "time": "2022-04-01T13:37:23+00:00" }, { "name": "seld/phar-utils", - "version": "1.1.2", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0" + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", "shasum": "" }, "require": { @@ -5152,9 +5338,70 @@ ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2" + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" }, - "time": "2021-08-19T21:01:38+00:00" + "time": "2022-08-31T10:31:18+00:00" + }, + { + "name": "seld/signal-handler", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], + "support": { + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" + }, + "time": "2022-07-20T18:31:45+00:00" }, { "name": "spomky-labs/otphp", @@ -5233,43 +5480,46 @@ }, { "name": "symfony/console", - "version": "v4.4.30", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22" + "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a3f7189a0665ee33b50e9e228c46f50f5acbed22", - "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22", + "url": "https://api.github.com/repos/symfony/console/zipball/3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", + "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", - "symfony/process": "<3.3" + "symfony/process": "<4.4" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5302,8 +5552,14 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/console/tree/v4.4.30" + "source": "https://github.com/symfony/console/tree/v5.4.13" }, "funding": [ { @@ -5319,7 +5575,7 @@ "type": "tidelift" } ], - "time": "2021-08-25T19:27:26+00:00" + "time": "2022-08-26T13:50:20+00:00" }, { "name": "symfony/css-selector", @@ -5389,16 +5645,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { @@ -5407,7 +5663,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5436,7 +5692,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -5452,7 +5708,7 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/dotenv", @@ -5689,21 +5945,22 @@ }, { "name": "symfony/filesystem", - "version": "v5.3.4", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5732,7 +5989,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.4" + "source": "https://github.com/symfony/filesystem/tree/v5.4.13" }, "funding": [ { @@ -5748,24 +6005,25 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2022-09-21T19:53:16+00:00" }, { "name": "symfony/finder", - "version": "v5.3.7", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5794,7 +6052,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v5.4.11" }, "funding": [ { @@ -5810,7 +6068,7 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2022-07-29T07:37:50+00:00" }, { "name": "symfony/http-foundation", @@ -5970,28 +6228,31 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-ctype": "*" + }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6029,7 +6290,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" }, "funding": [ { @@ -6045,7 +6306,88 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "433d05519ce6990bf3530fba6957499d327395c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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 grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.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": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6136,16 +6478,16 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", "shasum": "" }, "require": { @@ -6157,7 +6499,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6200,7 +6542,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" }, "funding": [ { @@ -6216,32 +6558,35 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6280,7 +6625,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" }, "funding": [ { @@ -6296,7 +6641,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php72", @@ -6376,16 +6721,16 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { @@ -6394,7 +6739,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6435,7 +6780,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -6451,20 +6796,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", "shasum": "" }, "require": { @@ -6473,7 +6818,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6518,7 +6863,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" }, "funding": [ { @@ -6534,7 +6879,7 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2022-05-10T07:21:04+00:00" }, { "name": "symfony/polyfill-php81", @@ -6617,20 +6962,20 @@ }, { "name": "symfony/process", - "version": "v4.4.30", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d" + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", + "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -6659,7 +7004,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v4.4.30" + "source": "https://github.com/symfony/process/tree/v5.4.11" }, "funding": [ { @@ -6675,25 +7020,29 @@ "type": "tidelift" } ], - "time": "2021-08-04T20:31:23+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1" + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "suggest": { "symfony/service-implementation": "" @@ -6701,7 +7050,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6738,7 +7087,93 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "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": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "2900c668a32138a34118740de3e4d5a701801f53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/2900c668a32138a34118740de3e4d5a701801f53", + "reference": "2900c668a32138a34118740de3e4d5a701801f53", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.13" }, "funding": [ { @@ -6754,7 +7189,7 @@ "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2022-09-01T01:52:16+00:00" }, { "name": "symfony/yaml", From cbb3b4ab6cbdea429e416be571e6e8f1111dc412 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 10 Oct 2022 12:57:40 +0530 Subject: [PATCH 276/674] composer update --- composer.lock | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/composer.lock b/composer.lock index 19c19952c..a6b6f6f5d 100644 --- a/composer.lock +++ b/composer.lock @@ -7107,34 +7107,33 @@ }, { "name": "symfony/string", - "version": "v5.4.13", + "version": "v6.1.5", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "2900c668a32138a34118740de3e4d5a701801f53" + "reference": "17c08b068176996a1d7db8d00ffae3c248267016" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/2900c668a32138a34118740de3e4d5a701801f53", - "reference": "2900c668a32138a34118740de3e4d5a701801f53", + "url": "https://api.github.com/repos/symfony/string/zipball/17c08b068176996a1d7db8d00ffae3c248267016", + "reference": "17c08b068176996a1d7db8d00ffae3c248267016", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": ">=3.0" + "symfony/translation-contracts": "<2.0" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -7173,7 +7172,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.13" + "source": "https://github.com/symfony/string/tree/v6.1.5" }, "funding": [ { @@ -7189,7 +7188,7 @@ "type": "tidelift" } ], - "time": "2022-09-01T01:52:16+00:00" + "time": "2022-09-02T08:05:20+00:00" }, { "name": "symfony/yaml", From 84f2db8fdb3b347eac48d6747635fa25766b9de1 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 10 Oct 2022 13:05:08 +0530 Subject: [PATCH 277/674] composer update --- composer.lock | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/composer.lock b/composer.lock index a6b6f6f5d..19c19952c 100644 --- a/composer.lock +++ b/composer.lock @@ -7107,33 +7107,34 @@ }, { "name": "symfony/string", - "version": "v6.1.5", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "17c08b068176996a1d7db8d00ffae3c248267016" + "reference": "2900c668a32138a34118740de3e4d5a701801f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/17c08b068176996a1d7db8d00ffae3c248267016", - "reference": "17c08b068176996a1d7db8d00ffae3c248267016", + "url": "https://api.github.com/repos/symfony/string/zipball/2900c668a32138a34118740de3e4d5a701801f53", + "reference": "2900c668a32138a34118740de3e4d5a701801f53", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": ">=3.0" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" }, "type": "library", "autoload": { @@ -7172,7 +7173,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.1.5" + "source": "https://github.com/symfony/string/tree/v5.4.13" }, "funding": [ { @@ -7188,7 +7189,7 @@ "type": "tidelift" } ], - "time": "2022-09-02T08:05:20+00:00" + "time": "2022-09-01T01:52:16+00:00" }, { "name": "symfony/yaml", From 701ed0c1c21ae2b2f8d6d549e44701c081e6084e Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 11 Oct 2022 13:30:33 +0530 Subject: [PATCH 278/674] ignore platform requirments --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index 19c19952c..969a1b435 100644 --- a/composer.lock +++ b/composer.lock @@ -3726,7 +3726,7 @@ "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": ">=7.3.0" }, "type": "library", "autoload": { From e0f958ee6cb33be02eb9aaa896fe19ea7db5f0c7 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 11 Oct 2022 13:35:34 +0530 Subject: [PATCH 279/674] ignore platform requirments --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index 969a1b435..5db839610 100644 --- a/composer.lock +++ b/composer.lock @@ -1190,7 +1190,7 @@ "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": "^7.4 || ^8.0 || ^7.3 " }, "require-dev": { "phpstan/phpstan": "^1.3", From 2ed5f632961c1d653df12c538688e8e4a2f22ba7 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 11 Oct 2022 13:42:47 +0530 Subject: [PATCH 280/674] ignore platform requirments --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index 5db839610..5d38a6f52 100644 --- a/composer.lock +++ b/composer.lock @@ -1190,7 +1190,7 @@ "shasum": "" }, "require": { - "php": "^7.4 || ^8.0 || ^7.3 " + "php": "^7.3 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.3", From 63dfcc9a5e852ba571d9c2caec39835237727b27 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 11 Oct 2022 14:01:24 +0530 Subject: [PATCH 281/674] fix --- composer.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 0161b4883..5b28a9bd2 100755 --- a/composer.json +++ b/composer.json @@ -6,7 +6,10 @@ "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { - "sort-packages": true + "sort-packages": true, + "config": { + "platform-check": false + } }, "require": { "php": ">7.3", From 33a9896690238f2a3ace4aba950d60e590e40ddd Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 11 Oct 2022 14:14:04 +0530 Subject: [PATCH 282/674] fix --- composer.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 5b28a9bd2..0161b4883 100755 --- a/composer.json +++ b/composer.json @@ -6,10 +6,7 @@ "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { - "sort-packages": true, - "config": { - "platform-check": false - } + "sort-packages": true }, "require": { "php": ">7.3", From 09e4521a3b9d4a07763177e17188256dedac1c27 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 11 Oct 2022 14:15:17 +0530 Subject: [PATCH 283/674] fix --- composer.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.lock b/composer.lock index 5d38a6f52..19c19952c 100644 --- a/composer.lock +++ b/composer.lock @@ -1190,7 +1190,7 @@ "shasum": "" }, "require": { - "php": "^7.3 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.3", @@ -3726,7 +3726,7 @@ "shasum": "" }, "require": { - "php": ">=7.3.0" + "php": ">=7.4.0" }, "type": "library", "autoload": { From 86810ddc0cc0259d79277dd7e9b389590cb19e63 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 11 Oct 2022 14:20:39 +0530 Subject: [PATCH 284/674] Update composer.lock --- composer.lock | 755 +++++++++++--------------------------------------- 1 file changed, 160 insertions(+), 595 deletions(-) diff --git a/composer.lock b/composer.lock index 19c19952c..1f79506a8 100644 --- a/composer.lock +++ b/composer.lock @@ -847,16 +847,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.3", + "version": "1.2.11", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" + "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", + "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", "shasum": "" }, "require": { @@ -903,7 +903,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.3" + "source": "https://github.com/composer/ca-bundle/tree/1.2.11" }, "funding": [ { @@ -919,124 +919,42 @@ "type": "tidelift" } ], - "time": "2022-07-20T07:14:26+00:00" - }, - { - "name": "composer/class-map-generator", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", - "shasum": "" - }, - "require": { - "composer/pcre": "^2 || ^3", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" - }, - "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\ClassMapGenerator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Utilities to scan PHP code and generate class maps.", - "keywords": [ - "classmap" - ], - "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" - }, - "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": "2022-06-19T11:31:27+00:00" + "time": "2021-09-25T20:32:43+00:00" }, { "name": "composer/composer", - "version": "2.4.2", + "version": "2.1.9", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9" + "reference": "e558c88f28d102d497adec4852802c0dc14c7077" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/7d887621e69a0311eb50aed4a16f7044b2b385b9", - "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9", + "url": "https://api.github.com/repos/composer/composer/zipball/e558c88f28d102d497adec4852802c0dc14c7077", + "reference": "e558c88f28d102d497adec4852802c0dc14c7077", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2 || ^3", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.5.7", - "composer/xdebug-handler": "^2.0.2 || ^3.0.3", + "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^2.0", "justinrainbow/json-schema": "^5.2.11", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8", + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0", + "react/promise": "^1.2 || ^2.7", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.2", - "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/polyfill-php73": "^1.24", - "symfony/polyfill-php80": "^1.24", - "symfony/process": "^5.4 || ^6.0" + "seld/phar-utils": "^1.0", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" }, "require-dev": { - "phpstan/phpstan": "^1.4.1", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1", - "phpstan/phpstan-symfony": "^1.2.10", - "symfony/phpunit-bridge": "^6.0" + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -1049,12 +967,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" - }, - "phpstan": { - "includes": [ - "phpstan/rules.neon" - ] + "dev-master": "2.1-dev" } }, "autoload": { @@ -1088,7 +1001,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.4.2" + "source": "https://github.com/composer/composer/tree/2.1.9" }, "funding": [ { @@ -1104,7 +1017,7 @@ "type": "tidelift" } ], - "time": "2022-09-14T14:11:15+00:00" + "time": "2021-10-05T07:47:38+00:00" }, { "name": "composer/metadata-minifier", @@ -1175,96 +1088,25 @@ ], "time": "2021-04-07T13:37:33+00:00" }, - { - "name": "composer/pcre", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" - }, - "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": "2022-02-25T20:21:48+00:00" - }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.2.5", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", + "phpstan/phpstan": "^0.12.54", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", @@ -1309,7 +1151,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.2.5" }, "funding": [ { @@ -1325,28 +1167,27 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2021-05-24T12:41:47+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.7", + "version": "1.5.5", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "c848241796da2abf65837d51dce1fae55a960149" + "reference": "de30328a7af8680efdc03e396aad24befd513200" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", - "reference": "c848241796da2abf65837d51dce1fae55a960149", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", + "reference": "de30328a7af8680efdc03e396aad24befd513200", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" }, "type": "library", "extra": { @@ -1389,7 +1230,7 @@ "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.7" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.5" }, "funding": [ { @@ -1405,7 +1246,7 @@ "type": "tidelift" } ], - "time": "2022-05-23T07:37:50+00:00" + "time": "2020-12-03T16:04:16+00:00" }, { "name": "composer/xdebug-handler", @@ -2232,16 +2073,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.12", + "version": "5.2.11", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", + "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", "shasum": "" }, "require": { @@ -2296,9 +2137,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" }, - "time": "2022-04-13T08:02:27+00:00" + "time": "2021-07-22T09:24:00+00:00" }, { "name": "laminas/laminas-diactoros", @@ -3713,20 +3554,20 @@ }, { "name": "psr/container", - "version": "1.1.2", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": ">=7.2.0" }, "type": "library", "autoload": { @@ -3755,9 +3596,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { "name": "psr/http-client", @@ -4192,23 +4033,23 @@ }, { "name": "react/promise", - "version": "v2.9.0", + "version": "v2.8.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", + "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4226,23 +4067,7 @@ "authors": [ { "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "email": "jsorgalla@gmail.com" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", @@ -4252,19 +4077,9 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" + "source": "https://github.com/reactphp/promise/tree/v2.8.0" }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-11T10:27:51+00:00" + "time": "2020-05-12T15:16:56+00:00" }, { "name": "sebastian/cli-parser", @@ -5232,24 +5047,23 @@ }, { "name": "seld/jsonlint", - "version": "1.9.0", + "version": "1.8.3", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "bin": [ "bin/jsonlint" @@ -5280,7 +5094,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" }, "funding": [ { @@ -5292,20 +5106,20 @@ "type": "tidelift" } ], - "time": "2022-04-01T13:37:23+00:00" + "time": "2020-11-11T09:19:24+00:00" }, { "name": "seld/phar-utils", - "version": "1.2.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0", "shasum": "" }, "require": { @@ -5338,70 +5152,9 @@ ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" + "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2" }, - "time": "2022-08-31T10:31:18+00:00" - }, - { - "name": "seld/signal-handler", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "require-dev": { - "phpstan/phpstan": "^1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "psr/log": "^1 || ^2 || ^3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\Signal\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", - "keywords": [ - "posix", - "sigint", - "signal", - "sigterm", - "unix" - ], - "support": { - "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" - }, - "time": "2022-07-20T18:31:45+00:00" + "time": "2021-08-19T21:01:38+00:00" }, { "name": "spomky-labs/otphp", @@ -5480,46 +5233,43 @@ }, { "name": "symfony/console", - "version": "v5.4.13", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be" + "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", - "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", + "url": "https://api.github.com/repos/symfony/console/zipball/a3f7189a0665ee33b50e9e228c46f50f5acbed22", + "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=7.1.3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php73": "^1.8", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" + "symfony/service-contracts": "^1.1|^2" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/process": "<3.3" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5552,14 +5302,8 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.13" + "source": "https://github.com/symfony/console/tree/v4.4.30" }, "funding": [ { @@ -5575,7 +5319,7 @@ "type": "tidelift" } ], - "time": "2022-08-26T13:50:20+00:00" + "time": "2021-08-25T19:27:26+00:00" }, { "name": "symfony/css-selector", @@ -5645,16 +5389,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { @@ -5663,7 +5407,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5692,7 +5436,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" }, "funding": [ { @@ -5708,7 +5452,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/dotenv", @@ -5945,22 +5689,21 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.13", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", - "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5989,7 +5732,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.13" + "source": "https://github.com/symfony/filesystem/tree/v5.3.4" }, "funding": [ { @@ -6005,25 +5748,24 @@ "type": "tidelift" } ], - "time": "2022-09-21T19:53:16+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/finder", - "version": "v5.4.11", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -6052,7 +5794,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.11" + "source": "https://github.com/symfony/finder/tree/v5.3.7" }, "funding": [ { @@ -6068,7 +5810,7 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/http-foundation", @@ -6228,31 +5970,28 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { "php": ">=7.1" }, - "provide": { - "ext-ctype": "*" - }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6290,7 +6029,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" }, "funding": [ { @@ -6306,88 +6045,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "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 grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.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": "2022-05-24T11:49:31+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6478,16 +6136,16 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { @@ -6499,7 +6157,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6542,7 +6200,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, "funding": [ { @@ -6558,35 +6216,32 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { "php": ">=7.1" }, - "provide": { - "ext-mbstring": "*" - }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6625,7 +6280,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" }, "funding": [ { @@ -6641,7 +6296,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-php72", @@ -6721,16 +6376,16 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -6739,7 +6394,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6780,7 +6435,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { @@ -6796,20 +6451,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -6818,7 +6473,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6863,7 +6518,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" }, "funding": [ { @@ -6879,7 +6534,7 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2021-07-28T13:41:28+00:00" }, { "name": "symfony/polyfill-php81", @@ -6962,20 +6617,20 @@ }, { "name": "symfony/process", - "version": "v5.4.11", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" + "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", + "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", + "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=7.1.3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -7004,7 +6659,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.11" + "source": "https://github.com/symfony/process/tree/v4.4.30" }, "funding": [ { @@ -7020,29 +6675,25 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2021-08-04T20:31:23+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" + "psr/container": "^1.1" }, "suggest": { "symfony/service-implementation": "" @@ -7050,7 +6701,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -7087,93 +6738,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" - }, - "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": "2022-05-30T19:17:29+00:00" - }, - { - "name": "symfony/string", - "version": "v5.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "2900c668a32138a34118740de3e4d5a701801f53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/2900c668a32138a34118740de3e4d5a701801f53", - "reference": "2900c668a32138a34118740de3e4d5a701801f53", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "conflict": { - "symfony/translation-contracts": ">=3.0" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.4.13" + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" }, "funding": [ { @@ -7189,7 +6754,7 @@ "type": "tidelift" } ], - "time": "2022-09-01T01:52:16+00:00" + "time": "2021-04-01T10:43:52+00:00" }, { "name": "symfony/yaml", From 3a6bc1d557fc0415a6daf580f182fee8206313dd Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 11 Oct 2022 14:21:52 +0530 Subject: [PATCH 285/674] fix --- composer.json | 6 +- composer.lock | 755 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 600 insertions(+), 161 deletions(-) diff --git a/composer.json b/composer.json index 0161b4883..6dfb6ed42 100755 --- a/composer.json +++ b/composer.json @@ -6,7 +6,11 @@ "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { - "sort-packages": true + "sort-packages": true, + "config": { "platform-check": false + } + + }, "require": { "php": ">7.3", diff --git a/composer.lock b/composer.lock index 1f79506a8..19c19952c 100644 --- a/composer.lock +++ b/composer.lock @@ -847,16 +847,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.2.11", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582" + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", - "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", "shasum": "" }, "require": { @@ -903,7 +903,7 @@ "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.11" + "source": "https://github.com/composer/ca-bundle/tree/1.3.3" }, "funding": [ { @@ -919,42 +919,124 @@ "type": "tidelift" } ], - "time": "2021-09-25T20:32:43+00:00" + "time": "2022-07-20T07:14:26+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "shasum": "" + }, + "require": { + "composer/pcre": "^2 || ^3", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.6", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/filesystem": "^5.4 || ^6", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + }, + "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": "2022-06-19T11:31:27+00:00" }, { "name": "composer/composer", - "version": "2.1.9", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "e558c88f28d102d497adec4852802c0dc14c7077" + "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/e558c88f28d102d497adec4852802c0dc14c7077", - "reference": "e558c88f28d102d497adec4852802c0dc14c7077", + "url": "https://api.github.com/repos/composer/composer/zipball/7d887621e69a0311eb50aed4a16f7044b2b385b9", + "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", + "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", + "composer/pcre": "^2 || ^3", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^2.0", + "composer/spdx-licenses": "^1.5.7", + "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "react/promise": "^1.2 || ^2.7", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "react/promise": "^2.8", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" + "seld/phar-utils": "^1.2", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.11 || ^6.0.11", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/finder": "^5.4 || ^6.0", + "symfony/polyfill-php73": "^1.24", + "symfony/polyfill-php80": "^1.24", + "symfony/process": "^5.4 || ^6.0" }, "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1", + "phpstan/phpstan-symfony": "^1.2.10", + "symfony/phpunit-bridge": "^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -967,7 +1049,12 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-main": "2.4-dev" + }, + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] } }, "autoload": { @@ -1001,7 +1088,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.1.9" + "source": "https://github.com/composer/composer/tree/2.4.2" }, "funding": [ { @@ -1017,7 +1104,7 @@ "type": "tidelift" } ], - "time": "2021-10-05T07:47:38+00:00" + "time": "2022-09-14T14:11:15+00:00" }, { "name": "composer/metadata-minifier", @@ -1088,25 +1175,96 @@ ], "time": "2021-04-07T13:37:33+00:00" }, + { + "name": "composer/pcre", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.0.0" + }, + "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": "2022-02-25T20:21:48+00:00" + }, { "name": "composer/semver", - "version": "3.2.5", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.54", + "phpstan/phpstan": "^1.4", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", @@ -1151,7 +1309,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.5" + "source": "https://github.com/composer/semver/tree/3.3.2" }, "funding": [ { @@ -1167,27 +1325,28 @@ "type": "tidelift" } ], - "time": "2021-05-24T12:41:47+00:00" + "time": "2022-04-01T19:23:25+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.5", + "version": "1.5.7", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "de30328a7af8680efdc03e396aad24befd513200" + "reference": "c848241796da2abf65837d51dce1fae55a960149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", - "reference": "de30328a7af8680efdc03e396aad24befd513200", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", + "reference": "c848241796da2abf65837d51dce1fae55a960149", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "extra": { @@ -1230,7 +1389,7 @@ "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" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" }, "funding": [ { @@ -1246,7 +1405,7 @@ "type": "tidelift" } ], - "time": "2020-12-03T16:04:16+00:00" + "time": "2022-05-23T07:37:50+00:00" }, { "name": "composer/xdebug-handler", @@ -2073,16 +2232,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.11", + "version": "5.2.12", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, "require": { @@ -2137,9 +2296,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" }, - "time": "2021-07-22T09:24:00+00:00" + "time": "2022-04-13T08:02:27+00:00" }, { "name": "laminas/laminas-diactoros", @@ -3554,20 +3713,20 @@ }, { "name": "psr/container", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", "autoload": { @@ -3596,9 +3755,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/1.1.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:50:12+00:00" }, { "name": "psr/http-client", @@ -4033,23 +4192,23 @@ }, { "name": "react/promise", - "version": "v2.8.0", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", + "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4067,7 +4226,23 @@ "authors": [ { "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com" + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", @@ -4077,9 +4252,19 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.8.0" + "source": "https://github.com/reactphp/promise/tree/v2.9.0" }, - "time": "2020-05-12T15:16:56+00:00" + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-02-11T10:27:51+00:00" }, { "name": "sebastian/cli-parser", @@ -5047,23 +5232,24 @@ }, { "name": "seld/jsonlint", - "version": "1.8.3", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" + "reference": "4211420d25eba80712bff236a98960ef68b866b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", + "reference": "4211420d25eba80712bff236a98960ef68b866b7", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" }, "bin": [ "bin/jsonlint" @@ -5094,7 +5280,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" + "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" }, "funding": [ { @@ -5106,20 +5292,20 @@ "type": "tidelift" } ], - "time": "2020-11-11T09:19:24+00:00" + "time": "2022-04-01T13:37:23+00:00" }, { "name": "seld/phar-utils", - "version": "1.1.2", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0" + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", "shasum": "" }, "require": { @@ -5152,9 +5338,70 @@ ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2" + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" }, - "time": "2021-08-19T21:01:38+00:00" + "time": "2022-08-31T10:31:18+00:00" + }, + { + "name": "seld/signal-handler", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], + "support": { + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" + }, + "time": "2022-07-20T18:31:45+00:00" }, { "name": "spomky-labs/otphp", @@ -5233,43 +5480,46 @@ }, { "name": "symfony/console", - "version": "v4.4.30", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22" + "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a3f7189a0665ee33b50e9e228c46f50f5acbed22", - "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22", + "url": "https://api.github.com/repos/symfony/console/zipball/3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", + "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", - "symfony/process": "<3.3" + "symfony/process": "<4.4" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5302,8 +5552,14 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/console/tree/v4.4.30" + "source": "https://github.com/symfony/console/tree/v5.4.13" }, "funding": [ { @@ -5319,7 +5575,7 @@ "type": "tidelift" } ], - "time": "2021-08-25T19:27:26+00:00" + "time": "2022-08-26T13:50:20+00:00" }, { "name": "symfony/css-selector", @@ -5389,16 +5645,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { @@ -5407,7 +5663,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5436,7 +5692,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -5452,7 +5708,7 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/dotenv", @@ -5689,21 +5945,22 @@ }, { "name": "symfony/filesystem", - "version": "v5.3.4", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5732,7 +5989,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.4" + "source": "https://github.com/symfony/filesystem/tree/v5.4.13" }, "funding": [ { @@ -5748,24 +6005,25 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2022-09-21T19:53:16+00:00" }, { "name": "symfony/finder", - "version": "v5.3.7", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5794,7 +6052,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v5.4.11" }, "funding": [ { @@ -5810,7 +6068,7 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2022-07-29T07:37:50+00:00" }, { "name": "symfony/http-foundation", @@ -5970,28 +6228,31 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-ctype": "*" + }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6029,7 +6290,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" }, "funding": [ { @@ -6045,7 +6306,88 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "433d05519ce6990bf3530fba6957499d327395c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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 grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.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": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6136,16 +6478,16 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", "shasum": "" }, "require": { @@ -6157,7 +6499,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6200,7 +6542,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" }, "funding": [ { @@ -6216,32 +6558,35 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6280,7 +6625,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" }, "funding": [ { @@ -6296,7 +6641,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php72", @@ -6376,16 +6721,16 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { @@ -6394,7 +6739,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6435,7 +6780,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -6451,20 +6796,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", "shasum": "" }, "require": { @@ -6473,7 +6818,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6518,7 +6863,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" }, "funding": [ { @@ -6534,7 +6879,7 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2022-05-10T07:21:04+00:00" }, { "name": "symfony/polyfill-php81", @@ -6617,20 +6962,20 @@ }, { "name": "symfony/process", - "version": "v4.4.30", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d" + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", + "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -6659,7 +7004,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v4.4.30" + "source": "https://github.com/symfony/process/tree/v5.4.11" }, "funding": [ { @@ -6675,25 +7020,29 @@ "type": "tidelift" } ], - "time": "2021-08-04T20:31:23+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1" + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "suggest": { "symfony/service-implementation": "" @@ -6701,7 +7050,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6738,7 +7087,93 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "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": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "2900c668a32138a34118740de3e4d5a701801f53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/2900c668a32138a34118740de3e4d5a701801f53", + "reference": "2900c668a32138a34118740de3e4d5a701801f53", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.13" }, "funding": [ { @@ -6754,7 +7189,7 @@ "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2022-09-01T01:52:16+00:00" }, { "name": "symfony/yaml", From 6df70f7351d9219a9349c9cb3aa4cec7e0c76a21 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 11 Oct 2022 14:29:18 +0530 Subject: [PATCH 286/674] Update composer.lock --- composer.lock | 755 +++++++++++--------------------------------------- 1 file changed, 160 insertions(+), 595 deletions(-) diff --git a/composer.lock b/composer.lock index 19c19952c..1f79506a8 100644 --- a/composer.lock +++ b/composer.lock @@ -847,16 +847,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.3", + "version": "1.2.11", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" + "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", + "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", "shasum": "" }, "require": { @@ -903,7 +903,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.3" + "source": "https://github.com/composer/ca-bundle/tree/1.2.11" }, "funding": [ { @@ -919,124 +919,42 @@ "type": "tidelift" } ], - "time": "2022-07-20T07:14:26+00:00" - }, - { - "name": "composer/class-map-generator", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", - "shasum": "" - }, - "require": { - "composer/pcre": "^2 || ^3", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" - }, - "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\ClassMapGenerator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Utilities to scan PHP code and generate class maps.", - "keywords": [ - "classmap" - ], - "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" - }, - "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": "2022-06-19T11:31:27+00:00" + "time": "2021-09-25T20:32:43+00:00" }, { "name": "composer/composer", - "version": "2.4.2", + "version": "2.1.9", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9" + "reference": "e558c88f28d102d497adec4852802c0dc14c7077" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/7d887621e69a0311eb50aed4a16f7044b2b385b9", - "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9", + "url": "https://api.github.com/repos/composer/composer/zipball/e558c88f28d102d497adec4852802c0dc14c7077", + "reference": "e558c88f28d102d497adec4852802c0dc14c7077", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2 || ^3", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.5.7", - "composer/xdebug-handler": "^2.0.2 || ^3.0.3", + "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^2.0", "justinrainbow/json-schema": "^5.2.11", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8", + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0", + "react/promise": "^1.2 || ^2.7", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.2", - "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/polyfill-php73": "^1.24", - "symfony/polyfill-php80": "^1.24", - "symfony/process": "^5.4 || ^6.0" + "seld/phar-utils": "^1.0", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" }, "require-dev": { - "phpstan/phpstan": "^1.4.1", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1", - "phpstan/phpstan-symfony": "^1.2.10", - "symfony/phpunit-bridge": "^6.0" + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -1049,12 +967,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" - }, - "phpstan": { - "includes": [ - "phpstan/rules.neon" - ] + "dev-master": "2.1-dev" } }, "autoload": { @@ -1088,7 +1001,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.4.2" + "source": "https://github.com/composer/composer/tree/2.1.9" }, "funding": [ { @@ -1104,7 +1017,7 @@ "type": "tidelift" } ], - "time": "2022-09-14T14:11:15+00:00" + "time": "2021-10-05T07:47:38+00:00" }, { "name": "composer/metadata-minifier", @@ -1175,96 +1088,25 @@ ], "time": "2021-04-07T13:37:33+00:00" }, - { - "name": "composer/pcre", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" - }, - "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": "2022-02-25T20:21:48+00:00" - }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.2.5", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", + "phpstan/phpstan": "^0.12.54", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", @@ -1309,7 +1151,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.2.5" }, "funding": [ { @@ -1325,28 +1167,27 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2021-05-24T12:41:47+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.7", + "version": "1.5.5", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "c848241796da2abf65837d51dce1fae55a960149" + "reference": "de30328a7af8680efdc03e396aad24befd513200" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", - "reference": "c848241796da2abf65837d51dce1fae55a960149", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", + "reference": "de30328a7af8680efdc03e396aad24befd513200", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" }, "type": "library", "extra": { @@ -1389,7 +1230,7 @@ "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.7" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.5" }, "funding": [ { @@ -1405,7 +1246,7 @@ "type": "tidelift" } ], - "time": "2022-05-23T07:37:50+00:00" + "time": "2020-12-03T16:04:16+00:00" }, { "name": "composer/xdebug-handler", @@ -2232,16 +2073,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.12", + "version": "5.2.11", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", + "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", "shasum": "" }, "require": { @@ -2296,9 +2137,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" }, - "time": "2022-04-13T08:02:27+00:00" + "time": "2021-07-22T09:24:00+00:00" }, { "name": "laminas/laminas-diactoros", @@ -3713,20 +3554,20 @@ }, { "name": "psr/container", - "version": "1.1.2", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": ">=7.2.0" }, "type": "library", "autoload": { @@ -3755,9 +3596,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { "name": "psr/http-client", @@ -4192,23 +4033,23 @@ }, { "name": "react/promise", - "version": "v2.9.0", + "version": "v2.8.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", + "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4226,23 +4067,7 @@ "authors": [ { "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "email": "jsorgalla@gmail.com" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", @@ -4252,19 +4077,9 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" + "source": "https://github.com/reactphp/promise/tree/v2.8.0" }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-11T10:27:51+00:00" + "time": "2020-05-12T15:16:56+00:00" }, { "name": "sebastian/cli-parser", @@ -5232,24 +5047,23 @@ }, { "name": "seld/jsonlint", - "version": "1.9.0", + "version": "1.8.3", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "bin": [ "bin/jsonlint" @@ -5280,7 +5094,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" }, "funding": [ { @@ -5292,20 +5106,20 @@ "type": "tidelift" } ], - "time": "2022-04-01T13:37:23+00:00" + "time": "2020-11-11T09:19:24+00:00" }, { "name": "seld/phar-utils", - "version": "1.2.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0", "shasum": "" }, "require": { @@ -5338,70 +5152,9 @@ ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" + "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2" }, - "time": "2022-08-31T10:31:18+00:00" - }, - { - "name": "seld/signal-handler", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "require-dev": { - "phpstan/phpstan": "^1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "psr/log": "^1 || ^2 || ^3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\Signal\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", - "keywords": [ - "posix", - "sigint", - "signal", - "sigterm", - "unix" - ], - "support": { - "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" - }, - "time": "2022-07-20T18:31:45+00:00" + "time": "2021-08-19T21:01:38+00:00" }, { "name": "spomky-labs/otphp", @@ -5480,46 +5233,43 @@ }, { "name": "symfony/console", - "version": "v5.4.13", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be" + "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", - "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", + "url": "https://api.github.com/repos/symfony/console/zipball/a3f7189a0665ee33b50e9e228c46f50f5acbed22", + "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=7.1.3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php73": "^1.8", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" + "symfony/service-contracts": "^1.1|^2" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/process": "<3.3" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5552,14 +5302,8 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.13" + "source": "https://github.com/symfony/console/tree/v4.4.30" }, "funding": [ { @@ -5575,7 +5319,7 @@ "type": "tidelift" } ], - "time": "2022-08-26T13:50:20+00:00" + "time": "2021-08-25T19:27:26+00:00" }, { "name": "symfony/css-selector", @@ -5645,16 +5389,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { @@ -5663,7 +5407,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5692,7 +5436,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" }, "funding": [ { @@ -5708,7 +5452,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/dotenv", @@ -5945,22 +5689,21 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.13", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", - "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5989,7 +5732,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.13" + "source": "https://github.com/symfony/filesystem/tree/v5.3.4" }, "funding": [ { @@ -6005,25 +5748,24 @@ "type": "tidelift" } ], - "time": "2022-09-21T19:53:16+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/finder", - "version": "v5.4.11", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -6052,7 +5794,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.11" + "source": "https://github.com/symfony/finder/tree/v5.3.7" }, "funding": [ { @@ -6068,7 +5810,7 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/http-foundation", @@ -6228,31 +5970,28 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { "php": ">=7.1" }, - "provide": { - "ext-ctype": "*" - }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6290,7 +6029,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" }, "funding": [ { @@ -6306,88 +6045,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "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 grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.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": "2022-05-24T11:49:31+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6478,16 +6136,16 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { @@ -6499,7 +6157,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6542,7 +6200,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, "funding": [ { @@ -6558,35 +6216,32 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { "php": ">=7.1" }, - "provide": { - "ext-mbstring": "*" - }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6625,7 +6280,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" }, "funding": [ { @@ -6641,7 +6296,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-php72", @@ -6721,16 +6376,16 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -6739,7 +6394,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6780,7 +6435,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { @@ -6796,20 +6451,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -6818,7 +6473,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6863,7 +6518,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" }, "funding": [ { @@ -6879,7 +6534,7 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2021-07-28T13:41:28+00:00" }, { "name": "symfony/polyfill-php81", @@ -6962,20 +6617,20 @@ }, { "name": "symfony/process", - "version": "v5.4.11", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" + "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", + "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", + "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=7.1.3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -7004,7 +6659,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.11" + "source": "https://github.com/symfony/process/tree/v4.4.30" }, "funding": [ { @@ -7020,29 +6675,25 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2021-08-04T20:31:23+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" + "psr/container": "^1.1" }, "suggest": { "symfony/service-implementation": "" @@ -7050,7 +6701,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -7087,93 +6738,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" - }, - "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": "2022-05-30T19:17:29+00:00" - }, - { - "name": "symfony/string", - "version": "v5.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "2900c668a32138a34118740de3e4d5a701801f53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/2900c668a32138a34118740de3e4d5a701801f53", - "reference": "2900c668a32138a34118740de3e4d5a701801f53", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "conflict": { - "symfony/translation-contracts": ">=3.0" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.4.13" + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" }, "funding": [ { @@ -7189,7 +6754,7 @@ "type": "tidelift" } ], - "time": "2022-09-01T01:52:16+00:00" + "time": "2021-04-01T10:43:52+00:00" }, { "name": "symfony/yaml", From 835ea1f60cc51718d9acf975ecce532fe7821f79 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 11 Oct 2022 14:29:43 +0530 Subject: [PATCH 287/674] Update composer.json --- composer.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 6dfb6ed42..0161b4883 100755 --- a/composer.json +++ b/composer.json @@ -6,11 +6,7 @@ "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { - "sort-packages": true, - "config": { "platform-check": false - } - - + "sort-packages": true }, "require": { "php": ">7.3", From cadedbd4e736cd193fa1065a1e60529721f422a3 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 11 Oct 2022 14:32:44 +0530 Subject: [PATCH 288/674] fix --- composer.json | 3 +- composer.lock | 2078 +++++++++++++++++++++++++++---------------------- 2 files changed, 1158 insertions(+), 923 deletions(-) diff --git a/composer.json b/composer.json index 0161b4883..08f78bb63 100755 --- a/composer.json +++ b/composer.json @@ -6,7 +6,8 @@ "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { - "sort-packages": true + "sort-packages": true, + "config": { "platform-check": false } }, "require": { "php": ">7.3", diff --git a/composer.lock b/composer.lock index 1f79506a8..957f921aa 100644 --- a/composer.lock +++ b/composer.lock @@ -69,16 +69,16 @@ }, { "name": "allure-framework/allure-php-api", - "version": "1.3.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-php-api.git", - "reference": "f64b69afeff472c564a4e2379efb2b69c430ec5a" + "reference": "50507f482d490f114054f2281cca487db47fa2bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-api/zipball/f64b69afeff472c564a4e2379efb2b69c430ec5a", - "reference": "f64b69afeff472c564a4e2379efb2b69c430ec5a", + "url": "https://api.github.com/repos/allure-framework/allure-php-api/zipball/50507f482d490f114054f2281cca487db47fa2bd", + "reference": "50507f482d490f114054f2281cca487db47fa2bd", "shasum": "" }, "require": { @@ -110,7 +110,7 @@ "role": "Developer" } ], - "description": "PHP API for Allure adapter", + "description": "Allure PHP commons", "homepage": "http://allure.qatools.ru/", "keywords": [ "allure", @@ -119,11 +119,11 @@ "report" ], "support": { - "email": "allure@yandex-team.ru", + "email": "allure@qameta.io", "issues": "https://github.com/allure-framework/allure-php-api/issues", "source": "https://github.com/allure-framework/allure-php-api" }, - "time": "2021-03-26T14:32:27+00:00" + "time": "2021-11-15T13:15:20+00:00" }, { "name": "aws/aws-crt-php", @@ -177,16 +177,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.198.7", + "version": "3.238.3", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "40197a954c9f49557a1b0d49e2a9bd6f7bf6adfc" + "reference": "14fb64c934614ea5a52c9931189f687f30b6ba3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/40197a954c9f49557a1b0d49e2a9bd6f7bf6adfc", - "reference": "40197a954c9f49557a1b0d49e2a9bd6f7bf6adfc", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/14fb64c934614ea5a52c9931189f687f30b6ba3b", + "reference": "14fb64c934614ea5a52c9931189f687f30b6ba3b", "shasum": "" }, "require": { @@ -194,9 +194,9 @@ "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", - "guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", "guzzlehttp/promises": "^1.4.0", - "guzzlehttp/psr7": "^1.7.0", + "guzzlehttp/psr7": "^1.8.5 || ^2.3", "mtdowling/jmespath.php": "^2.6", "php": ">=5.5" }, @@ -204,6 +204,8 @@ "andrewsville/php-token-reflection": "^1.4", "aws/aws-php-sns-message-validator": "~1.0", "behat/behat": "~3.0", + "composer/composer": "^1.10.22", + "dms/phpunit-arraysubset-asserts": "^0.4.0", "doctrine/cache": "~1.4", "ext-dom": "*", "ext-openssl": "*", @@ -211,10 +213,11 @@ "ext-sockets": "*", "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^4.8.35|^5.4.3", + "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", "psr/cache": "^1.0", "psr/simple-cache": "^1.0", - "sebastian/comparator": "^1.2.3" + "sebastian/comparator": "^1.2.3 || ^4.0", + "yoast/phpunit-polyfills": "^1.0" }, "suggest": { "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", @@ -262,22 +265,22 @@ "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.198.7" + "source": "https://github.com/aws/aws-sdk-php/tree/3.238.3" }, - "time": "2021-10-18T18:17:12+00:00" + "time": "2022-10-07T18:16:40+00:00" }, { "name": "beberlei/assert", - "version": "v3.3.1", + "version": "v3.3.2", "source": { "type": "git", "url": "https://github.com/beberlei/assert.git", - "reference": "5e721d7e937ca3ba2cdec1e1adf195f9e5188372" + "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/beberlei/assert/zipball/5e721d7e937ca3ba2cdec1e1adf195f9e5188372", - "reference": "5e721d7e937ca3ba2cdec1e1adf195f9e5188372", + "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655", + "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655", "shasum": "" }, "require": { @@ -329,9 +332,9 @@ ], "support": { "issues": "https://github.com/beberlei/assert/issues", - "source": "https://github.com/beberlei/assert/tree/v3.3.1" + "source": "https://github.com/beberlei/assert/tree/v3.3.2" }, - "time": "2021-04-18T20:11:03+00:00" + "time": "2021-12-16T21:41:27+00:00" }, { "name": "behat/gherkin", @@ -458,23 +461,23 @@ }, { "name": "codeception/codeception", - "version": "4.1.22", + "version": "4.2.2", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f" + "reference": "b88014f3348c93f3df99dc6d0967b0dbfa804474" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", - "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/b88014f3348c93f3df99dc6d0967b0dbfa804474", + "reference": "b88014f3348c93f3df99dc6d0967b0dbfa804474", "shasum": "" }, "require": { "behat/gherkin": "^4.4.0", - "codeception/lib-asserts": "^1.0", + "codeception/lib-asserts": "^1.0 | 2.0.*@dev", "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", + "codeception/stub": "^2.0 | ^3.0 | ^4.0", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", @@ -487,11 +490,11 @@ "symfony/yaml": ">=2.7 <6.0" }, "require-dev": { - "codeception/module-asserts": "1.*@dev", - "codeception/module-cli": "1.*@dev", - "codeception/module-db": "1.*@dev", - "codeception/module-filesystem": "1.*@dev", - "codeception/module-phpbrowser": "1.*@dev", + "codeception/module-asserts": "^1.0 | 2.0.*@dev", + "codeception/module-cli": "^1.0 | 2.0.*@dev", + "codeception/module-db": "^1.0 | 2.0.*@dev", + "codeception/module-filesystem": "^1.0 | 2.0.*@dev", + "codeception/module-phpbrowser": "^1.0 | 2.0.*@dev", "codeception/specify": "~0.3", "codeception/util-universalframework": "*@dev", "monolog/monolog": "~1.8", @@ -514,6 +517,9 @@ "branch-alias": [] }, "autoload": { + "files": [ + "functions.php" + ], "psr-4": { "Codeception\\": "src/Codeception", "Codeception\\Extension\\": "ext" @@ -527,11 +533,11 @@ { "name": "Michael Bodnarchuk", "email": "davert@mail.ua", - "homepage": "http://codegyre.com" + "homepage": "https://codegyre.com" } ], "description": "BDD-style testing framework", - "homepage": "http://codeception.com/", + "homepage": "https://codeception.com/", "keywords": [ "BDD", "TDD", @@ -541,7 +547,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/4.1.22" + "source": "https://github.com/Codeception/Codeception/tree/4.2.2" }, "funding": [ { @@ -549,7 +555,7 @@ "type": "open_collective" } ], - "time": "2021-08-06T17:15:34+00:00" + "time": "2022-08-13T13:28:25+00:00" }, { "name": "codeception/lib-asserts", @@ -708,16 +714,16 @@ }, { "name": "codeception/module-webdriver", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/Codeception/module-webdriver.git", - "reference": "baa18b7bf70aa024012f967b5ce5021e1faa9151" + "reference": "e22ac7da756df659df6dd4fac2dff9c859e30131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/baa18b7bf70aa024012f967b5ce5021e1faa9151", - "reference": "baa18b7bf70aa024012f967b5ce5021e1faa9151", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/e22ac7da756df659df6dd4fac2dff9c859e30131", + "reference": "e22ac7da756df659df6dd4fac2dff9c859e30131", "shasum": "" }, "require": { @@ -758,22 +764,22 @@ ], "support": { "issues": "https://github.com/Codeception/module-webdriver/issues", - "source": "https://github.com/Codeception/module-webdriver/tree/1.4.0" + "source": "https://github.com/Codeception/module-webdriver/tree/1.4.1" }, - "time": "2021-09-02T12:01:02+00:00" + "time": "2022-09-12T05:09:51+00:00" }, { "name": "codeception/phpunit-wrapper", - "version": "9.0.6", + "version": "9.0.9", "source": { "type": "git", "url": "https://github.com/Codeception/phpunit-wrapper.git", - "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc" + "reference": "7439a53ae367986e9c22b2ac00f9d7376bb2f8cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/b0c06abb3181eedca690170f7ed0fd26a70bfacc", - "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc", + "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/7439a53ae367986e9c22b2ac00f9d7376bb2f8cf", + "reference": "7439a53ae367986e9c22b2ac00f9d7376bb2f8cf", "shasum": "" }, "require": { @@ -807,26 +813,30 @@ "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" + "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.9" }, - "time": "2020-12-28T13:59:47+00:00" + "time": "2022-05-23T06:24:11+00:00" }, { "name": "codeception/stub", - "version": "3.7.0", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "468dd5fe659f131fc997f5196aad87512f9b1304" + "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/468dd5fe659f131fc997f5196aad87512f9b1304", - "reference": "468dd5fe659f131fc997f5196aad87512f9b1304", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/18a148dacd293fc7b044042f5aa63a82b08bff5d", + "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d", "shasum": "" }, "require": { - "phpunit/phpunit": "^8.4 | ^9.0" + "php": "^7.4 | ^8.0", + "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | 10.0.x-dev" + }, + "require-dev": { + "consolidation/robo": "^3.0" }, "type": "library", "autoload": { @@ -841,22 +851,22 @@ "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" + "source": "https://github.com/Codeception/Stub/tree/4.0.2" }, - "time": "2020-07-03T15:54:43+00:00" + "time": "2022-01-31T19:25:15+00:00" }, { "name": "composer/ca-bundle", - "version": "1.2.11", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582" + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", - "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", "shasum": "" }, "require": { @@ -903,7 +913,7 @@ "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.11" + "source": "https://github.com/composer/ca-bundle/tree/1.3.3" }, "funding": [ { @@ -919,42 +929,124 @@ "type": "tidelift" } ], - "time": "2021-09-25T20:32:43+00:00" + "time": "2022-07-20T07:14:26+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "shasum": "" + }, + "require": { + "composer/pcre": "^2 || ^3", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.6", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/filesystem": "^5.4 || ^6", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + }, + "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": "2022-06-19T11:31:27+00:00" }, { "name": "composer/composer", - "version": "2.1.9", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "e558c88f28d102d497adec4852802c0dc14c7077" + "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/e558c88f28d102d497adec4852802c0dc14c7077", - "reference": "e558c88f28d102d497adec4852802c0dc14c7077", + "url": "https://api.github.com/repos/composer/composer/zipball/7d887621e69a0311eb50aed4a16f7044b2b385b9", + "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", + "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", + "composer/pcre": "^2 || ^3", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^2.0", + "composer/spdx-licenses": "^1.5.7", + "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "react/promise": "^1.2 || ^2.7", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "react/promise": "^2.8", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" + "seld/phar-utils": "^1.2", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.11 || ^6.0.11", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/finder": "^5.4 || ^6.0", + "symfony/polyfill-php73": "^1.24", + "symfony/polyfill-php80": "^1.24", + "symfony/process": "^5.4 || ^6.0" }, "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1", + "phpstan/phpstan-symfony": "^1.2.10", + "symfony/phpunit-bridge": "^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -967,7 +1059,12 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-main": "2.4-dev" + }, + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] } }, "autoload": { @@ -1001,7 +1098,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.1.9" + "source": "https://github.com/composer/composer/tree/2.4.2" }, "funding": [ { @@ -1017,7 +1114,7 @@ "type": "tidelift" } ], - "time": "2021-10-05T07:47:38+00:00" + "time": "2022-09-14T14:11:15+00:00" }, { "name": "composer/metadata-minifier", @@ -1088,25 +1185,96 @@ ], "time": "2021-04-07T13:37:33+00:00" }, + { + "name": "composer/pcre", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.0.0" + }, + "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": "2022-02-25T20:21:48+00:00" + }, { "name": "composer/semver", - "version": "3.2.5", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.54", + "phpstan/phpstan": "^1.4", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", @@ -1151,7 +1319,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.5" + "source": "https://github.com/composer/semver/tree/3.3.2" }, "funding": [ { @@ -1167,27 +1335,28 @@ "type": "tidelift" } ], - "time": "2021-05-24T12:41:47+00:00" + "time": "2022-04-01T19:23:25+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.5", + "version": "1.5.7", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "de30328a7af8680efdc03e396aad24befd513200" + "reference": "c848241796da2abf65837d51dce1fae55a960149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", - "reference": "de30328a7af8680efdc03e396aad24befd513200", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", + "reference": "c848241796da2abf65837d51dce1fae55a960149", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "extra": { @@ -1230,7 +1399,7 @@ "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" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" }, "funding": [ { @@ -1246,29 +1415,31 @@ "type": "tidelift" } ], - "time": "2020-12-03T16:04:16+00:00" + "time": "2022-05-23T07:37:50+00:00" }, { "name": "composer/xdebug-handler", - "version": "2.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" + "reference": "ced299686f41dce890debac69273b47ffe98a40c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", - "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", "psr/log": "^1 || ^2 || ^3" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" }, "type": "library", "autoload": { @@ -1294,7 +1465,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" }, "funding": [ { @@ -1310,30 +1481,29 @@ "type": "tidelift" } ], - "time": "2021-07-31T17:03:58+00:00" + "time": "2022-02-25T21:32:43+00:00" }, { "name": "csharpru/vault-php", - "version": "4.2.1", + "version": "4.3.1", "source": { "type": "git", "url": "https://github.com/CSharpRU/vault-php.git", - "reference": "89b393ecf65f61a44d3a1872547f65085982b481" + "reference": "918bfffe85d3b290e1bf667b5f14e521fdc0063c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CSharpRU/vault-php/zipball/89b393ecf65f61a44d3a1872547f65085982b481", - "reference": "89b393ecf65f61a44d3a1872547f65085982b481", + "url": "https://api.github.com/repos/CSharpRU/vault-php/zipball/918bfffe85d3b290e1bf667b5f14e521fdc0063c", + "reference": "918bfffe85d3b290e1bf667b5f14e521fdc0063c", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.2 || ^8.0", - "psr/cache": "^1.0", + "psr/cache": "^1.0|^2.0|^3.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", - "psr/log": "^1.0", - "weew/helpers-array": "^1.3" + "psr/log": "^1.0|^2.0|^3.0" }, "require-dev": { "alextartan/guzzle-psr18-adapter": "^1.2 || ^2.0", @@ -1371,22 +1541,22 @@ ], "support": { "issues": "https://github.com/CSharpRU/vault-php/issues", - "source": "https://github.com/CSharpRU/vault-php/tree/4.2.1" + "source": "https://github.com/CSharpRU/vault-php/tree/4.3.1" }, - "time": "2021-05-21T06:39:35+00:00" + "time": "2022-04-04T08:31:44+00:00" }, { "name": "doctrine/annotations", - "version": "1.13.2", + "version": "1.13.3", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "5b668aef16090008790395c02c893b1ba13f7e08" + "reference": "648b0343343565c4a056bfc8392201385e8d89f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", - "reference": "5b668aef16090008790395c02c893b1ba13f7e08", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0", + "reference": "648b0343343565c4a056bfc8392201385e8d89f0", "shasum": "" }, "require": { @@ -1398,9 +1568,10 @@ "require-dev": { "doctrine/cache": "^1.11 || ^2.0", "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^0.12.20", + "phpstan/phpstan": "^1.4.10 || ^1.8.0", "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2" + "symfony/cache": "^4.4 || ^5.2", + "vimeo/psalm": "^4.10" }, "type": "library", "autoload": { @@ -1443,35 +1614,36 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.2" + "source": "https://github.com/doctrine/annotations/tree/1.13.3" }, - "time": "2021-08-05T19:00:23+00:00" + "time": "2022-07-02T10:48:51+00:00" }, { "name": "doctrine/instantiator", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^8.0", + "doctrine/coding-standard": "^9", "ext-pdo": "*", "ext-phar": "*", - "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" + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" }, "type": "library", "autoload": { @@ -1498,7 +1670,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + "source": "https://github.com/doctrine/instantiator/tree/1.4.1" }, "funding": [ { @@ -1514,36 +1686,32 @@ "type": "tidelift" } ], - "time": "2020-11-10T18:47:58+00:00" + "time": "2022-03-03T08:28:38+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.1", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.11" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" @@ -1578,7 +1746,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" + "source": "https://github.com/doctrine/lexer/tree/1.2.3" }, "funding": [ { @@ -1594,38 +1762,38 @@ "type": "tidelift" } ], - "time": "2020-05-25T17:44:05+00:00" + "time": "2022-02-28T11:07:21+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.4.0", + "version": "7.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94" + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/868b3571a039f0ebc11ac8f344f4080babe2cb94", - "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.8.3 || ^2.1", + "guzzlehttp/psr7": "^1.9 || ^2.4", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2" + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "provide": { "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -1635,8 +1803,12 @@ }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, "branch-alias": { - "dev-master": "7.4-dev" + "dev-master": "7.5-dev" } }, "autoload": { @@ -1702,7 +1874,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.0" + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" }, "funding": [ { @@ -1718,20 +1890,20 @@ "type": "tidelift" } ], - "time": "2021-10-18T09:52:00+00:00" + "time": "2022-08-28T15:39:27+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.0", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "136a635e2b4a49b9d79e9c8fee267ffb257fdba0" + "reference": "b94b2807d85443f9719887892882d0329d1e2598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/136a635e2b4a49b9d79e9c8fee267ffb257fdba0", - "reference": "136a635e2b4a49b9d79e9c8fee267ffb257fdba0", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", "shasum": "" }, "require": { @@ -1786,7 +1958,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.0" + "source": "https://github.com/guzzle/promises/tree/1.5.2" }, "funding": [ { @@ -1802,47 +1974,51 @@ "type": "tidelift" } ], - "time": "2021-10-07T13:05:22+00:00" + "time": "2022-08-28T14:55:35+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.8.3", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85" + "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/1afdd860a2566ed3c2b0b4a3de6e23434a79ec85", - "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/69568e4293f4fa993f3b0e51c9723e1e17c41379", + "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379", "shasum": "" }, "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" }, "provide": { + "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "2.4-dev" } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Psr7\\": "src/" } @@ -1881,6 +2057,11 @@ "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", @@ -1896,7 +2077,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.3" + "source": "https://github.com/guzzle/psr7/tree/2.4.1" }, "funding": [ { @@ -1912,20 +2093,20 @@ "type": "tidelift" } ], - "time": "2021-10-05T13:56:00+00:00" + "time": "2022-08-28T14:45:39+00:00" }, { "name": "jms/metadata", - "version": "2.5.1", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/metadata.git", - "reference": "a995e6cef6d6f56a6226e1616a519630e2ef0aeb" + "reference": "283c714831d272d78ddd6e52e08ac16d76be30fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/a995e6cef6d6f56a6226e1616a519630e2ef0aeb", - "reference": "a995e6cef6d6f56a6226e1616a519630e2ef0aeb", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/283c714831d272d78ddd6e52e08ac16d76be30fd", + "reference": "283c714831d272d78ddd6e52e08ac16d76be30fd", "shasum": "" }, "require": { @@ -1974,29 +2155,29 @@ ], "support": { "issues": "https://github.com/schmittjoh/metadata/issues", - "source": "https://github.com/schmittjoh/metadata/tree/2.5.1" + "source": "https://github.com/schmittjoh/metadata/tree/2.7.0" }, - "time": "2021-08-04T19:32:08+00:00" + "time": "2022-09-13T19:18:27+00:00" }, { "name": "jms/serializer", - "version": "3.15.0", + "version": "3.18.2", "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "9d6d9b81889904603383722ca0cd7f7999baeebc" + "reference": "329e29c323fb1e5c65b4ae4c77ba747678755a6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/9d6d9b81889904603383722ca0cd7f7999baeebc", - "reference": "9d6d9b81889904603383722ca0cd7f7999baeebc", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/329e29c323fb1e5c65b4ae4c77ba747678755a6c", + "reference": "329e29c323fb1e5c65b4ae4c77ba747678755a6c", "shasum": "" }, "require": { - "doctrine/annotations": "^1.10.4", + "doctrine/annotations": "^1.13", "doctrine/instantiator": "^1.0.3", "doctrine/lexer": "^1.1", - "jms/metadata": "^2.0", + "jms/metadata": "^2.6", "php": "^7.2||^8.0", "phpstan/phpdoc-parser": "^0.4 || ^0.5 || ^1.0" }, @@ -2008,14 +2189,16 @@ "ext-pdo_sqlite": "*", "jackalope/jackalope-doctrine-dbal": "^1.1.5", "ocramius/proxy-manager": "^1.0|^2.0", - "phpstan/phpstan": "^0.12.65", - "phpunit/phpunit": "^8.0||^9.0", + "phpbench/phpbench": "^1.0", + "phpstan/phpstan": "^1.0.2", + "phpunit/phpunit": "^8.5.21||^9.0", "psr/container": "^1.0", "symfony/dependency-injection": "^3.0|^4.0|^5.0|^6.0", - "symfony/expression-language": "^3.0|^4.0|^5.0|^6.0", + "symfony/expression-language": "^3.2|^4.0|^5.0|^6.0", "symfony/filesystem": "^3.0|^4.0|^5.0|^6.0", "symfony/form": "^3.0|^4.0|^5.0|^6.0", "symfony/translation": "^3.0|^4.0|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", "symfony/validator": "^3.1.9|^4.0|^5.0|^6.0", "symfony/yaml": "^3.3|^4.0|^5.0|^6.0", "twig/twig": "~1.34|~2.4|^3.0" @@ -2023,6 +2206,7 @@ "suggest": { "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", "symfony/cache": "Required if you like to use cache functionality.", + "symfony/uid": "Required if you'd like to serialize UID objects.", "symfony/yaml": "Required if you'd like to use the YAML metadata format." }, "type": "library", @@ -2061,7 +2245,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/3.15.0" + "source": "https://github.com/schmittjoh/serializer/tree/3.18.2" }, "funding": [ { @@ -2069,20 +2253,20 @@ "type": "github" } ], - "time": "2021-10-14T20:02:48+00:00" + "time": "2022-09-12T08:40:16+00:00" }, { "name": "justinrainbow/json-schema", - "version": "5.2.11", + "version": "5.2.12", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, "require": { @@ -2137,31 +2321,30 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" }, - "time": "2021-07-22T09:24:00+00:00" + "time": "2022-04-13T08:02:27+00:00" }, { "name": "laminas/laminas-diactoros", - "version": "2.8.0", + "version": "2.17.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199" + "reference": "5b32597aa46b83c8b85bb1cf9a6ed4fe7dd980c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/0c26ef1d95b6d7e6e3943a243ba3dc0797227199", - "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/5b32597aa46b83c8b85bb1cf9a6ed4fe7dd980c5", + "reference": "5b32597aa46b83c8b85bb1cf9a6ed4fe7dd980c5", "shasum": "" }, "require": { - "php": "^7.3 || ~8.0.0 || ~8.1.0", + "php": "^7.4 || ~8.0.0 || ~8.1.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.0" }, "conflict": { - "phpspec/prophecy": "<1.9.0", "zendframework/zend-diactoros": "*" }, "provide": { @@ -2173,13 +2356,12 @@ "ext-dom": "*", "ext-gd": "*", "ext-libxml": "*", - "http-interop/http-factory-tests": "^0.8.0", - "laminas/laminas-coding-standard": "~1.0.0", - "php-http/psr7-integration-tests": "^1.1", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.1", - "psalm/plugin-phpunit": "^0.14.0", - "vimeo/psalm": "^4.3" + "http-interop/http-factory-tests": "^0.9.0", + "laminas/laminas-coding-standard": "^2.4.0", + "php-http/psr7-integration-tests": "^1.1.1", + "phpunit/phpunit": "^9.5.23", + "psalm/plugin-phpunit": "^0.17.0", + "vimeo/psalm": "^4.24.0" }, "type": "library", "extra": { @@ -2238,20 +2420,20 @@ "type": "community_bridge" } ], - "time": "2021-09-22T03:54:36+00:00" + "time": "2022-08-30T17:01:46+00:00" }, { "name": "monolog/monolog", - "version": "2.3.5", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", - "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", "shasum": "" }, "require": { @@ -2264,18 +2446,22 @@ "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", "graylog2/gelf-php": "^1.4.2", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.6.1", + "phpspec/prophecy": "^1.15", "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90@dev", - "swiftmailer/swiftmailer": "^5.3|^6.0" + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", @@ -2290,7 +2476,6 @@ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", "rollbar/rollbar": "Allow sending log messages to Rollbar", "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, @@ -2325,7 +2510,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.3.5" + "source": "https://github.com/Seldaek/monolog/tree/2.8.0" }, "funding": [ { @@ -2337,7 +2522,7 @@ "type": "tidelift" } ], - "time": "2021-10-01T21:08:31+00:00" + "time": "2022-07-24T11:55:47+00:00" }, { "name": "mtdowling/jmespath.php", @@ -2402,16 +2587,16 @@ }, { "name": "mustache/mustache", - "version": "v2.13.0", + "version": "v2.14.2", "source": { "type": "git", "url": "https://github.com/bobthecow/mustache.php.git", - "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4" + "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e95c5a008c23d3151d59ea72484d4f72049ab7f4", - "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4", + "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e62b7c3849d22ec55f3ec425507bf7968193a6cb", + "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb", "shasum": "" }, "require": { @@ -2446,34 +2631,35 @@ ], "support": { "issues": "https://github.com/bobthecow/mustache.php/issues", - "source": "https://github.com/bobthecow/mustache.php/tree/master" + "source": "https://github.com/bobthecow/mustache.php/tree/v2.14.2" }, - "time": "2019-11-23T21:40:31+00:00" + "time": "2022-08-23T13:07:01+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.10.2", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, - "replace": { - "myclabs/deep-copy": "self.version" + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" }, "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", "autoload": { @@ -2498,7 +2684,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" }, "funding": [ { @@ -2506,20 +2692,20 @@ "type": "tidelift" } ], - "time": "2020-11-13T09:40:50+00:00" + "time": "2022-03-03T13:19:32+00:00" }, { "name": "nikic/php-parser", - "version": "v4.13.0", + "version": "v4.15.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "50953a2691a922aa1769461637869a0a2faa3f53" + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53", - "reference": "50953a2691a922aa1769461637869a0a2faa3f53", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", "shasum": "" }, "require": { @@ -2560,22 +2746,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" }, - "time": "2021-09-20T12:20:58+00:00" + "time": "2022-09-04T07:30:47+00:00" }, { "name": "paragonie/constant_time_encoding", - "version": "v2.4.0", + "version": "v2.6.3", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c" + "reference": "58c3f47f650c94ec05a151692652a868995d2938" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c", - "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", "shasum": "" }, "require": { @@ -2629,7 +2815,7 @@ "issues": "https://github.com/paragonie/constant_time_encoding/issues", "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2020-12-06T15:14:20+00:00" + "time": "2022-06-14T06:56:20+00:00" }, { "name": "phar-io/manifest", @@ -2693,16 +2879,16 @@ }, { "name": "phar-io/version", - "version": "3.1.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "bae7c545bef187884426f042434e561ab1ddb182" + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", - "reference": "bae7c545bef187884426f042434e561ab1ddb182", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { @@ -2738,22 +2924,22 @@ "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/3.1.0" + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2021-02-23T14:00:09+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { "name": "php-webdriver/webdriver", - "version": "1.12.0", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "99d4856ed7dffcdf6a52eccd6551e83d8d557ceb" + "reference": "aad77b446a302985693fb339d40185be07c8f42d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/99d4856ed7dffcdf6a52eccd6551e83d8d557ceb", - "reference": "99d4856ed7dffcdf6a52eccd6551e83d8d557ceb", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/aad77b446a302985693fb339d40185be07c8f42d", + "reference": "aad77b446a302985693fb339d40185be07c8f42d", "shasum": "" }, "require": { @@ -2803,267 +2989,37 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.12.0" - }, - "time": "2021-10-14T09:30:02+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "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" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.2.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "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.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" - }, - "time": "2020-09-03T19:13:55+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "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.5.1" - }, - "time": "2021-10-02T14:08:47+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "1.14.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", - "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.13.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.14.0" - }, - "time": "2021-09-10T09:02:12+00:00" + "time": "2022-10-03T11:40:29+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.2.0", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e" + "reference": "5f7eb9724b0ae386b922f34b62b3b55fee3b26cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/dbc093d7af60eff5cd575d2ed761b15ed40bd08e", - "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/5f7eb9724b0ae386b922f34b62b3b55fee3b26cd", + "reference": "5f7eb9724b0ae386b922f34b62b3b55fee3b26cd", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.2 || ^8.0" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^9.5", "symfony/process": "^5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, "autoload": { "psr-4": { "PHPStan\\PhpDocParser\\": [ @@ -3078,29 +3034,29 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.2.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.9.0" }, - "time": "2021-09-16T20:46:02+00:00" + "time": "2022-10-06T11:32:36+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.7", + "version": "9.2.17", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218" + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d4c798ed8d51506800b441f7a13ecb0f76f12218", - "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8", + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.12.0", + "nikic/php-parser": "^4.14", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -3149,7 +3105,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.7" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17" }, "funding": [ { @@ -3157,20 +3113,20 @@ "type": "github" } ], - "time": "2021-09-17T05:39:03+00:00" + "time": "2022-08-30T12:24:04+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.5", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { @@ -3209,7 +3165,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -3217,7 +3173,7 @@ "type": "github" } ], - "time": "2020-09-28T05:57:25+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { "name": "phpunit/php-invoker", @@ -3402,16 +3358,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.10", + "version": "9.5.25", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" + "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", + "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", "shasum": "" }, "require": { @@ -3426,28 +3382,23 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.7", + "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", + "sebastian/comparator": "^4.0.8", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", + "sebastian/exporter": "^4.0.5", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^2.3.4", + "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { "ext-soap": "*", "ext-xdebug": "*" @@ -3489,19 +3440,23 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25" }, "funding": [ { - "url": "https://phpunit.de/donate.html", + "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2021-09-25T07:38:51+00:00" + "time": "2022-09-25T03:44:45+00:00" }, { "name": "psr/cache", @@ -3554,20 +3509,20 @@ }, { "name": "psr/container", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", "autoload": { @@ -3595,10 +3550,60 @@ "psr" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2019-01-08T18:20:26+00:00" }, { "name": "psr/http-client", @@ -4033,23 +4038,23 @@ }, { "name": "react/promise", - "version": "v2.8.0", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", + "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4067,7 +4072,23 @@ "authors": [ { "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com" + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", @@ -4077,9 +4098,19 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.8.0" + "source": "https://github.com/reactphp/promise/tree/v2.9.0" }, - "time": "2020-05-12T15:16:56+00:00" + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-02-11T10:27:51+00:00" }, { "name": "sebastian/cli-parser", @@ -4250,16 +4281,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -4312,7 +4343,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -4320,7 +4351,7 @@ "type": "github" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", @@ -4447,16 +4478,16 @@ }, { "name": "sebastian/environment", - "version": "5.1.3", + "version": "5.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", "shasum": "" }, "require": { @@ -4498,7 +4529,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" }, "funding": [ { @@ -4506,20 +4537,20 @@ "type": "github" } ], - "time": "2020-09-28T05:52:38+00:00" + "time": "2022-04-03T09:37:03+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.3", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { @@ -4568,14 +4599,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { @@ -4583,20 +4614,20 @@ "type": "github" } ], - "time": "2020-09-28T05:24:23+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.3", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", "shasum": "" }, "require": { @@ -4639,7 +4670,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" }, "funding": [ { @@ -4647,7 +4678,7 @@ "type": "github" } ], - "time": "2021-06-11T13:31:12+00:00" + "time": "2022-02-14T08:28:10+00:00" }, { "name": "sebastian/lines-of-code", @@ -4938,28 +4969,28 @@ }, { "name": "sebastian/type", - "version": "2.3.4", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -4982,7 +5013,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" }, "funding": [ { @@ -4990,7 +5021,7 @@ "type": "github" } ], - "time": "2021-06-15T12:49:02+00:00" + "time": "2022-09-12T14:47:03+00:00" }, { "name": "sebastian/version", @@ -5047,23 +5078,24 @@ }, { "name": "seld/jsonlint", - "version": "1.8.3", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" + "reference": "4211420d25eba80712bff236a98960ef68b866b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", + "reference": "4211420d25eba80712bff236a98960ef68b866b7", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" }, "bin": [ "bin/jsonlint" @@ -5094,7 +5126,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" + "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" }, "funding": [ { @@ -5106,20 +5138,20 @@ "type": "tidelift" } ], - "time": "2020-11-11T09:19:24+00:00" + "time": "2022-04-01T13:37:23+00:00" }, { "name": "seld/phar-utils", - "version": "1.1.2", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0" + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", "shasum": "" }, "require": { @@ -5152,22 +5184,83 @@ ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2" + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" + }, + "time": "2022-08-31T10:31:18+00:00" + }, + { + "name": "seld/signal-handler", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], + "support": { + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" }, - "time": "2021-08-19T21:01:38+00:00" + "time": "2022-07-20T18:31:45+00:00" }, { "name": "spomky-labs/otphp", - "version": "v10.0.1", + "version": "v10.0.3", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "f44cce5a9db4b8da410215d992110482c931232f" + "reference": "9784d9f7c790eed26e102d6c78f12c754036c366" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/f44cce5a9db4b8da410215d992110482c931232f", - "reference": "f44cce5a9db4b8da410215d992110482c931232f", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9784d9f7c790eed26e102d6c78f12c754036c366", + "reference": "9784d9f7c790eed26e102d6c78f12c754036c366", "shasum": "" }, "require": { @@ -5175,7 +5268,7 @@ "ext-mbstring": "*", "paragonie/constant_time_encoding": "^2.0", "php": "^7.2|^8.0", - "thecodingmachine/safe": "^0.1.14|^1.0" + "thecodingmachine/safe": "^0.1.14|^1.0|^2.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.0", @@ -5185,7 +5278,7 @@ "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^8.0", - "thecodingmachine/phpstan-safe-rule": "^1.0" + "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -5227,49 +5320,52 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.1" + "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.3" }, - "time": "2020-01-28T09:24:19+00:00" + "time": "2022-03-17T08:00:35+00:00" }, { "name": "symfony/console", - "version": "v4.4.30", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22" + "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a3f7189a0665ee33b50e9e228c46f50f5acbed22", - "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22", + "url": "https://api.github.com/repos/symfony/console/zipball/3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", + "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", - "symfony/process": "<3.3" + "symfony/process": "<4.4" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5302,8 +5398,14 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/console/tree/v4.4.30" + "source": "https://github.com/symfony/console/tree/v5.4.13" }, "funding": [ { @@ -5319,20 +5421,20 @@ "type": "tidelift" } ], - "time": "2021-08-25T19:27:26+00:00" + "time": "2022-08-26T13:50:20+00:00" }, { "name": "symfony/css-selector", - "version": "v5.3.4", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "7fb120adc7f600a59027775b224c13a33530dd90" + "reference": "c1681789f059ab756001052164726ae88512ae3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", - "reference": "7fb120adc7f600a59027775b224c13a33530dd90", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/c1681789f059ab756001052164726ae88512ae3d", + "reference": "c1681789f059ab756001052164726ae88512ae3d", "shasum": "" }, "require": { @@ -5369,7 +5471,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.3.4" + "source": "https://github.com/symfony/css-selector/tree/v5.4.11" }, "funding": [ { @@ -5385,20 +5487,20 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:38:00+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { @@ -5407,7 +5509,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5436,7 +5538,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -5452,28 +5554,29 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/dotenv", - "version": "v5.3.8", + "version": "v5.4.5", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "12888c9c46ac750ec5c1381db5bf3d534e7d70cb" + "reference": "83a2310904a4f5d4f42526227b5a578ac82232a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/12888c9c46ac750ec5c1381db5bf3d534e7d70cb", - "reference": "12888c9c46ac750ec5c1381db5bf3d534e7d70cb", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/83a2310904a4f5d4f42526227b5a578ac82232a9", + "reference": "83a2310904a4f5d4f42526227b5a578ac82232a9", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1" + "symfony/deprecation-contracts": "^2.1|^3" }, "require-dev": { - "symfony/process": "^4.4|^5.0" + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" }, "type": "library", "autoload": { @@ -5506,7 +5609,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.3.8" + "source": "https://github.com/symfony/dotenv/tree/v5.4.5" }, "funding": [ { @@ -5522,43 +5625,44 @@ "type": "tidelift" } ], - "time": "2021-07-29T06:18:06+00:00" + "time": "2022-02-15T17:04:12+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.30", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "2fe81680070043c4c80e7cedceb797e34f377bac" + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2fe81680070043c4c80e7cedceb797e34f377bac", - "reference": "2fe81680070043c4c80e7cedceb797e34f377bac", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/dependency-injection": "<3.4" + "symfony/dependency-injection": "<4.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" + "symfony/event-dispatcher-implementation": "2.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "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", - "symfony/stopwatch": "^3.4|^4.0|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/dependency-injection": "", @@ -5590,7 +5694,7 @@ "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.30" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" }, "funding": [ { @@ -5606,33 +5710,33 @@ "type": "tidelift" } ], - "time": "2021-08-04T20:31:23+00:00" + "time": "2022-05-05T16:45:39+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.9", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" }, "suggest": { - "psr/event-dispatcher": "", "symfony/event-dispatcher-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5669,7 +5773,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.9" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" }, "funding": [ { @@ -5685,25 +5789,26 @@ "type": "tidelift" } ], - "time": "2020-07-06T13:19:58+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/filesystem", - "version": "v5.3.4", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5732,7 +5837,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.4" + "source": "https://github.com/symfony/filesystem/tree/v5.4.13" }, "funding": [ { @@ -5748,24 +5853,25 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2022-09-21T19:53:16+00:00" }, { "name": "symfony/finder", - "version": "v5.3.7", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5794,7 +5900,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v5.4.11" }, "funding": [ { @@ -5810,33 +5916,36 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2022-07-29T07:37:50+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.3.7", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5" + "reference": "54be067587a4f2b7fffb7a699f9481ec3daf9379" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", - "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/54be067587a4f2b7fffb7a699f9481ec3daf9379", + "reference": "54be067587a4f2b7fffb7a699f9481ec3daf9379", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php80": "^1.16" }, "require-dev": { "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0" + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" }, "suggest": { "symfony/mime": "To use the file extension guesser" @@ -5867,7 +5976,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.3.7" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.13" }, "funding": [ { @@ -5883,25 +5992,25 @@ "type": "tidelift" } ], - "time": "2021-08-27T11:20:35+00:00" + "time": "2022-09-17T07:31:22+00:00" }, { "name": "symfony/mime", - "version": "v5.3.8", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "a756033d0a7e53db389618653ae991eba5a19a11" + "reference": "bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/a756033d0a7e53db389618653ae991eba5a19a11", - "reference": "a756033d0a7e53db389618653ae991eba5a19a11", + "url": "https://api.github.com/repos/symfony/mime/zipball/bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd", + "reference": "bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16" @@ -5915,10 +6024,10 @@ "require-dev": { "egulias/email-validator": "^2.1.10|^3.1", "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" + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.2|^6.0" }, "type": "library", "autoload": { @@ -5950,7 +6059,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.3.8" + "source": "https://github.com/symfony/mime/tree/v5.4.13" }, "funding": [ { @@ -5966,32 +6075,35 @@ "type": "tidelift" } ], - "time": "2021-09-10T12:30:38+00:00" + "time": "2022-09-01T18:18:29+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-ctype": "*" + }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6029,7 +6141,88 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.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": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "433d05519ce6990bf3530fba6957499d327395c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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 grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" }, "funding": [ { @@ -6045,20 +6238,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", - "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", "shasum": "" }, "require": { @@ -6072,7 +6265,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6116,7 +6309,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" }, "funding": [ { @@ -6132,20 +6325,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", "shasum": "" }, "require": { @@ -6157,7 +6350,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6200,7 +6393,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" }, "funding": [ { @@ -6216,32 +6409,35 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6280,7 +6476,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" }, "funding": [ { @@ -6296,20 +6492,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", + "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", "shasum": "" }, "require": { @@ -6318,7 +6514,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6356,7 +6552,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" }, "funding": [ { @@ -6372,20 +6568,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { @@ -6394,7 +6590,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6435,7 +6631,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -6451,20 +6647,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", "shasum": "" }, "require": { @@ -6473,7 +6669,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6518,7 +6714,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" }, "funding": [ { @@ -6534,20 +6730,20 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2022-05-10T07:21:04+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "e66119f3de95efc359483f810c4c3e6436279436" + "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", - "reference": "e66119f3de95efc359483f810c4c3e6436279436", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", "shasum": "" }, "require": { @@ -6556,7 +6752,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6597,7 +6793,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" }, "funding": [ { @@ -6613,24 +6809,24 @@ "type": "tidelift" } ], - "time": "2021-05-21T13:25:03+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/process", - "version": "v4.4.30", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d" + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", + "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -6659,7 +6855,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v4.4.30" + "source": "https://github.com/symfony/process/tree/v5.4.11" }, "funding": [ { @@ -6675,25 +6871,29 @@ "type": "tidelift" } ], - "time": "2021-08-04T20:31:23+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1" + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "suggest": { "symfony/service-implementation": "" @@ -6701,7 +6901,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6738,7 +6938,93 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "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": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "2900c668a32138a34118740de3e4d5a701801f53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/2900c668a32138a34118740de3e4d5a701801f53", + "reference": "2900c668a32138a34118740de3e4d5a701801f53", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.13" }, "funding": [ { @@ -6754,32 +7040,32 @@ "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2022-09-01T01:52:16+00:00" }, { "name": "symfony/yaml", - "version": "v5.3.6", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7" + "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", - "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", + "url": "https://api.github.com/repos/symfony/yaml/zipball/7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", + "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8" + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<4.4" + "symfony/console": "<5.3" }, "require-dev": { - "symfony/console": "^4.4|^5.0" + "symfony/console": "^5.3|^6.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -6813,7 +7099,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.3.6" + "source": "https://github.com/symfony/yaml/tree/v5.4.12" }, "funding": [ { @@ -6829,7 +7115,7 @@ "type": "tidelift" } ], - "time": "2021-07-29T06:20:01+00:00" + "time": "2022-08-02T15:52:22+00:00" }, { "name": "thecodingmachine/safe", @@ -7020,64 +7306,6 @@ ], "time": "2021-07-28T10:34:58+00:00" }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" - }, { "name": "weew/helpers-array", "version": "v1.3.1", @@ -7247,16 +7475,16 @@ }, { "name": "gitonomy/gitlib", - "version": "v1.3.2", + "version": "v1.3.7", "source": { "type": "git", "url": "https://github.com/gitonomy/gitlib.git", - "reference": "e73e439590b194b0b250b516b22a68c7116e2f21" + "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/e73e439590b194b0b250b516b22a68c7116e2f21", - "reference": "e73e439590b194b0b250b516b22a68c7116e2f21", + "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/00b57b79f02396aa4c7c163f76fe2bc48faebbb7", + "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7", "shasum": "" }, "require": { @@ -7267,6 +7495,7 @@ }, "require-dev": { "ext-fileinfo": "*", + "phpspec/prophecy": "^1.10.2", "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.20 || ^9.5.9", "psr/log": "^1.0" }, @@ -7287,25 +7516,29 @@ "authors": [ { "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk" + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { "name": "Julien Didier", - "email": "genzo.wm@gmail.com" + "email": "genzo.wm@gmail.com", + "homepage": "https://github.com/juliendidier" }, { "name": "Grégoire Pineau", - "email": "lyrixx@lyrixx.info" + "email": "lyrixx@lyrixx.info", + "homepage": "https://github.com/lyrixx" }, { "name": "Alexandre Salomé", - "email": "alexandre.salome@gmail.com" + "email": "alexandre.salome@gmail.com", + "homepage": "https://github.com/alexandresalome" } ], "description": "Library for accessing git", "support": { "issues": "https://github.com/gitonomy/gitlib/issues", - "source": "https://github.com/gitonomy/gitlib/tree/v1.3.2" + "source": "https://github.com/gitonomy/gitlib/tree/v1.3.7" }, "funding": [ { @@ -7313,27 +7546,27 @@ "type": "tidelift" } ], - "time": "2021-09-06T20:30:10+00:00" + "time": "2022-10-04T14:20:15+00:00" }, { "name": "pdepend/pdepend", - "version": "2.10.1", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "30452fdabb3dfca89f4bf977abc44adc5391e062" + "reference": "7a892d56ceafd804b4a2ecc85184640937ce9e84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/30452fdabb3dfca89f4bf977abc44adc5391e062", - "reference": "30452fdabb3dfca89f4bf977abc44adc5391e062", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/7a892d56ceafd804b4a2ecc85184640937ce9e84", + "reference": "7a892d56ceafd804b4a2ecc85184640937ce9e84", "shasum": "" }, "require": { "php": ">=5.3.7", - "symfony/config": "^2.3.0|^3|^4|^5", - "symfony/dependency-injection": "^2.3.0|^3|^4|^5", - "symfony/filesystem": "^2.3.0|^3|^4|^5" + "symfony/config": "^2.3.0|^3|^4|^5|^6.0", + "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0", + "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0" }, "require-dev": { "easy-doc/easy-doc": "0.0.0|^1.2.3", @@ -7362,7 +7595,7 @@ "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/2.10.1" + "source": "https://github.com/pdepend/pdepend/tree/2.12.1" }, "funding": [ { @@ -7370,20 +7603,20 @@ "type": "tidelift" } ], - "time": "2021-10-11T12:15:18+00:00" + "time": "2022-09-08T19:30:37+00:00" }, { "name": "php-coveralls/php-coveralls", - "version": "v2.4.3", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "909381bd40a17ae6e9076051f0d73293c1c091af" + "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/909381bd40a17ae6e9076051f0d73293c1c091af", - "reference": "909381bd40a17ae6e9076051f0d73293c1c091af", + "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9d8243bbf0e053333692857c98fab7cfba0d60a9", + "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9", "shasum": "" }, "require": { @@ -7391,14 +7624,14 @@ "ext-simplexml": "*", "guzzlehttp/guzzle": "^6.0 || ^7.0", "php": "^5.5 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0", - "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0", - "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0", - "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0" + "psr/log": "^1.0 || ^2.0", + "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", + "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", + "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0", + "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || ^8.0 || ^9.0", + "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || >=8.0 <8.5.29 || >=9.0 <9.5.23", "sanmai/phpunit-legacy-adapter": "^6.1 || ^8.0" }, "suggest": { @@ -7451,28 +7684,28 @@ ], "support": { "issues": "https://github.com/php-coveralls/php-coveralls/issues", - "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.4.3" + "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.5.3" }, - "time": "2020-12-24T09:17:03+00:00" + "time": "2022-09-12T20:47:09+00:00" }, { "name": "phpmd/phpmd", - "version": "2.10.2", + "version": "2.13.0", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "1bc74db7cf834662d83abebae265be11bb2eec3a" + "reference": "dad0228156856b3ad959992f9748514fa943f3e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/1bc74db7cf834662d83abebae265be11bb2eec3a", - "reference": "1bc74db7cf834662d83abebae265be11bb2eec3a", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/dad0228156856b3ad959992f9748514fa943f3e3", + "reference": "dad0228156856b3ad959992f9748514fa943f3e3", "shasum": "" }, "require": { - "composer/xdebug-handler": "^1.0 || ^2.0", + "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", "ext-xml": "*", - "pdepend/pdepend": "^2.10.0", + "pdepend/pdepend": "^2.12.1", "php": ">=5.3.9" }, "require-dev": { @@ -7528,7 +7761,7 @@ "support": { "irc": "irc://irc.freenode.org/phpmd", "issues": "https://github.com/phpmd/phpmd/issues", - "source": "https://github.com/phpmd/phpmd/tree/2.10.2" + "source": "https://github.com/phpmd/phpmd/tree/2.13.0" }, "funding": [ { @@ -7536,7 +7769,7 @@ "type": "tidelift" } ], - "time": "2021-07-22T09:56:23+00:00" + "time": "2022-09-10T08:44:15+00:00" }, { "name": "sebastian/phpcpd", @@ -7601,16 +7834,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.6.1", + "version": "3.6.2", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e" + "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/f268ca40d54617c6e06757f83f699775c9b3ff2e", - "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", + "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", "shasum": "" }, "require": { @@ -7653,26 +7886,26 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2021-10-11T04:00:11+00:00" + "time": "2021-12-12T21:44:58+00:00" }, { "name": "symfony/config", - "version": "v5.3.4", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "4268f3059c904c61636275182707f81645517a37" + "reference": "ec79e03125c1d2477e43dde8528535d90cc78379" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/4268f3059c904c61636275182707f81645517a37", - "reference": "4268f3059c904c61636275182707f81645517a37", + "url": "https://api.github.com/repos/symfony/config/zipball/ec79e03125c1d2477e43dde8528535d90cc78379", + "reference": "ec79e03125c1d2477e43dde8528535d90cc78379", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/filesystem": "^4.4|^5.0", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/filesystem": "^4.4|^5.0|^6.0", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-php80": "^1.16", "symfony/polyfill-php81": "^1.22" @@ -7681,11 +7914,11 @@ "symfony/finder": "<4.4" }, "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^4.4|^5.0" + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/yaml": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/yaml": "To use the yaml reference dumper" @@ -7716,7 +7949,7 @@ "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/v5.3.4" + "source": "https://github.com/symfony/config/tree/v5.4.11" }, "funding": [ { @@ -7732,27 +7965,28 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.3.8", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "e39c344e06a3ceab531ebeb6c077e6652c4a0829" + "reference": "24cf522668845391c0542bc1de496366072a6d0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e39c344e06a3ceab531ebeb6c077e6652c4a0829", - "reference": "e39c344e06a3ceab531ebeb6c077e6652c4a0829", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/24cf522668845391c0542bc1de496366072a6d0e", + "reference": "24cf522668845391c0542bc1de496366072a6d0e", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.1.1", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { @@ -7760,16 +7994,16 @@ "symfony/config": "<5.3", "symfony/finder": "<4.4", "symfony/proxy-manager-bridge": "<4.4", - "symfony/yaml": "<4.4" + "symfony/yaml": "<4.4.26" }, "provide": { "psr/container-implementation": "1.0", "symfony/service-implementation": "1.0|2.0" }, "require-dev": { - "symfony/config": "^5.3", - "symfony/expression-language": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" + "symfony/config": "^5.3|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4.26|^5.0|^6.0" }, "suggest": { "symfony/config": "", @@ -7804,7 +8038,7 @@ "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/v5.3.8" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.13" }, "funding": [ { @@ -7820,25 +8054,25 @@ "type": "tidelift" } ], - "time": "2021-09-21T20:52:44+00:00" + "time": "2022-08-30T19:10:13+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.3.4", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "b24c6a92c6db316fee69e38c80591e080e41536c" + "reference": "6df7a3effde34d81717bbef4591e5ffe32226d69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b24c6a92c6db316fee69e38c80591e080e41536c", - "reference": "b24c6a92c6db316fee69e38c80591e080e41536c", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/6df7a3effde34d81717bbef4591e5ffe32226d69", + "reference": "6df7a3effde34d81717bbef4591e5ffe32226d69", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/service-contracts": "^1.0|^2" + "symfony/service-contracts": "^1|^2|^3" }, "type": "library", "autoload": { @@ -7866,7 +8100,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.3.4" + "source": "https://github.com/symfony/stopwatch/tree/v5.4.13" }, "funding": [ { @@ -7882,7 +8116,7 @@ "type": "tidelift" } ], - "time": "2021-07-10T08:58:57+00:00" + "time": "2022-09-28T13:19:49+00:00" } ], "aliases": [], From 4b51d046f8c618dba8ae9bfa31c19f4317dc4fb7 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 11 Oct 2022 14:36:47 +0530 Subject: [PATCH 289/674] fix --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index 957f921aa..8ddef24ed 100644 --- a/composer.lock +++ b/composer.lock @@ -832,7 +832,7 @@ "shasum": "" }, "require": { - "php": "^7.4 | ^8.0", + "php": "^7.3 | ^8.0", "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | 10.0.x-dev" }, "require-dev": { @@ -1200,7 +1200,7 @@ "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": "^7.3 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.3", @@ -2340,7 +2340,7 @@ "shasum": "" }, "require": { - "php": "^7.4 || ~8.0.0 || ~8.1.0", + "php": "^7.3 || ~8.0.0 || ~8.1.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.0" }, @@ -3522,7 +3522,7 @@ "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": ">=7.3.0" }, "type": "library", "autoload": { From 477351962e3ea111455430c5dbbfb4be9e392d09 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 11 Oct 2022 15:05:33 +0530 Subject: [PATCH 290/674] Update composer.lock --- composer.lock | 2086 ++++++++++++++++++++++--------------------------- 1 file changed, 926 insertions(+), 1160 deletions(-) diff --git a/composer.lock b/composer.lock index 8ddef24ed..1f79506a8 100644 --- a/composer.lock +++ b/composer.lock @@ -69,16 +69,16 @@ }, { "name": "allure-framework/allure-php-api", - "version": "1.4.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-php-api.git", - "reference": "50507f482d490f114054f2281cca487db47fa2bd" + "reference": "f64b69afeff472c564a4e2379efb2b69c430ec5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-api/zipball/50507f482d490f114054f2281cca487db47fa2bd", - "reference": "50507f482d490f114054f2281cca487db47fa2bd", + "url": "https://api.github.com/repos/allure-framework/allure-php-api/zipball/f64b69afeff472c564a4e2379efb2b69c430ec5a", + "reference": "f64b69afeff472c564a4e2379efb2b69c430ec5a", "shasum": "" }, "require": { @@ -110,7 +110,7 @@ "role": "Developer" } ], - "description": "Allure PHP commons", + "description": "PHP API for Allure adapter", "homepage": "http://allure.qatools.ru/", "keywords": [ "allure", @@ -119,11 +119,11 @@ "report" ], "support": { - "email": "allure@qameta.io", + "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": "2021-11-15T13:15:20+00:00" + "time": "2021-03-26T14:32:27+00:00" }, { "name": "aws/aws-crt-php", @@ -177,16 +177,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.238.3", + "version": "3.198.7", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "14fb64c934614ea5a52c9931189f687f30b6ba3b" + "reference": "40197a954c9f49557a1b0d49e2a9bd6f7bf6adfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/14fb64c934614ea5a52c9931189f687f30b6ba3b", - "reference": "14fb64c934614ea5a52c9931189f687f30b6ba3b", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/40197a954c9f49557a1b0d49e2a9bd6f7bf6adfc", + "reference": "40197a954c9f49557a1b0d49e2a9bd6f7bf6adfc", "shasum": "" }, "require": { @@ -194,9 +194,9 @@ "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", + "guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0", "guzzlehttp/promises": "^1.4.0", - "guzzlehttp/psr7": "^1.8.5 || ^2.3", + "guzzlehttp/psr7": "^1.7.0", "mtdowling/jmespath.php": "^2.6", "php": ">=5.5" }, @@ -204,8 +204,6 @@ "andrewsville/php-token-reflection": "^1.4", "aws/aws-php-sns-message-validator": "~1.0", "behat/behat": "~3.0", - "composer/composer": "^1.10.22", - "dms/phpunit-arraysubset-asserts": "^0.4.0", "doctrine/cache": "~1.4", "ext-dom": "*", "ext-openssl": "*", @@ -213,11 +211,10 @@ "ext-sockets": "*", "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", + "phpunit/phpunit": "^4.8.35|^5.4.3", "psr/cache": "^1.0", "psr/simple-cache": "^1.0", - "sebastian/comparator": "^1.2.3 || ^4.0", - "yoast/phpunit-polyfills": "^1.0" + "sebastian/comparator": "^1.2.3" }, "suggest": { "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", @@ -265,22 +262,22 @@ "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.238.3" + "source": "https://github.com/aws/aws-sdk-php/tree/3.198.7" }, - "time": "2022-10-07T18:16:40+00:00" + "time": "2021-10-18T18:17:12+00:00" }, { "name": "beberlei/assert", - "version": "v3.3.2", + "version": "v3.3.1", "source": { "type": "git", "url": "https://github.com/beberlei/assert.git", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655" + "reference": "5e721d7e937ca3ba2cdec1e1adf195f9e5188372" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655", + "url": "https://api.github.com/repos/beberlei/assert/zipball/5e721d7e937ca3ba2cdec1e1adf195f9e5188372", + "reference": "5e721d7e937ca3ba2cdec1e1adf195f9e5188372", "shasum": "" }, "require": { @@ -332,9 +329,9 @@ ], "support": { "issues": "https://github.com/beberlei/assert/issues", - "source": "https://github.com/beberlei/assert/tree/v3.3.2" + "source": "https://github.com/beberlei/assert/tree/v3.3.1" }, - "time": "2021-12-16T21:41:27+00:00" + "time": "2021-04-18T20:11:03+00:00" }, { "name": "behat/gherkin", @@ -461,23 +458,23 @@ }, { "name": "codeception/codeception", - "version": "4.2.2", + "version": "4.1.22", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "b88014f3348c93f3df99dc6d0967b0dbfa804474" + "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/b88014f3348c93f3df99dc6d0967b0dbfa804474", - "reference": "b88014f3348c93f3df99dc6d0967b0dbfa804474", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", + "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", "shasum": "" }, "require": { "behat/gherkin": "^4.4.0", - "codeception/lib-asserts": "^1.0 | 2.0.*@dev", + "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 | ^4.0", + "codeception/stub": "^2.0 | ^3.0", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", @@ -490,11 +487,11 @@ "symfony/yaml": ">=2.7 <6.0" }, "require-dev": { - "codeception/module-asserts": "^1.0 | 2.0.*@dev", - "codeception/module-cli": "^1.0 | 2.0.*@dev", - "codeception/module-db": "^1.0 | 2.0.*@dev", - "codeception/module-filesystem": "^1.0 | 2.0.*@dev", - "codeception/module-phpbrowser": "^1.0 | 2.0.*@dev", + "codeception/module-asserts": "1.*@dev", + "codeception/module-cli": "1.*@dev", + "codeception/module-db": "1.*@dev", + "codeception/module-filesystem": "1.*@dev", + "codeception/module-phpbrowser": "1.*@dev", "codeception/specify": "~0.3", "codeception/util-universalframework": "*@dev", "monolog/monolog": "~1.8", @@ -517,9 +514,6 @@ "branch-alias": [] }, "autoload": { - "files": [ - "functions.php" - ], "psr-4": { "Codeception\\": "src/Codeception", "Codeception\\Extension\\": "ext" @@ -533,11 +527,11 @@ { "name": "Michael Bodnarchuk", "email": "davert@mail.ua", - "homepage": "https://codegyre.com" + "homepage": "http://codegyre.com" } ], "description": "BDD-style testing framework", - "homepage": "https://codeception.com/", + "homepage": "http://codeception.com/", "keywords": [ "BDD", "TDD", @@ -547,7 +541,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/4.2.2" + "source": "https://github.com/Codeception/Codeception/tree/4.1.22" }, "funding": [ { @@ -555,7 +549,7 @@ "type": "open_collective" } ], - "time": "2022-08-13T13:28:25+00:00" + "time": "2021-08-06T17:15:34+00:00" }, { "name": "codeception/lib-asserts", @@ -714,16 +708,16 @@ }, { "name": "codeception/module-webdriver", - "version": "1.4.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/Codeception/module-webdriver.git", - "reference": "e22ac7da756df659df6dd4fac2dff9c859e30131" + "reference": "baa18b7bf70aa024012f967b5ce5021e1faa9151" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/e22ac7da756df659df6dd4fac2dff9c859e30131", - "reference": "e22ac7da756df659df6dd4fac2dff9c859e30131", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/baa18b7bf70aa024012f967b5ce5021e1faa9151", + "reference": "baa18b7bf70aa024012f967b5ce5021e1faa9151", "shasum": "" }, "require": { @@ -764,22 +758,22 @@ ], "support": { "issues": "https://github.com/Codeception/module-webdriver/issues", - "source": "https://github.com/Codeception/module-webdriver/tree/1.4.1" + "source": "https://github.com/Codeception/module-webdriver/tree/1.4.0" }, - "time": "2022-09-12T05:09:51+00:00" + "time": "2021-09-02T12:01:02+00:00" }, { "name": "codeception/phpunit-wrapper", - "version": "9.0.9", + "version": "9.0.6", "source": { "type": "git", "url": "https://github.com/Codeception/phpunit-wrapper.git", - "reference": "7439a53ae367986e9c22b2ac00f9d7376bb2f8cf" + "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/7439a53ae367986e9c22b2ac00f9d7376bb2f8cf", - "reference": "7439a53ae367986e9c22b2ac00f9d7376bb2f8cf", + "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/b0c06abb3181eedca690170f7ed0fd26a70bfacc", + "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc", "shasum": "" }, "require": { @@ -813,30 +807,26 @@ "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.9" + "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.6" }, - "time": "2022-05-23T06:24:11+00:00" + "time": "2020-12-28T13:59:47+00:00" }, { "name": "codeception/stub", - "version": "4.0.2", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d" + "reference": "468dd5fe659f131fc997f5196aad87512f9b1304" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/18a148dacd293fc7b044042f5aa63a82b08bff5d", - "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/468dd5fe659f131fc997f5196aad87512f9b1304", + "reference": "468dd5fe659f131fc997f5196aad87512f9b1304", "shasum": "" }, "require": { - "php": "^7.3 | ^8.0", - "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | 10.0.x-dev" - }, - "require-dev": { - "consolidation/robo": "^3.0" + "phpunit/phpunit": "^8.4 | ^9.0" }, "type": "library", "autoload": { @@ -851,22 +841,22 @@ "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", "support": { "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/4.0.2" + "source": "https://github.com/Codeception/Stub/tree/3.7.0" }, - "time": "2022-01-31T19:25:15+00:00" + "time": "2020-07-03T15:54:43+00:00" }, { "name": "composer/ca-bundle", - "version": "1.3.3", + "version": "1.2.11", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" + "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", + "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", "shasum": "" }, "require": { @@ -913,80 +903,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.3" - }, - "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": "2022-07-20T07:14:26+00:00" - }, - { - "name": "composer/class-map-generator", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", - "shasum": "" - }, - "require": { - "composer/pcre": "^2 || ^3", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" - }, - "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\ClassMapGenerator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Utilities to scan PHP code and generate class maps.", - "keywords": [ - "classmap" - ], - "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + "source": "https://github.com/composer/ca-bundle/tree/1.2.11" }, "funding": [ { @@ -1002,51 +919,42 @@ "type": "tidelift" } ], - "time": "2022-06-19T11:31:27+00:00" + "time": "2021-09-25T20:32:43+00:00" }, { "name": "composer/composer", - "version": "2.4.2", + "version": "2.1.9", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9" + "reference": "e558c88f28d102d497adec4852802c0dc14c7077" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/7d887621e69a0311eb50aed4a16f7044b2b385b9", - "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9", + "url": "https://api.github.com/repos/composer/composer/zipball/e558c88f28d102d497adec4852802c0dc14c7077", + "reference": "e558c88f28d102d497adec4852802c0dc14c7077", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2 || ^3", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.5.7", - "composer/xdebug-handler": "^2.0.2 || ^3.0.3", + "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^2.0", "justinrainbow/json-schema": "^5.2.11", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8", + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0", + "react/promise": "^1.2 || ^2.7", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.2", - "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/polyfill-php73": "^1.24", - "symfony/polyfill-php80": "^1.24", - "symfony/process": "^5.4 || ^6.0" + "seld/phar-utils": "^1.0", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" }, "require-dev": { - "phpstan/phpstan": "^1.4.1", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1", - "phpstan/phpstan-symfony": "^1.2.10", - "symfony/phpunit-bridge": "^6.0" + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -1059,12 +967,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" - }, - "phpstan": { - "includes": [ - "phpstan/rules.neon" - ] + "dev-master": "2.1-dev" } }, "autoload": { @@ -1098,7 +1001,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.4.2" + "source": "https://github.com/composer/composer/tree/2.1.9" }, "funding": [ { @@ -1114,7 +1017,7 @@ "type": "tidelift" } ], - "time": "2022-09-14T14:11:15+00:00" + "time": "2021-10-05T07:47:38+00:00" }, { "name": "composer/metadata-minifier", @@ -1185,96 +1088,25 @@ ], "time": "2021-04-07T13:37:33+00:00" }, - { - "name": "composer/pcre", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" - }, - "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": "2022-02-25T20:21:48+00:00" - }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.2.5", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", + "phpstan/phpstan": "^0.12.54", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", @@ -1319,7 +1151,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.2.5" }, "funding": [ { @@ -1335,28 +1167,27 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2021-05-24T12:41:47+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.7", + "version": "1.5.5", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "c848241796da2abf65837d51dce1fae55a960149" + "reference": "de30328a7af8680efdc03e396aad24befd513200" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", - "reference": "c848241796da2abf65837d51dce1fae55a960149", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", + "reference": "de30328a7af8680efdc03e396aad24befd513200", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" }, "type": "library", "extra": { @@ -1399,7 +1230,7 @@ "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.7" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.5" }, "funding": [ { @@ -1415,31 +1246,29 @@ "type": "tidelift" } ], - "time": "2022-05-23T07:37:50+00:00" + "time": "2020-12-03T16:04:16+00:00" }, { "name": "composer/xdebug-handler", - "version": "3.0.3", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" + "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", + "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", "shasum": "" }, "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", + "php": "^5.3.2 || ^7.0 || ^8.0", "psr/log": "^1 || ^2 || ^3" }, "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "autoload": { @@ -1465,7 +1294,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" }, "funding": [ { @@ -1481,29 +1310,30 @@ "type": "tidelift" } ], - "time": "2022-02-25T21:32:43+00:00" + "time": "2021-07-31T17:03:58+00:00" }, { "name": "csharpru/vault-php", - "version": "4.3.1", + "version": "4.2.1", "source": { "type": "git", "url": "https://github.com/CSharpRU/vault-php.git", - "reference": "918bfffe85d3b290e1bf667b5f14e521fdc0063c" + "reference": "89b393ecf65f61a44d3a1872547f65085982b481" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CSharpRU/vault-php/zipball/918bfffe85d3b290e1bf667b5f14e521fdc0063c", - "reference": "918bfffe85d3b290e1bf667b5f14e521fdc0063c", + "url": "https://api.github.com/repos/CSharpRU/vault-php/zipball/89b393ecf65f61a44d3a1872547f65085982b481", + "reference": "89b393ecf65f61a44d3a1872547f65085982b481", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.2 || ^8.0", - "psr/cache": "^1.0|^2.0|^3.0", + "psr/cache": "^1.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", - "psr/log": "^1.0|^2.0|^3.0" + "psr/log": "^1.0", + "weew/helpers-array": "^1.3" }, "require-dev": { "alextartan/guzzle-psr18-adapter": "^1.2 || ^2.0", @@ -1541,22 +1371,22 @@ ], "support": { "issues": "https://github.com/CSharpRU/vault-php/issues", - "source": "https://github.com/CSharpRU/vault-php/tree/4.3.1" + "source": "https://github.com/CSharpRU/vault-php/tree/4.2.1" }, - "time": "2022-04-04T08:31:44+00:00" + "time": "2021-05-21T06:39:35+00:00" }, { "name": "doctrine/annotations", - "version": "1.13.3", + "version": "1.13.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "648b0343343565c4a056bfc8392201385e8d89f0" + "reference": "5b668aef16090008790395c02c893b1ba13f7e08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0", - "reference": "648b0343343565c4a056bfc8392201385e8d89f0", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", + "reference": "5b668aef16090008790395c02c893b1ba13f7e08", "shasum": "" }, "require": { @@ -1568,10 +1398,9 @@ "require-dev": { "doctrine/cache": "^1.11 || ^2.0", "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^1.4.10 || ^1.8.0", + "phpstan/phpstan": "^0.12.20", "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2", - "vimeo/psalm": "^4.10" + "symfony/cache": "^4.4 || ^5.2" }, "type": "library", "autoload": { @@ -1614,36 +1443,35 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.3" + "source": "https://github.com/doctrine/annotations/tree/1.13.2" }, - "time": "2022-07-02T10:48:51+00:00" + "time": "2021-08-05T19:00:23+00:00" }, { "name": "doctrine/instantiator", - "version": "1.4.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9", + "doctrine/coding-standard": "^8.0", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" + "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", "autoload": { @@ -1670,7 +1498,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" }, "funding": [ { @@ -1686,32 +1514,36 @@ "type": "tidelift" } ], - "time": "2022-03-03T08:28:38+00:00" + "time": "2020-11-10T18:47:58+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.3", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, "autoload": { "psr-4": { "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" @@ -1746,7 +1578,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" + "source": "https://github.com/doctrine/lexer/tree/1.2.1" }, "funding": [ { @@ -1762,38 +1594,38 @@ "type": "tidelift" } ], - "time": "2022-02-28T11:07:21+00:00" + "time": "2020-05-25T17:44:05+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.5.0", + "version": "7.4.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" + "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", - "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/868b3571a039f0ebc11ac8f344f4080babe2cb94", + "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.9 || ^2.4", + "guzzlehttp/psr7": "^1.8.3 || ^2.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" + "symfony/deprecation-contracts": "^2.2" }, "provide": { "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.4.1", "ext-curl": "*", "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "phpunit/phpunit": "^8.5.5 || ^9.3.5", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -1803,12 +1635,8 @@ }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - }, "branch-alias": { - "dev-master": "7.5-dev" + "dev-master": "7.4-dev" } }, "autoload": { @@ -1874,7 +1702,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.5.0" + "source": "https://github.com/guzzle/guzzle/tree/7.4.0" }, "funding": [ { @@ -1890,20 +1718,20 @@ "type": "tidelift" } ], - "time": "2022-08-28T15:39:27+00:00" + "time": "2021-10-18T09:52:00+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.2", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "b94b2807d85443f9719887892882d0329d1e2598" + "reference": "136a635e2b4a49b9d79e9c8fee267ffb257fdba0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", - "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "url": "https://api.github.com/repos/guzzle/promises/zipball/136a635e2b4a49b9d79e9c8fee267ffb257fdba0", + "reference": "136a635e2b4a49b9d79e9c8fee267ffb257fdba0", "shasum": "" }, "require": { @@ -1958,7 +1786,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.2" + "source": "https://github.com/guzzle/promises/tree/1.5.0" }, "funding": [ { @@ -1974,51 +1802,47 @@ "type": "tidelift" } ], - "time": "2022-08-28T14:55:35+00:00" + "time": "2021-10-07T13:05:22+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.4.1", + "version": "1.8.3", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379" + "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/69568e4293f4fa993f3b0e51c9723e1e17c41379", - "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/1afdd860a2566ed3c2b0b4a3de6e23434a79ec85", + "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", - "ralouphie/getallheaders": "^3.0" + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" }, "provide": { - "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - }, "branch-alias": { - "dev-master": "2.4-dev" + "dev-master": "1.7-dev" } }, "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { "GuzzleHttp\\Psr7\\": "src/" } @@ -2057,11 +1881,6 @@ "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", @@ -2077,7 +1896,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.4.1" + "source": "https://github.com/guzzle/psr7/tree/1.8.3" }, "funding": [ { @@ -2093,20 +1912,20 @@ "type": "tidelift" } ], - "time": "2022-08-28T14:45:39+00:00" + "time": "2021-10-05T13:56:00+00:00" }, { "name": "jms/metadata", - "version": "2.7.0", + "version": "2.5.1", "source": { "type": "git", "url": "https://github.com/schmittjoh/metadata.git", - "reference": "283c714831d272d78ddd6e52e08ac16d76be30fd" + "reference": "a995e6cef6d6f56a6226e1616a519630e2ef0aeb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/283c714831d272d78ddd6e52e08ac16d76be30fd", - "reference": "283c714831d272d78ddd6e52e08ac16d76be30fd", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/a995e6cef6d6f56a6226e1616a519630e2ef0aeb", + "reference": "a995e6cef6d6f56a6226e1616a519630e2ef0aeb", "shasum": "" }, "require": { @@ -2155,29 +1974,29 @@ ], "support": { "issues": "https://github.com/schmittjoh/metadata/issues", - "source": "https://github.com/schmittjoh/metadata/tree/2.7.0" + "source": "https://github.com/schmittjoh/metadata/tree/2.5.1" }, - "time": "2022-09-13T19:18:27+00:00" + "time": "2021-08-04T19:32:08+00:00" }, { "name": "jms/serializer", - "version": "3.18.2", + "version": "3.15.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "329e29c323fb1e5c65b4ae4c77ba747678755a6c" + "reference": "9d6d9b81889904603383722ca0cd7f7999baeebc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/329e29c323fb1e5c65b4ae4c77ba747678755a6c", - "reference": "329e29c323fb1e5c65b4ae4c77ba747678755a6c", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/9d6d9b81889904603383722ca0cd7f7999baeebc", + "reference": "9d6d9b81889904603383722ca0cd7f7999baeebc", "shasum": "" }, "require": { - "doctrine/annotations": "^1.13", + "doctrine/annotations": "^1.10.4", "doctrine/instantiator": "^1.0.3", "doctrine/lexer": "^1.1", - "jms/metadata": "^2.6", + "jms/metadata": "^2.0", "php": "^7.2||^8.0", "phpstan/phpdoc-parser": "^0.4 || ^0.5 || ^1.0" }, @@ -2189,16 +2008,14 @@ "ext-pdo_sqlite": "*", "jackalope/jackalope-doctrine-dbal": "^1.1.5", "ocramius/proxy-manager": "^1.0|^2.0", - "phpbench/phpbench": "^1.0", - "phpstan/phpstan": "^1.0.2", - "phpunit/phpunit": "^8.5.21||^9.0", + "phpstan/phpstan": "^0.12.65", + "phpunit/phpunit": "^8.0||^9.0", "psr/container": "^1.0", "symfony/dependency-injection": "^3.0|^4.0|^5.0|^6.0", - "symfony/expression-language": "^3.2|^4.0|^5.0|^6.0", + "symfony/expression-language": "^3.0|^4.0|^5.0|^6.0", "symfony/filesystem": "^3.0|^4.0|^5.0|^6.0", "symfony/form": "^3.0|^4.0|^5.0|^6.0", "symfony/translation": "^3.0|^4.0|^5.0|^6.0", - "symfony/uid": "^5.1|^6.0", "symfony/validator": "^3.1.9|^4.0|^5.0|^6.0", "symfony/yaml": "^3.3|^4.0|^5.0|^6.0", "twig/twig": "~1.34|~2.4|^3.0" @@ -2206,7 +2023,6 @@ "suggest": { "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", "symfony/cache": "Required if you like to use cache functionality.", - "symfony/uid": "Required if you'd like to serialize UID objects.", "symfony/yaml": "Required if you'd like to use the YAML metadata format." }, "type": "library", @@ -2245,7 +2061,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/3.18.2" + "source": "https://github.com/schmittjoh/serializer/tree/3.15.0" }, "funding": [ { @@ -2253,20 +2069,20 @@ "type": "github" } ], - "time": "2022-09-12T08:40:16+00:00" + "time": "2021-10-14T20:02:48+00:00" }, { "name": "justinrainbow/json-schema", - "version": "5.2.12", + "version": "5.2.11", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", + "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", "shasum": "" }, "require": { @@ -2321,22 +2137,22 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" }, - "time": "2022-04-13T08:02:27+00:00" + "time": "2021-07-22T09:24:00+00:00" }, { "name": "laminas/laminas-diactoros", - "version": "2.17.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "5b32597aa46b83c8b85bb1cf9a6ed4fe7dd980c5" + "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/5b32597aa46b83c8b85bb1cf9a6ed4fe7dd980c5", - "reference": "5b32597aa46b83c8b85bb1cf9a6ed4fe7dd980c5", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/0c26ef1d95b6d7e6e3943a243ba3dc0797227199", + "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199", "shasum": "" }, "require": { @@ -2345,6 +2161,7 @@ "psr/http-message": "^1.0" }, "conflict": { + "phpspec/prophecy": "<1.9.0", "zendframework/zend-diactoros": "*" }, "provide": { @@ -2356,12 +2173,13 @@ "ext-dom": "*", "ext-gd": "*", "ext-libxml": "*", - "http-interop/http-factory-tests": "^0.9.0", - "laminas/laminas-coding-standard": "^2.4.0", - "php-http/psr7-integration-tests": "^1.1.1", - "phpunit/phpunit": "^9.5.23", - "psalm/plugin-phpunit": "^0.17.0", - "vimeo/psalm": "^4.24.0" + "http-interop/http-factory-tests": "^0.8.0", + "laminas/laminas-coding-standard": "~1.0.0", + "php-http/psr7-integration-tests": "^1.1", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.1", + "psalm/plugin-phpunit": "^0.14.0", + "vimeo/psalm": "^4.3" }, "type": "library", "extra": { @@ -2420,20 +2238,20 @@ "type": "community_bridge" } ], - "time": "2022-08-30T17:01:46+00:00" + "time": "2021-09-22T03:54:36+00:00" }, { "name": "monolog/monolog", - "version": "2.8.0", + "version": "2.3.5", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", - "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", "shasum": "" }, "require": { @@ -2446,22 +2264,18 @@ "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7 || ^8", - "ext-json": "*", + "elasticsearch/elasticsearch": "^7", "graylog2/gelf-php": "^1.4.2", - "guzzlehttp/guzzle": "^7.4", - "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpspec/prophecy": "^1.15", + "php-console/php-console": "^3.1.3", + "phpspec/prophecy": "^1.6.1", "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", - "predis/predis": "^1.1 || ^2.0", - "rollbar/rollbar": "^1.3 || ^2 || ^3", - "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", - "symfony/mailer": "^5.4 || ^6", - "symfony/mime": "^5.4 || ^6" + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90@dev", + "swiftmailer/swiftmailer": "^5.3|^6.0" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", @@ -2476,6 +2290,7 @@ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", "rollbar/rollbar": "Allow sending log messages to Rollbar", "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, @@ -2510,7 +2325,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.8.0" + "source": "https://github.com/Seldaek/monolog/tree/2.3.5" }, "funding": [ { @@ -2522,7 +2337,7 @@ "type": "tidelift" } ], - "time": "2022-07-24T11:55:47+00:00" + "time": "2021-10-01T21:08:31+00:00" }, { "name": "mtdowling/jmespath.php", @@ -2587,16 +2402,16 @@ }, { "name": "mustache/mustache", - "version": "v2.14.2", + "version": "v2.13.0", "source": { "type": "git", "url": "https://github.com/bobthecow/mustache.php.git", - "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb" + "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e62b7c3849d22ec55f3ec425507bf7968193a6cb", - "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb", + "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e95c5a008c23d3151d59ea72484d4f72049ab7f4", + "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4", "shasum": "" }, "require": { @@ -2631,35 +2446,34 @@ ], "support": { "issues": "https://github.com/bobthecow/mustache.php/issues", - "source": "https://github.com/bobthecow/mustache.php/tree/v2.14.2" + "source": "https://github.com/bobthecow/mustache.php/tree/master" }, - "time": "2022-08-23T13:07:01+00:00" + "time": "2019-11-23T21:40:31+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.10.2", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "replace": { + "myclabs/deep-copy": "self.version" }, "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" }, "type": "library", "autoload": { @@ -2684,7 +2498,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" }, "funding": [ { @@ -2692,20 +2506,20 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" + "time": "2020-11-13T09:40:50+00:00" }, { "name": "nikic/php-parser", - "version": "v4.15.1", + "version": "v4.13.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" + "reference": "50953a2691a922aa1769461637869a0a2faa3f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53", + "reference": "50953a2691a922aa1769461637869a0a2faa3f53", "shasum": "" }, "require": { @@ -2746,22 +2560,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0" }, - "time": "2022-09-04T07:30:47+00:00" + "time": "2021-09-20T12:20:58+00:00" }, { "name": "paragonie/constant_time_encoding", - "version": "v2.6.3", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "58c3f47f650c94ec05a151692652a868995d2938" + "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", - "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c", + "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c", "shasum": "" }, "require": { @@ -2815,7 +2629,7 @@ "issues": "https://github.com/paragonie/constant_time_encoding/issues", "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2022-06-14T06:56:20+00:00" + "time": "2020-12-06T15:14:20+00:00" }, { "name": "phar-io/manifest", @@ -2879,16 +2693,16 @@ }, { "name": "phar-io/version", - "version": "3.2.1", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + "reference": "bae7c545bef187884426f042434e561ab1ddb182" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", + "reference": "bae7c545bef187884426f042434e561ab1ddb182", "shasum": "" }, "require": { @@ -2924,22 +2738,22 @@ "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/3.2.1" + "source": "https://github.com/phar-io/version/tree/3.1.0" }, - "time": "2022-02-21T01:04:05+00:00" + "time": "2021-02-23T14:00:09+00:00" }, { "name": "php-webdriver/webdriver", - "version": "1.13.0", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "aad77b446a302985693fb339d40185be07c8f42d" + "reference": "99d4856ed7dffcdf6a52eccd6551e83d8d557ceb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/aad77b446a302985693fb339d40185be07c8f42d", - "reference": "aad77b446a302985693fb339d40185be07c8f42d", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/99d4856ed7dffcdf6a52eccd6551e83d8d557ceb", + "reference": "99d4856ed7dffcdf6a52eccd6551e83d8d557ceb", "shasum": "" }, "require": { @@ -2989,37 +2803,267 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.13.0" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.12.0" + }, + "time": "2021-10-14T09:30:02+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "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" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.2.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "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.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + }, + "time": "2020-09-03T19:13:55+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } }, - "time": "2022-10-03T11:40:29+00:00" + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "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.5.1" + }, + "time": "2021-10-02T14:08:47+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.14.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2", + "php": "^7.2 || ~8.0, <8.2", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^6.0 || ^7.0", + "phpunit/phpunit": "^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.14.0" + }, + "time": "2021-09-10T09:02:12+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.9.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "5f7eb9724b0ae386b922f34b62b3b55fee3b26cd" + "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/5f7eb9724b0ae386b922f34b62b3b55fee3b26cd", - "reference": "5f7eb9724b0ae386b922f34b62b3b55fee3b26cd", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/dbc093d7af60eff5cd575d2ed761b15ed40bd08e", + "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan": "^1.0", "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^9.5", "symfony/process": "^5.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, "autoload": { "psr-4": { "PHPStan\\PhpDocParser\\": [ @@ -3034,29 +3078,29 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.9.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.2.0" }, - "time": "2022-10-06T11:32:36+00:00" + "time": "2021-09-16T20:46:02+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.17", + "version": "9.2.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" + "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8", - "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d4c798ed8d51506800b441f7a13ecb0f76f12218", + "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.14", + "nikic/php-parser": "^4.12.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -3105,7 +3149,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.7" }, "funding": [ { @@ -3113,20 +3157,20 @@ "type": "github" } ], - "time": "2022-08-30T12:24:04+00:00" + "time": "2021-09-17T05:39:03+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.6", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", + "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", "shasum": "" }, "require": { @@ -3165,7 +3209,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" }, "funding": [ { @@ -3173,7 +3217,7 @@ "type": "github" } ], - "time": "2021-12-02T12:48:52+00:00" + "time": "2020-09-28T05:57:25+00:00" }, { "name": "phpunit/php-invoker", @@ -3358,16 +3402,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.25", + "version": "9.5.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d" + "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", - "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", "shasum": "" }, "require": { @@ -3382,23 +3426,28 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", + "phpspec/prophecy": "^1.12.1", + "phpunit/php-code-coverage": "^9.2.7", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", + "sebastian/comparator": "^4.0.5", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", + "sebastian/exporter": "^4.0.3", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", + "sebastian/type": "^2.3.4", "sebastian/version": "^3.0.2" }, + "require-dev": { + "ext-pdo": "*", + "phpspec/prophecy-phpunit": "^2.0.1" + }, "suggest": { "ext-soap": "*", "ext-xdebug": "*" @@ -3440,23 +3489,19 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", + "url": "https://phpunit.de/donate.html", "type": "custom" }, { "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" } ], - "time": "2022-09-25T03:44:45+00:00" + "time": "2021-09-25T07:38:51+00:00" }, { "name": "psr/cache", @@ -3509,20 +3554,20 @@ }, { "name": "psr/container", - "version": "1.1.2", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": ">=7.3.0" + "php": ">=7.2.0" }, "type": "library", "autoload": { @@ -3543,67 +3588,17 @@ "description": "Common Container Interface (PHP FIG PSR-11)", "homepage": "https://github.com/php-fig/container", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" - }, - "time": "2021-11-05T16:50:12+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2019-01-08T18:20:26+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { "name": "psr/http-client", @@ -4038,23 +4033,23 @@ }, { "name": "react/promise", - "version": "v2.9.0", + "version": "v2.8.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", + "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4072,23 +4067,7 @@ "authors": [ { "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "email": "jsorgalla@gmail.com" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", @@ -4098,19 +4077,9 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" + "source": "https://github.com/reactphp/promise/tree/v2.8.0" }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-11T10:27:51+00:00" + "time": "2020-05-12T15:16:56+00:00" }, { "name": "sebastian/cli-parser", @@ -4281,16 +4250,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "55f4261989e546dc112258c7a75935a81a7ce382" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382", "shasum": "" }, "require": { @@ -4343,7 +4312,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" }, "funding": [ { @@ -4351,7 +4320,7 @@ "type": "github" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2020-10-26T15:49:45+00:00" }, { "name": "sebastian/complexity", @@ -4478,16 +4447,16 @@ }, { "name": "sebastian/environment", - "version": "5.1.4", + "version": "5.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + "reference": "388b6ced16caa751030f6a69e588299fa09200ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", + "reference": "388b6ced16caa751030f6a69e588299fa09200ac", "shasum": "" }, "require": { @@ -4529,7 +4498,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" }, "funding": [ { @@ -4537,20 +4506,20 @@ "type": "github" } ], - "time": "2022-04-03T09:37:03+00:00" + "time": "2020-09-28T05:52:38+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "4.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", + "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", "shasum": "" }, "require": { @@ -4599,14 +4568,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", + "homepage": "http://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" }, "funding": [ { @@ -4614,20 +4583,20 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2020-09-28T05:24:23+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", "shasum": "" }, "require": { @@ -4670,7 +4639,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" }, "funding": [ { @@ -4678,7 +4647,7 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2021-06-11T13:31:12+00:00" }, { "name": "sebastian/lines-of-code", @@ -4969,28 +4938,28 @@ }, { "name": "sebastian/type", - "version": "3.2.0", + "version": "2.3.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", - "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "2.3-dev" } }, "autoload": { @@ -5013,7 +4982,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" + "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" }, "funding": [ { @@ -5021,7 +4990,7 @@ "type": "github" } ], - "time": "2022-09-12T14:47:03+00:00" + "time": "2021-06-15T12:49:02+00:00" }, { "name": "sebastian/version", @@ -5078,24 +5047,23 @@ }, { "name": "seld/jsonlint", - "version": "1.9.0", + "version": "1.8.3", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "bin": [ "bin/jsonlint" @@ -5126,7 +5094,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" }, "funding": [ { @@ -5138,20 +5106,20 @@ "type": "tidelift" } ], - "time": "2022-04-01T13:37:23+00:00" + "time": "2020-11-11T09:19:24+00:00" }, { "name": "seld/phar-utils", - "version": "1.2.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0", "shasum": "" }, "require": { @@ -5184,83 +5152,22 @@ ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" - }, - "time": "2022-08-31T10:31:18+00:00" - }, - { - "name": "seld/signal-handler", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "require-dev": { - "phpstan/phpstan": "^1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "psr/log": "^1 || ^2 || ^3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\Signal\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", - "keywords": [ - "posix", - "sigint", - "signal", - "sigterm", - "unix" - ], - "support": { - "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" + "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2" }, - "time": "2022-07-20T18:31:45+00:00" + "time": "2021-08-19T21:01:38+00:00" }, { "name": "spomky-labs/otphp", - "version": "v10.0.3", + "version": "v10.0.1", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "9784d9f7c790eed26e102d6c78f12c754036c366" + "reference": "f44cce5a9db4b8da410215d992110482c931232f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9784d9f7c790eed26e102d6c78f12c754036c366", - "reference": "9784d9f7c790eed26e102d6c78f12c754036c366", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/f44cce5a9db4b8da410215d992110482c931232f", + "reference": "f44cce5a9db4b8da410215d992110482c931232f", "shasum": "" }, "require": { @@ -5268,7 +5175,7 @@ "ext-mbstring": "*", "paragonie/constant_time_encoding": "^2.0", "php": "^7.2|^8.0", - "thecodingmachine/safe": "^0.1.14|^1.0|^2.0" + "thecodingmachine/safe": "^0.1.14|^1.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.0", @@ -5278,7 +5185,7 @@ "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^8.0", - "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0" + "thecodingmachine/phpstan-safe-rule": "^1.0" }, "type": "library", "extra": { @@ -5320,52 +5227,49 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.3" + "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.1" }, - "time": "2022-03-17T08:00:35+00:00" + "time": "2020-01-28T09:24:19+00:00" }, { "name": "symfony/console", - "version": "v5.4.13", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be" + "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", - "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", + "url": "https://api.github.com/repos/symfony/console/zipball/a3f7189a0665ee33b50e9e228c46f50f5acbed22", + "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=7.1.3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php73": "^1.8", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" + "symfony/service-contracts": "^1.1|^2" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/process": "<3.3" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5398,14 +5302,8 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.13" + "source": "https://github.com/symfony/console/tree/v4.4.30" }, "funding": [ { @@ -5421,20 +5319,20 @@ "type": "tidelift" } ], - "time": "2022-08-26T13:50:20+00:00" + "time": "2021-08-25T19:27:26+00:00" }, { "name": "symfony/css-selector", - "version": "v5.4.11", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "c1681789f059ab756001052164726ae88512ae3d" + "reference": "7fb120adc7f600a59027775b224c13a33530dd90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/c1681789f059ab756001052164726ae88512ae3d", - "reference": "c1681789f059ab756001052164726ae88512ae3d", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", + "reference": "7fb120adc7f600a59027775b224c13a33530dd90", "shasum": "" }, "require": { @@ -5471,7 +5369,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.4.11" + "source": "https://github.com/symfony/css-selector/tree/v5.3.4" }, "funding": [ { @@ -5487,20 +5385,20 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2021-07-21T12:38:00+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { @@ -5509,7 +5407,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5538,7 +5436,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" }, "funding": [ { @@ -5554,29 +5452,28 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/dotenv", - "version": "v5.4.5", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "83a2310904a4f5d4f42526227b5a578ac82232a9" + "reference": "12888c9c46ac750ec5c1381db5bf3d534e7d70cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/83a2310904a4f5d4f42526227b5a578ac82232a9", - "reference": "83a2310904a4f5d4f42526227b5a578ac82232a9", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/12888c9c46ac750ec5c1381db5bf3d534e7d70cb", + "reference": "12888c9c46ac750ec5c1381db5bf3d534e7d70cb", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3" + "symfony/deprecation-contracts": "^2.1" }, "require-dev": { - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0" + "symfony/process": "^4.4|^5.0" }, "type": "library", "autoload": { @@ -5609,7 +5506,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.4.5" + "source": "https://github.com/symfony/dotenv/tree/v5.3.8" }, "funding": [ { @@ -5625,44 +5522,43 @@ "type": "tidelift" } ], - "time": "2022-02-15T17:04:12+00:00" + "time": "2021-07-29T06:18:06+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.9", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" + "reference": "2fe81680070043c4c80e7cedceb797e34f377bac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2fe81680070043c4c80e7cedceb797e34f377bac", + "reference": "2fe81680070043c4c80e7cedceb797e34f377bac", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher-contracts": "^2|^3", + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1", "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/dependency-injection": "<4.4" + "symfony/dependency-injection": "<3.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" + "symfony/event-dispatcher-implementation": "1.1" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^4.4|^5.0|^6.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", + "symfony/stopwatch": "^3.4|^4.0|^5.0" }, "suggest": { "symfony/dependency-injection": "", @@ -5694,7 +5590,7 @@ "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/v5.4.9" + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.30" }, "funding": [ { @@ -5710,33 +5606,33 @@ "type": "tidelift" } ], - "time": "2022-05-05T16:45:39+00:00" + "time": "2021-08-04T20:31:23+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.2", + "version": "v1.1.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/event-dispatcher": "^1" + "php": ">=7.1.3" }, "suggest": { + "psr/event-dispatcher": "", "symfony/event-dispatcher-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-master": "1.1-dev" }, "thanks": { "name": "symfony/contracts", @@ -5773,7 +5669,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.9" }, "funding": [ { @@ -5789,26 +5685,25 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2020-07-06T13:19:58+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.13", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", - "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5837,7 +5732,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.13" + "source": "https://github.com/symfony/filesystem/tree/v5.3.4" }, "funding": [ { @@ -5853,25 +5748,24 @@ "type": "tidelift" } ], - "time": "2022-09-21T19:53:16+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/finder", - "version": "v5.4.11", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5900,7 +5794,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.11" + "source": "https://github.com/symfony/finder/tree/v5.3.7" }, "funding": [ { @@ -5916,36 +5810,33 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.13", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "54be067587a4f2b7fffb7a699f9481ec3daf9379" + "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/54be067587a4f2b7fffb7a699f9481ec3daf9379", - "reference": "54be067587a4f2b7fffb7a699f9481ec3daf9379", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", + "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php80": "^1.16" }, "require-dev": { "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^4.4|^5.0|^6.0", - "symfony/rate-limiter": "^5.2|^6.0" + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" }, "suggest": { "symfony/mime": "To use the file extension guesser" @@ -5976,7 +5867,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.13" + "source": "https://github.com/symfony/http-foundation/tree/v5.3.7" }, "funding": [ { @@ -5992,25 +5883,25 @@ "type": "tidelift" } ], - "time": "2022-09-17T07:31:22+00:00" + "time": "2021-08-27T11:20:35+00:00" }, { "name": "symfony/mime", - "version": "v5.4.13", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd" + "reference": "a756033d0a7e53db389618653ae991eba5a19a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd", - "reference": "bb2ccf759e2b967dcd11bdee5bdf30dddd2290bd", + "url": "https://api.github.com/repos/symfony/mime/zipball/a756033d0a7e53db389618653ae991eba5a19a11", + "reference": "a756033d0a7e53db389618653ae991eba5a19a11", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16" @@ -6024,10 +5915,10 @@ "require-dev": { "egulias/email-validator": "^2.1.10|^3.1", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/property-access": "^4.4|^5.1|^6.0", - "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.2|^6.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", "autoload": { @@ -6059,7 +5950,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.13" + "source": "https://github.com/symfony/mime/tree/v5.3.8" }, "funding": [ { @@ -6075,35 +5966,32 @@ "type": "tidelift" } ], - "time": "2022-09-01T18:18:29+00:00" + "time": "2021-09-10T12:30:38+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { "php": ">=7.1" }, - "provide": { - "ext-ctype": "*" - }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6141,88 +6029,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.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": "2022-05-24T11:49:31+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "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 grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" }, "funding": [ { @@ -6238,20 +6045,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", "shasum": "" }, "require": { @@ -6265,7 +6072,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6309,7 +6116,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" }, "funding": [ { @@ -6325,20 +6132,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { @@ -6350,7 +6157,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6393,7 +6200,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, "funding": [ { @@ -6409,35 +6216,32 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { "php": ">=7.1" }, - "provide": { - "ext-mbstring": "*" - }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6476,7 +6280,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" }, "funding": [ { @@ -6492,20 +6296,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", "shasum": "" }, "require": { @@ -6514,7 +6318,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6552,7 +6356,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" }, "funding": [ { @@ -6568,20 +6372,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-05-27T09:17:38+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -6590,7 +6394,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6631,7 +6435,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { @@ -6647,20 +6451,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -6669,7 +6473,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6714,7 +6518,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" }, "funding": [ { @@ -6730,20 +6534,20 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2021-07-28T13:41:28+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" + "reference": "e66119f3de95efc359483f810c4c3e6436279436" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", + "reference": "e66119f3de95efc359483f810c4c3e6436279436", "shasum": "" }, "require": { @@ -6752,7 +6556,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6793,7 +6597,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" }, "funding": [ { @@ -6809,24 +6613,24 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-05-21T13:25:03+00:00" }, { "name": "symfony/process", - "version": "v5.4.11", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" + "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", + "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", + "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=7.1.3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -6855,7 +6659,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.11" + "source": "https://github.com/symfony/process/tree/v4.4.30" }, "funding": [ { @@ -6871,29 +6675,25 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2021-08-04T20:31:23+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" + "psr/container": "^1.1" }, "suggest": { "symfony/service-implementation": "" @@ -6901,7 +6701,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6938,93 +6738,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" - }, - "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": "2022-05-30T19:17:29+00:00" - }, - { - "name": "symfony/string", - "version": "v5.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "2900c668a32138a34118740de3e4d5a701801f53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/2900c668a32138a34118740de3e4d5a701801f53", - "reference": "2900c668a32138a34118740de3e4d5a701801f53", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "conflict": { - "symfony/translation-contracts": ">=3.0" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.4.13" + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" }, "funding": [ { @@ -7040,32 +6754,32 @@ "type": "tidelift" } ], - "time": "2022-09-01T01:52:16+00:00" + "time": "2021-04-01T10:43:52+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.12", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c" + "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", - "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", + "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-ctype": "^1.8" + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/console": "<5.3" + "symfony/console": "<4.4" }, "require-dev": { - "symfony/console": "^5.3|^6.0" + "symfony/console": "^4.4|^5.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -7099,7 +6813,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.12" + "source": "https://github.com/symfony/yaml/tree/v5.3.6" }, "funding": [ { @@ -7115,7 +6829,7 @@ "type": "tidelift" } ], - "time": "2022-08-02T15:52:22+00:00" + "time": "2021-07-29T06:20:01+00:00" }, { "name": "thecodingmachine/safe", @@ -7306,6 +7020,64 @@ ], "time": "2021-07-28T10:34:58+00:00" }, + { + "name": "webmozart/assert", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, + "time": "2021-03-09T10:59:23+00:00" + }, { "name": "weew/helpers-array", "version": "v1.3.1", @@ -7475,16 +7247,16 @@ }, { "name": "gitonomy/gitlib", - "version": "v1.3.7", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/gitonomy/gitlib.git", - "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7" + "reference": "e73e439590b194b0b250b516b22a68c7116e2f21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/00b57b79f02396aa4c7c163f76fe2bc48faebbb7", - "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7", + "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/e73e439590b194b0b250b516b22a68c7116e2f21", + "reference": "e73e439590b194b0b250b516b22a68c7116e2f21", "shasum": "" }, "require": { @@ -7495,7 +7267,6 @@ }, "require-dev": { "ext-fileinfo": "*", - "phpspec/prophecy": "^1.10.2", "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.20 || ^9.5.9", "psr/log": "^1.0" }, @@ -7516,29 +7287,25 @@ "authors": [ { "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" + "email": "hello@gjcampbell.co.uk" }, { "name": "Julien Didier", - "email": "genzo.wm@gmail.com", - "homepage": "https://github.com/juliendidier" + "email": "genzo.wm@gmail.com" }, { "name": "Grégoire Pineau", - "email": "lyrixx@lyrixx.info", - "homepage": "https://github.com/lyrixx" + "email": "lyrixx@lyrixx.info" }, { "name": "Alexandre Salomé", - "email": "alexandre.salome@gmail.com", - "homepage": "https://github.com/alexandresalome" + "email": "alexandre.salome@gmail.com" } ], "description": "Library for accessing git", "support": { "issues": "https://github.com/gitonomy/gitlib/issues", - "source": "https://github.com/gitonomy/gitlib/tree/v1.3.7" + "source": "https://github.com/gitonomy/gitlib/tree/v1.3.2" }, "funding": [ { @@ -7546,27 +7313,27 @@ "type": "tidelift" } ], - "time": "2022-10-04T14:20:15+00:00" + "time": "2021-09-06T20:30:10+00:00" }, { "name": "pdepend/pdepend", - "version": "2.12.1", + "version": "2.10.1", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "7a892d56ceafd804b4a2ecc85184640937ce9e84" + "reference": "30452fdabb3dfca89f4bf977abc44adc5391e062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/7a892d56ceafd804b4a2ecc85184640937ce9e84", - "reference": "7a892d56ceafd804b4a2ecc85184640937ce9e84", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/30452fdabb3dfca89f4bf977abc44adc5391e062", + "reference": "30452fdabb3dfca89f4bf977abc44adc5391e062", "shasum": "" }, "require": { "php": ">=5.3.7", - "symfony/config": "^2.3.0|^3|^4|^5|^6.0", - "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0", - "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0" + "symfony/config": "^2.3.0|^3|^4|^5", + "symfony/dependency-injection": "^2.3.0|^3|^4|^5", + "symfony/filesystem": "^2.3.0|^3|^4|^5" }, "require-dev": { "easy-doc/easy-doc": "0.0.0|^1.2.3", @@ -7595,7 +7362,7 @@ "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/2.12.1" + "source": "https://github.com/pdepend/pdepend/tree/2.10.1" }, "funding": [ { @@ -7603,20 +7370,20 @@ "type": "tidelift" } ], - "time": "2022-09-08T19:30:37+00:00" + "time": "2021-10-11T12:15:18+00:00" }, { "name": "php-coveralls/php-coveralls", - "version": "v2.5.3", + "version": "v2.4.3", "source": { "type": "git", "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9" + "reference": "909381bd40a17ae6e9076051f0d73293c1c091af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9d8243bbf0e053333692857c98fab7cfba0d60a9", - "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9", + "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/909381bd40a17ae6e9076051f0d73293c1c091af", + "reference": "909381bd40a17ae6e9076051f0d73293c1c091af", "shasum": "" }, "require": { @@ -7624,14 +7391,14 @@ "ext-simplexml": "*", "guzzlehttp/guzzle": "^6.0 || ^7.0", "php": "^5.5 || ^7.0 || ^8.0", - "psr/log": "^1.0 || ^2.0", - "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "psr/log": "^1.0", + "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0", + "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0", + "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0", + "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || >=8.0 <8.5.29 || >=9.0 <9.5.23", + "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || ^8.0 || ^9.0", "sanmai/phpunit-legacy-adapter": "^6.1 || ^8.0" }, "suggest": { @@ -7684,28 +7451,28 @@ ], "support": { "issues": "https://github.com/php-coveralls/php-coveralls/issues", - "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.5.3" + "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.4.3" }, - "time": "2022-09-12T20:47:09+00:00" + "time": "2020-12-24T09:17:03+00:00" }, { "name": "phpmd/phpmd", - "version": "2.13.0", + "version": "2.10.2", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "dad0228156856b3ad959992f9748514fa943f3e3" + "reference": "1bc74db7cf834662d83abebae265be11bb2eec3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/dad0228156856b3ad959992f9748514fa943f3e3", - "reference": "dad0228156856b3ad959992f9748514fa943f3e3", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/1bc74db7cf834662d83abebae265be11bb2eec3a", + "reference": "1bc74db7cf834662d83abebae265be11bb2eec3a", "shasum": "" }, "require": { - "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^1.0 || ^2.0", "ext-xml": "*", - "pdepend/pdepend": "^2.12.1", + "pdepend/pdepend": "^2.10.0", "php": ">=5.3.9" }, "require-dev": { @@ -7761,7 +7528,7 @@ "support": { "irc": "irc://irc.freenode.org/phpmd", "issues": "https://github.com/phpmd/phpmd/issues", - "source": "https://github.com/phpmd/phpmd/tree/2.13.0" + "source": "https://github.com/phpmd/phpmd/tree/2.10.2" }, "funding": [ { @@ -7769,7 +7536,7 @@ "type": "tidelift" } ], - "time": "2022-09-10T08:44:15+00:00" + "time": "2021-07-22T09:56:23+00:00" }, { "name": "sebastian/phpcpd", @@ -7834,16 +7601,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.6.2", + "version": "3.6.1", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" + "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", - "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/f268ca40d54617c6e06757f83f699775c9b3ff2e", + "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e", "shasum": "" }, "require": { @@ -7886,26 +7653,26 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2021-12-12T21:44:58+00:00" + "time": "2021-10-11T04:00:11+00:00" }, { "name": "symfony/config", - "version": "v5.4.11", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "ec79e03125c1d2477e43dde8528535d90cc78379" + "reference": "4268f3059c904c61636275182707f81645517a37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/ec79e03125c1d2477e43dde8528535d90cc78379", - "reference": "ec79e03125c1d2477e43dde8528535d90cc78379", + "url": "https://api.github.com/repos/symfony/config/zipball/4268f3059c904c61636275182707f81645517a37", + "reference": "4268f3059c904c61636275182707f81645517a37", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/filesystem": "^4.4|^5.0", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-php80": "^1.16", "symfony/polyfill-php81": "^1.22" @@ -7914,11 +7681,11 @@ "symfony/finder": "<4.4" }, "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/yaml": "^4.4|^5.0|^6.0" + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/yaml": "^4.4|^5.0" }, "suggest": { "symfony/yaml": "To use the yaml reference dumper" @@ -7949,7 +7716,7 @@ "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/v5.4.11" + "source": "https://github.com/symfony/config/tree/v5.3.4" }, "funding": [ { @@ -7965,28 +7732,27 @@ "type": "tidelift" } ], - "time": "2022-07-20T13:00:38+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.4.13", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "24cf522668845391c0542bc1de496366072a6d0e" + "reference": "e39c344e06a3ceab531ebeb6c077e6652c4a0829" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/24cf522668845391c0542bc1de496366072a6d0e", - "reference": "24cf522668845391c0542bc1de496366072a6d0e", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e39c344e06a3ceab531ebeb6c077e6652c4a0829", + "reference": "e39c344e06a3ceab531ebeb6c077e6652c4a0829", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.1.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { @@ -7994,16 +7760,16 @@ "symfony/config": "<5.3", "symfony/finder": "<4.4", "symfony/proxy-manager-bridge": "<4.4", - "symfony/yaml": "<4.4.26" + "symfony/yaml": "<4.4" }, "provide": { "psr/container-implementation": "1.0", "symfony/service-implementation": "1.0|2.0" }, "require-dev": { - "symfony/config": "^5.3|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4.26|^5.0|^6.0" + "symfony/config": "^5.3", + "symfony/expression-language": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" }, "suggest": { "symfony/config": "", @@ -8038,7 +7804,7 @@ "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/v5.4.13" + "source": "https://github.com/symfony/dependency-injection/tree/v5.3.8" }, "funding": [ { @@ -8054,25 +7820,25 @@ "type": "tidelift" } ], - "time": "2022-08-30T19:10:13+00:00" + "time": "2021-09-21T20:52:44+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.4.13", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "6df7a3effde34d81717bbef4591e5ffe32226d69" + "reference": "b24c6a92c6db316fee69e38c80591e080e41536c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/6df7a3effde34d81717bbef4591e5ffe32226d69", - "reference": "6df7a3effde34d81717bbef4591e5ffe32226d69", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b24c6a92c6db316fee69e38c80591e080e41536c", + "reference": "b24c6a92c6db316fee69e38c80591e080e41536c", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/service-contracts": "^1|^2|^3" + "symfony/service-contracts": "^1.0|^2" }, "type": "library", "autoload": { @@ -8100,7 +7866,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.4.13" + "source": "https://github.com/symfony/stopwatch/tree/v5.3.4" }, "funding": [ { @@ -8116,7 +7882,7 @@ "type": "tidelift" } ], - "time": "2022-09-28T13:19:49+00:00" + "time": "2021-07-10T08:58:57+00:00" } ], "aliases": [], From eea1471e232ad7d569c8f01108e8e6956dbfd653 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 11 Oct 2022 15:05:49 +0530 Subject: [PATCH 291/674] Update composer.json --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index 08f78bb63..99216b395 100755 --- a/composer.json +++ b/composer.json @@ -7,7 +7,6 @@ "keywords": ["magento", "automation", "functional", "testing"], "config": { "sort-packages": true, - "config": { "platform-check": false } }, "require": { "php": ">7.3", From c0a6aeeeb0a7c465f7915a3aee0e72ff3f1e08f6 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 11 Oct 2022 15:11:57 +0530 Subject: [PATCH 292/674] fix --- composer.json | 3 + composer.lock | 755 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 598 insertions(+), 160 deletions(-) diff --git a/composer.json b/composer.json index 99216b395..271f1e44e 100755 --- a/composer.json +++ b/composer.json @@ -7,6 +7,9 @@ "keywords": ["magento", "automation", "functional", "testing"], "config": { "sort-packages": true, + "config": { "platform": { + "php": ">=7.3" + } } }, "require": { "php": ">7.3", diff --git a/composer.lock b/composer.lock index 1f79506a8..19c19952c 100644 --- a/composer.lock +++ b/composer.lock @@ -847,16 +847,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.2.11", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582" + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", - "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", "shasum": "" }, "require": { @@ -903,7 +903,7 @@ "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.11" + "source": "https://github.com/composer/ca-bundle/tree/1.3.3" }, "funding": [ { @@ -919,42 +919,124 @@ "type": "tidelift" } ], - "time": "2021-09-25T20:32:43+00:00" + "time": "2022-07-20T07:14:26+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "shasum": "" + }, + "require": { + "composer/pcre": "^2 || ^3", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.6", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/filesystem": "^5.4 || ^6", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + }, + "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": "2022-06-19T11:31:27+00:00" }, { "name": "composer/composer", - "version": "2.1.9", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "e558c88f28d102d497adec4852802c0dc14c7077" + "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/e558c88f28d102d497adec4852802c0dc14c7077", - "reference": "e558c88f28d102d497adec4852802c0dc14c7077", + "url": "https://api.github.com/repos/composer/composer/zipball/7d887621e69a0311eb50aed4a16f7044b2b385b9", + "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", + "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", + "composer/pcre": "^2 || ^3", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^2.0", + "composer/spdx-licenses": "^1.5.7", + "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "react/promise": "^1.2 || ^2.7", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "react/promise": "^2.8", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" + "seld/phar-utils": "^1.2", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.11 || ^6.0.11", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/finder": "^5.4 || ^6.0", + "symfony/polyfill-php73": "^1.24", + "symfony/polyfill-php80": "^1.24", + "symfony/process": "^5.4 || ^6.0" }, "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1", + "phpstan/phpstan-symfony": "^1.2.10", + "symfony/phpunit-bridge": "^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -967,7 +1049,12 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-main": "2.4-dev" + }, + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] } }, "autoload": { @@ -1001,7 +1088,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.1.9" + "source": "https://github.com/composer/composer/tree/2.4.2" }, "funding": [ { @@ -1017,7 +1104,7 @@ "type": "tidelift" } ], - "time": "2021-10-05T07:47:38+00:00" + "time": "2022-09-14T14:11:15+00:00" }, { "name": "composer/metadata-minifier", @@ -1088,25 +1175,96 @@ ], "time": "2021-04-07T13:37:33+00:00" }, + { + "name": "composer/pcre", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.0.0" + }, + "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": "2022-02-25T20:21:48+00:00" + }, { "name": "composer/semver", - "version": "3.2.5", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.54", + "phpstan/phpstan": "^1.4", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", @@ -1151,7 +1309,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.5" + "source": "https://github.com/composer/semver/tree/3.3.2" }, "funding": [ { @@ -1167,27 +1325,28 @@ "type": "tidelift" } ], - "time": "2021-05-24T12:41:47+00:00" + "time": "2022-04-01T19:23:25+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.5", + "version": "1.5.7", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "de30328a7af8680efdc03e396aad24befd513200" + "reference": "c848241796da2abf65837d51dce1fae55a960149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", - "reference": "de30328a7af8680efdc03e396aad24befd513200", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", + "reference": "c848241796da2abf65837d51dce1fae55a960149", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "extra": { @@ -1230,7 +1389,7 @@ "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" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" }, "funding": [ { @@ -1246,7 +1405,7 @@ "type": "tidelift" } ], - "time": "2020-12-03T16:04:16+00:00" + "time": "2022-05-23T07:37:50+00:00" }, { "name": "composer/xdebug-handler", @@ -2073,16 +2232,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.11", + "version": "5.2.12", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, "require": { @@ -2137,9 +2296,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" }, - "time": "2021-07-22T09:24:00+00:00" + "time": "2022-04-13T08:02:27+00:00" }, { "name": "laminas/laminas-diactoros", @@ -3554,20 +3713,20 @@ }, { "name": "psr/container", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", "autoload": { @@ -3596,9 +3755,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/1.1.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:50:12+00:00" }, { "name": "psr/http-client", @@ -4033,23 +4192,23 @@ }, { "name": "react/promise", - "version": "v2.8.0", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", + "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4067,7 +4226,23 @@ "authors": [ { "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com" + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", @@ -4077,9 +4252,19 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.8.0" + "source": "https://github.com/reactphp/promise/tree/v2.9.0" }, - "time": "2020-05-12T15:16:56+00:00" + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-02-11T10:27:51+00:00" }, { "name": "sebastian/cli-parser", @@ -5047,23 +5232,24 @@ }, { "name": "seld/jsonlint", - "version": "1.8.3", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" + "reference": "4211420d25eba80712bff236a98960ef68b866b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", + "reference": "4211420d25eba80712bff236a98960ef68b866b7", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" }, "bin": [ "bin/jsonlint" @@ -5094,7 +5280,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" + "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" }, "funding": [ { @@ -5106,20 +5292,20 @@ "type": "tidelift" } ], - "time": "2020-11-11T09:19:24+00:00" + "time": "2022-04-01T13:37:23+00:00" }, { "name": "seld/phar-utils", - "version": "1.1.2", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0" + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", "shasum": "" }, "require": { @@ -5152,9 +5338,70 @@ ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2" + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" }, - "time": "2021-08-19T21:01:38+00:00" + "time": "2022-08-31T10:31:18+00:00" + }, + { + "name": "seld/signal-handler", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], + "support": { + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" + }, + "time": "2022-07-20T18:31:45+00:00" }, { "name": "spomky-labs/otphp", @@ -5233,43 +5480,46 @@ }, { "name": "symfony/console", - "version": "v4.4.30", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22" + "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a3f7189a0665ee33b50e9e228c46f50f5acbed22", - "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22", + "url": "https://api.github.com/repos/symfony/console/zipball/3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", + "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", - "symfony/process": "<3.3" + "symfony/process": "<4.4" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5302,8 +5552,14 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/console/tree/v4.4.30" + "source": "https://github.com/symfony/console/tree/v5.4.13" }, "funding": [ { @@ -5319,7 +5575,7 @@ "type": "tidelift" } ], - "time": "2021-08-25T19:27:26+00:00" + "time": "2022-08-26T13:50:20+00:00" }, { "name": "symfony/css-selector", @@ -5389,16 +5645,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { @@ -5407,7 +5663,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5436,7 +5692,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -5452,7 +5708,7 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/dotenv", @@ -5689,21 +5945,22 @@ }, { "name": "symfony/filesystem", - "version": "v5.3.4", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5732,7 +5989,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.4" + "source": "https://github.com/symfony/filesystem/tree/v5.4.13" }, "funding": [ { @@ -5748,24 +6005,25 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2022-09-21T19:53:16+00:00" }, { "name": "symfony/finder", - "version": "v5.3.7", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5794,7 +6052,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v5.4.11" }, "funding": [ { @@ -5810,7 +6068,7 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2022-07-29T07:37:50+00:00" }, { "name": "symfony/http-foundation", @@ -5970,28 +6228,31 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-ctype": "*" + }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6029,7 +6290,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" }, "funding": [ { @@ -6045,7 +6306,88 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "433d05519ce6990bf3530fba6957499d327395c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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 grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.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": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6136,16 +6478,16 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", "shasum": "" }, "require": { @@ -6157,7 +6499,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6200,7 +6542,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" }, "funding": [ { @@ -6216,32 +6558,35 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6280,7 +6625,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" }, "funding": [ { @@ -6296,7 +6641,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php72", @@ -6376,16 +6721,16 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { @@ -6394,7 +6739,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6435,7 +6780,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -6451,20 +6796,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", "shasum": "" }, "require": { @@ -6473,7 +6818,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6518,7 +6863,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" }, "funding": [ { @@ -6534,7 +6879,7 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2022-05-10T07:21:04+00:00" }, { "name": "symfony/polyfill-php81", @@ -6617,20 +6962,20 @@ }, { "name": "symfony/process", - "version": "v4.4.30", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d" + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", + "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -6659,7 +7004,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v4.4.30" + "source": "https://github.com/symfony/process/tree/v5.4.11" }, "funding": [ { @@ -6675,25 +7020,29 @@ "type": "tidelift" } ], - "time": "2021-08-04T20:31:23+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1" + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "suggest": { "symfony/service-implementation": "" @@ -6701,7 +7050,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6738,7 +7087,93 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "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": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "2900c668a32138a34118740de3e4d5a701801f53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/2900c668a32138a34118740de3e4d5a701801f53", + "reference": "2900c668a32138a34118740de3e4d5a701801f53", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.13" }, "funding": [ { @@ -6754,7 +7189,7 @@ "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2022-09-01T01:52:16+00:00" }, { "name": "symfony/yaml", From 56976975bf10011332055ad8e33cf0f5e519a91e Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 11 Oct 2022 15:14:49 +0530 Subject: [PATCH 293/674] Update composer.lock --- composer.lock | 755 +++++++++++--------------------------------------- 1 file changed, 160 insertions(+), 595 deletions(-) diff --git a/composer.lock b/composer.lock index 19c19952c..1f79506a8 100644 --- a/composer.lock +++ b/composer.lock @@ -847,16 +847,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.3", + "version": "1.2.11", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" + "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", + "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", "shasum": "" }, "require": { @@ -903,7 +903,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.3" + "source": "https://github.com/composer/ca-bundle/tree/1.2.11" }, "funding": [ { @@ -919,124 +919,42 @@ "type": "tidelift" } ], - "time": "2022-07-20T07:14:26+00:00" - }, - { - "name": "composer/class-map-generator", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", - "shasum": "" - }, - "require": { - "composer/pcre": "^2 || ^3", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" - }, - "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\ClassMapGenerator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Utilities to scan PHP code and generate class maps.", - "keywords": [ - "classmap" - ], - "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" - }, - "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": "2022-06-19T11:31:27+00:00" + "time": "2021-09-25T20:32:43+00:00" }, { "name": "composer/composer", - "version": "2.4.2", + "version": "2.1.9", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9" + "reference": "e558c88f28d102d497adec4852802c0dc14c7077" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/7d887621e69a0311eb50aed4a16f7044b2b385b9", - "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9", + "url": "https://api.github.com/repos/composer/composer/zipball/e558c88f28d102d497adec4852802c0dc14c7077", + "reference": "e558c88f28d102d497adec4852802c0dc14c7077", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2 || ^3", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.5.7", - "composer/xdebug-handler": "^2.0.2 || ^3.0.3", + "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^2.0", "justinrainbow/json-schema": "^5.2.11", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8", + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0", + "react/promise": "^1.2 || ^2.7", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.2", - "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/polyfill-php73": "^1.24", - "symfony/polyfill-php80": "^1.24", - "symfony/process": "^5.4 || ^6.0" + "seld/phar-utils": "^1.0", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" }, "require-dev": { - "phpstan/phpstan": "^1.4.1", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1", - "phpstan/phpstan-symfony": "^1.2.10", - "symfony/phpunit-bridge": "^6.0" + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -1049,12 +967,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" - }, - "phpstan": { - "includes": [ - "phpstan/rules.neon" - ] + "dev-master": "2.1-dev" } }, "autoload": { @@ -1088,7 +1001,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.4.2" + "source": "https://github.com/composer/composer/tree/2.1.9" }, "funding": [ { @@ -1104,7 +1017,7 @@ "type": "tidelift" } ], - "time": "2022-09-14T14:11:15+00:00" + "time": "2021-10-05T07:47:38+00:00" }, { "name": "composer/metadata-minifier", @@ -1175,96 +1088,25 @@ ], "time": "2021-04-07T13:37:33+00:00" }, - { - "name": "composer/pcre", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" - }, - "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": "2022-02-25T20:21:48+00:00" - }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.2.5", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", + "phpstan/phpstan": "^0.12.54", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", @@ -1309,7 +1151,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.2.5" }, "funding": [ { @@ -1325,28 +1167,27 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2021-05-24T12:41:47+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.7", + "version": "1.5.5", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "c848241796da2abf65837d51dce1fae55a960149" + "reference": "de30328a7af8680efdc03e396aad24befd513200" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", - "reference": "c848241796da2abf65837d51dce1fae55a960149", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", + "reference": "de30328a7af8680efdc03e396aad24befd513200", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" }, "type": "library", "extra": { @@ -1389,7 +1230,7 @@ "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.7" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.5" }, "funding": [ { @@ -1405,7 +1246,7 @@ "type": "tidelift" } ], - "time": "2022-05-23T07:37:50+00:00" + "time": "2020-12-03T16:04:16+00:00" }, { "name": "composer/xdebug-handler", @@ -2232,16 +2073,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.12", + "version": "5.2.11", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", + "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", "shasum": "" }, "require": { @@ -2296,9 +2137,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" }, - "time": "2022-04-13T08:02:27+00:00" + "time": "2021-07-22T09:24:00+00:00" }, { "name": "laminas/laminas-diactoros", @@ -3713,20 +3554,20 @@ }, { "name": "psr/container", - "version": "1.1.2", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": ">=7.2.0" }, "type": "library", "autoload": { @@ -3755,9 +3596,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { "name": "psr/http-client", @@ -4192,23 +4033,23 @@ }, { "name": "react/promise", - "version": "v2.9.0", + "version": "v2.8.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", + "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4226,23 +4067,7 @@ "authors": [ { "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "email": "jsorgalla@gmail.com" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", @@ -4252,19 +4077,9 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" + "source": "https://github.com/reactphp/promise/tree/v2.8.0" }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-11T10:27:51+00:00" + "time": "2020-05-12T15:16:56+00:00" }, { "name": "sebastian/cli-parser", @@ -5232,24 +5047,23 @@ }, { "name": "seld/jsonlint", - "version": "1.9.0", + "version": "1.8.3", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "bin": [ "bin/jsonlint" @@ -5280,7 +5094,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" }, "funding": [ { @@ -5292,20 +5106,20 @@ "type": "tidelift" } ], - "time": "2022-04-01T13:37:23+00:00" + "time": "2020-11-11T09:19:24+00:00" }, { "name": "seld/phar-utils", - "version": "1.2.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0", "shasum": "" }, "require": { @@ -5338,70 +5152,9 @@ ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" + "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2" }, - "time": "2022-08-31T10:31:18+00:00" - }, - { - "name": "seld/signal-handler", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "require-dev": { - "phpstan/phpstan": "^1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "psr/log": "^1 || ^2 || ^3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\Signal\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", - "keywords": [ - "posix", - "sigint", - "signal", - "sigterm", - "unix" - ], - "support": { - "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" - }, - "time": "2022-07-20T18:31:45+00:00" + "time": "2021-08-19T21:01:38+00:00" }, { "name": "spomky-labs/otphp", @@ -5480,46 +5233,43 @@ }, { "name": "symfony/console", - "version": "v5.4.13", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be" + "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", - "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", + "url": "https://api.github.com/repos/symfony/console/zipball/a3f7189a0665ee33b50e9e228c46f50f5acbed22", + "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=7.1.3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php73": "^1.8", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" + "symfony/service-contracts": "^1.1|^2" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/process": "<3.3" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5552,14 +5302,8 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.13" + "source": "https://github.com/symfony/console/tree/v4.4.30" }, "funding": [ { @@ -5575,7 +5319,7 @@ "type": "tidelift" } ], - "time": "2022-08-26T13:50:20+00:00" + "time": "2021-08-25T19:27:26+00:00" }, { "name": "symfony/css-selector", @@ -5645,16 +5389,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { @@ -5663,7 +5407,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5692,7 +5436,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" }, "funding": [ { @@ -5708,7 +5452,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/dotenv", @@ -5945,22 +5689,21 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.13", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", - "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5989,7 +5732,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.13" + "source": "https://github.com/symfony/filesystem/tree/v5.3.4" }, "funding": [ { @@ -6005,25 +5748,24 @@ "type": "tidelift" } ], - "time": "2022-09-21T19:53:16+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/finder", - "version": "v5.4.11", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -6052,7 +5794,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.11" + "source": "https://github.com/symfony/finder/tree/v5.3.7" }, "funding": [ { @@ -6068,7 +5810,7 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/http-foundation", @@ -6228,31 +5970,28 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { "php": ">=7.1" }, - "provide": { - "ext-ctype": "*" - }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6290,7 +6029,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" }, "funding": [ { @@ -6306,88 +6045,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "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 grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.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": "2022-05-24T11:49:31+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6478,16 +6136,16 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { @@ -6499,7 +6157,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6542,7 +6200,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, "funding": [ { @@ -6558,35 +6216,32 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { "php": ">=7.1" }, - "provide": { - "ext-mbstring": "*" - }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6625,7 +6280,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" }, "funding": [ { @@ -6641,7 +6296,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-php72", @@ -6721,16 +6376,16 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.26.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -6739,7 +6394,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6780,7 +6435,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { @@ -6796,20 +6451,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -6818,7 +6473,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6863,7 +6518,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" }, "funding": [ { @@ -6879,7 +6534,7 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2021-07-28T13:41:28+00:00" }, { "name": "symfony/polyfill-php81", @@ -6962,20 +6617,20 @@ }, { "name": "symfony/process", - "version": "v5.4.11", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" + "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", + "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", + "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=7.1.3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -7004,7 +6659,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.11" + "source": "https://github.com/symfony/process/tree/v4.4.30" }, "funding": [ { @@ -7020,29 +6675,25 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2021-08-04T20:31:23+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" + "psr/container": "^1.1" }, "suggest": { "symfony/service-implementation": "" @@ -7050,7 +6701,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -7087,93 +6738,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" - }, - "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": "2022-05-30T19:17:29+00:00" - }, - { - "name": "symfony/string", - "version": "v5.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "2900c668a32138a34118740de3e4d5a701801f53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/2900c668a32138a34118740de3e4d5a701801f53", - "reference": "2900c668a32138a34118740de3e4d5a701801f53", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "conflict": { - "symfony/translation-contracts": ">=3.0" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.4.13" + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" }, "funding": [ { @@ -7189,7 +6754,7 @@ "type": "tidelift" } ], - "time": "2022-09-01T01:52:16+00:00" + "time": "2021-04-01T10:43:52+00:00" }, { "name": "symfony/yaml", From f3d65bdf7a57bb73db345a408f0004c6ea250570 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 11 Oct 2022 15:15:25 +0530 Subject: [PATCH 294/674] Update composer.json --- composer.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 271f1e44e..0161b4883 100755 --- a/composer.json +++ b/composer.json @@ -6,10 +6,7 @@ "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { - "sort-packages": true, - "config": { "platform": { - "php": ">=7.3" - } } + "sort-packages": true }, "require": { "php": ">7.3", From b0d2951980e500af24597b2592ba99c9e7ce8793 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 11 Oct 2022 15:16:17 +0530 Subject: [PATCH 295/674] fix --- composer.lock | 755 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 595 insertions(+), 160 deletions(-) diff --git a/composer.lock b/composer.lock index 1f79506a8..19c19952c 100644 --- a/composer.lock +++ b/composer.lock @@ -847,16 +847,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.2.11", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582" + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", - "reference": "0b072d51c5a9c6f3412f7ea3ab043d6603cb2582", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", "shasum": "" }, "require": { @@ -903,7 +903,7 @@ "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.11" + "source": "https://github.com/composer/ca-bundle/tree/1.3.3" }, "funding": [ { @@ -919,42 +919,124 @@ "type": "tidelift" } ], - "time": "2021-09-25T20:32:43+00:00" + "time": "2022-07-20T07:14:26+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "shasum": "" + }, + "require": { + "composer/pcre": "^2 || ^3", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.6", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/filesystem": "^5.4 || ^6", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + }, + "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": "2022-06-19T11:31:27+00:00" }, { "name": "composer/composer", - "version": "2.1.9", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "e558c88f28d102d497adec4852802c0dc14c7077" + "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/e558c88f28d102d497adec4852802c0dc14c7077", - "reference": "e558c88f28d102d497adec4852802c0dc14c7077", + "url": "https://api.github.com/repos/composer/composer/zipball/7d887621e69a0311eb50aed4a16f7044b2b385b9", + "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", + "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", + "composer/pcre": "^2 || ^3", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^2.0", + "composer/spdx-licenses": "^1.5.7", + "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "react/promise": "^1.2 || ^2.7", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "react/promise": "^2.8", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" + "seld/phar-utils": "^1.2", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.11 || ^6.0.11", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/finder": "^5.4 || ^6.0", + "symfony/polyfill-php73": "^1.24", + "symfony/polyfill-php80": "^1.24", + "symfony/process": "^5.4 || ^6.0" }, "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1", + "phpstan/phpstan-symfony": "^1.2.10", + "symfony/phpunit-bridge": "^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -967,7 +1049,12 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-main": "2.4-dev" + }, + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] } }, "autoload": { @@ -1001,7 +1088,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.1.9" + "source": "https://github.com/composer/composer/tree/2.4.2" }, "funding": [ { @@ -1017,7 +1104,7 @@ "type": "tidelift" } ], - "time": "2021-10-05T07:47:38+00:00" + "time": "2022-09-14T14:11:15+00:00" }, { "name": "composer/metadata-minifier", @@ -1088,25 +1175,96 @@ ], "time": "2021-04-07T13:37:33+00:00" }, + { + "name": "composer/pcre", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.0.0" + }, + "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": "2022-02-25T20:21:48+00:00" + }, { "name": "composer/semver", - "version": "3.2.5", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", - "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.54", + "phpstan/phpstan": "^1.4", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", @@ -1151,7 +1309,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.5" + "source": "https://github.com/composer/semver/tree/3.3.2" }, "funding": [ { @@ -1167,27 +1325,28 @@ "type": "tidelift" } ], - "time": "2021-05-24T12:41:47+00:00" + "time": "2022-04-01T19:23:25+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.5", + "version": "1.5.7", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "de30328a7af8680efdc03e396aad24befd513200" + "reference": "c848241796da2abf65837d51dce1fae55a960149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", - "reference": "de30328a7af8680efdc03e396aad24befd513200", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", + "reference": "c848241796da2abf65837d51dce1fae55a960149", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "extra": { @@ -1230,7 +1389,7 @@ "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" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" }, "funding": [ { @@ -1246,7 +1405,7 @@ "type": "tidelift" } ], - "time": "2020-12-03T16:04:16+00:00" + "time": "2022-05-23T07:37:50+00:00" }, { "name": "composer/xdebug-handler", @@ -2073,16 +2232,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.11", + "version": "5.2.12", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, "require": { @@ -2137,9 +2296,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" }, - "time": "2021-07-22T09:24:00+00:00" + "time": "2022-04-13T08:02:27+00:00" }, { "name": "laminas/laminas-diactoros", @@ -3554,20 +3713,20 @@ }, { "name": "psr/container", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", "autoload": { @@ -3596,9 +3755,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/1.1.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:50:12+00:00" }, { "name": "psr/http-client", @@ -4033,23 +4192,23 @@ }, { "name": "react/promise", - "version": "v2.8.0", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4" + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4", - "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4", + "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4067,7 +4226,23 @@ "authors": [ { "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com" + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", @@ -4077,9 +4252,19 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.8.0" + "source": "https://github.com/reactphp/promise/tree/v2.9.0" }, - "time": "2020-05-12T15:16:56+00:00" + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-02-11T10:27:51+00:00" }, { "name": "sebastian/cli-parser", @@ -5047,23 +5232,24 @@ }, { "name": "seld/jsonlint", - "version": "1.8.3", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" + "reference": "4211420d25eba80712bff236a98960ef68b866b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", - "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", + "reference": "4211420d25eba80712bff236a98960ef68b866b7", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" }, "bin": [ "bin/jsonlint" @@ -5094,7 +5280,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" + "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" }, "funding": [ { @@ -5106,20 +5292,20 @@ "type": "tidelift" } ], - "time": "2020-11-11T09:19:24+00:00" + "time": "2022-04-01T13:37:23+00:00" }, { "name": "seld/phar-utils", - "version": "1.1.2", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0" + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", "shasum": "" }, "require": { @@ -5152,9 +5338,70 @@ ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2" + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" }, - "time": "2021-08-19T21:01:38+00:00" + "time": "2022-08-31T10:31:18+00:00" + }, + { + "name": "seld/signal-handler", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], + "support": { + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" + }, + "time": "2022-07-20T18:31:45+00:00" }, { "name": "spomky-labs/otphp", @@ -5233,43 +5480,46 @@ }, { "name": "symfony/console", - "version": "v4.4.30", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22" + "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a3f7189a0665ee33b50e9e228c46f50f5acbed22", - "reference": "a3f7189a0665ee33b50e9e228c46f50f5acbed22", + "url": "https://api.github.com/repos/symfony/console/zipball/3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", + "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", - "symfony/process": "<3.3" + "symfony/process": "<4.4" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5302,8 +5552,14 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/console/tree/v4.4.30" + "source": "https://github.com/symfony/console/tree/v5.4.13" }, "funding": [ { @@ -5319,7 +5575,7 @@ "type": "tidelift" } ], - "time": "2021-08-25T19:27:26+00:00" + "time": "2022-08-26T13:50:20+00:00" }, { "name": "symfony/css-selector", @@ -5389,16 +5645,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { @@ -5407,7 +5663,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5436,7 +5692,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -5452,7 +5708,7 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/dotenv", @@ -5689,21 +5945,22 @@ }, { "name": "symfony/filesystem", - "version": "v5.3.4", + "version": "v5.4.13", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", + "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5732,7 +5989,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.4" + "source": "https://github.com/symfony/filesystem/tree/v5.4.13" }, "funding": [ { @@ -5748,24 +6005,25 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2022-09-21T19:53:16+00:00" }, { "name": "symfony/finder", - "version": "v5.3.7", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -5794,7 +6052,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v5.4.11" }, "funding": [ { @@ -5810,7 +6068,7 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2022-07-29T07:37:50+00:00" }, { "name": "symfony/http-foundation", @@ -5970,28 +6228,31 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-ctype": "*" + }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6029,7 +6290,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" }, "funding": [ { @@ -6045,7 +6306,88 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "433d05519ce6990bf3530fba6957499d327395c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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 grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.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": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6136,16 +6478,16 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", "shasum": "" }, "require": { @@ -6157,7 +6499,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6200,7 +6542,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" }, "funding": [ { @@ -6216,32 +6558,35 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6280,7 +6625,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" }, "funding": [ { @@ -6296,7 +6641,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php72", @@ -6376,16 +6721,16 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { @@ -6394,7 +6739,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6435,7 +6780,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -6451,20 +6796,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", "shasum": "" }, "require": { @@ -6473,7 +6818,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6518,7 +6863,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" }, "funding": [ { @@ -6534,7 +6879,7 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2022-05-10T07:21:04+00:00" }, { "name": "symfony/polyfill-php81", @@ -6617,20 +6962,20 @@ }, { "name": "symfony/process", - "version": "v4.4.30", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d" + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", + "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -6659,7 +7004,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v4.4.30" + "source": "https://github.com/symfony/process/tree/v5.4.11" }, "funding": [ { @@ -6675,25 +7020,29 @@ "type": "tidelift" } ], - "time": "2021-08-04T20:31:23+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1" + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "suggest": { "symfony/service-implementation": "" @@ -6701,7 +7050,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6738,7 +7087,93 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "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": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "2900c668a32138a34118740de3e4d5a701801f53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/2900c668a32138a34118740de3e4d5a701801f53", + "reference": "2900c668a32138a34118740de3e4d5a701801f53", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.13" }, "funding": [ { @@ -6754,7 +7189,7 @@ "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2022-09-01T01:52:16+00:00" }, { "name": "symfony/yaml", From 6a54d218a2b83bd41a102e14e2793b501c8e31ec Mon Sep 17 00:00:00 2001 From: Rajesh Kumar <glo71317@adobe.com> Date: Tue, 11 Oct 2022 17:45:21 +0530 Subject: [PATCH 296/674] AC-2660::Upgrade allure-framework/allure-phpunit to the latest major --- composer.json | 4 +- composer.lock | 310 ++++++++++++++---- etc/config/codeception.dist.yml | 4 +- .../Module/MagentoWebDriver.php | 4 + 4 files changed, 255 insertions(+), 67 deletions(-) diff --git a/composer.json b/composer.json index 382476546..0161b4883 100755 --- a/composer.json +++ b/composer.json @@ -9,14 +9,14 @@ "sort-packages": true }, "require": { - "php": "~7.4.0||~8.1.0", + "php": ">7.3", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", "ext-intl": "*", "ext-json": "*", "ext-openssl": "*", - "allure-framework/allure-codeception": "^2", + "allure-framework/allure-codeception": "^1.4", "aws/aws-sdk-php": "^3.132", "codeception/codeception": "^4.1", "codeception/module-asserts": "^1.1", diff --git a/composer.lock b/composer.lock index 293f5c8d2..1f79506a8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,43 +4,38 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e6a0d4f12fc82c99080c3fd01eab38a7", + "content-hash": "075f7ef8a19879334ba1e0443f4e9679", "packages": [ { "name": "allure-framework/allure-codeception", - "version": "v2.0.2", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-codeception.git", - "reference": "8ba63e1134f90d431dfaf6c4d7e4c7fdb12eabfb" + "reference": "a6156aef942a4e4de0add34a73d066a9458cefc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/8ba63e1134f90d431dfaf6c4d7e4c7fdb12eabfb", - "reference": "8ba63e1134f90d431dfaf6c4d7e4c7fdb12eabfb", + "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/a6156aef942a4e4de0add34a73d066a9458cefc6", + "reference": "a6156aef942a4e4de0add34a73d066a9458cefc6", "shasum": "" }, "require": { - "allure-framework/allure-php-commons": "^2", - "codeception/codeception": "^4.1", + "allure-framework/allure-php-api": "^1.3", + "codeception/codeception": "^2.5 | ^3 | ^4", "ext-json": "*", - "php": "^8" - }, - "conflict": { - "codeception/phpunit-wrapper": "<9.0.1" + "php": ">=7.1.3", + "symfony/filesystem": "^2.7 | ^3 | ^4 | ^5", + "symfony/finder": "^2.7 | ^3 | ^4 | ^5" }, "require-dev": { - "phpunit/phpunit": "^9", - "psalm/plugin-phpunit": "^0.16.1", - "remorhaz/php-json-data": "^0.5.3", - "remorhaz/php-json-path": "^0.7.7", - "squizlabs/php_codesniffer": "^3.6.2", - "vimeo/psalm": "^4.20" + "ext-dom": "*", + "phpunit/phpunit": "^7.2 | ^8 | ^9" }, "type": "library", "autoload": { - "psr-4": { - "Qameta\\Allure\\Codeception\\": "src/" + "psr-0": { + "Yandex": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -52,11 +47,6 @@ "name": "Ivan Krutov", "email": "vania-pooh@aerokube.com", "role": "Developer" - }, - { - "name": "Edward Surov", - "email": "zoohie@gmail.com", - "role": "Developer" } ], "description": "Allure Codeception integration", @@ -75,44 +65,38 @@ "issues": "https://github.com/allure-framework/allure-codeception/issues", "source": "https://github.com/allure-framework/allure-codeception" }, - "time": "2022-05-11T13:17:21+00:00" + "time": "2021-06-04T13:24:36+00:00" }, { - "name": "allure-framework/allure-php-commons", - "version": "v2.0.0", + "name": "allure-framework/allure-php-api", + "version": "1.3.1", "source": { "type": "git", - "url": "https://github.com/allure-framework/allure-php-commons2.git", - "reference": "946e375e90cce9e43d1622890fb5a312ec8086bb" + "url": "https://github.com/allure-framework/allure-php-api.git", + "reference": "f64b69afeff472c564a4e2379efb2b69c430ec5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/946e375e90cce9e43d1622890fb5a312ec8086bb", - "reference": "946e375e90cce9e43d1622890fb5a312ec8086bb", + "url": "https://api.github.com/repos/allure-framework/allure-php-api/zipball/f64b69afeff472c564a4e2379efb2b69c430ec5a", + "reference": "f64b69afeff472c564a4e2379efb2b69c430ec5a", "shasum": "" }, "require": { - "doctrine/annotations": "^1.12", - "ext-json": "*", - "php": "^8", - "psr/log": "^1 || ^2 || ^3", - "ramsey/uuid": "^3 || ^4" - }, - "conflict": { - "amphp/byte-stream": "<1.5.1" + "jms/serializer": "^1 | ^2 | ^3", + "php": ">=7.1.3", + "ramsey/uuid": "^3 | ^4", + "symfony/mime": "^4.3 | ^5" }, "require-dev": { - "jetbrains/phpstorm-attributes": "^1", - "phpunit/phpunit": "^9.5.10", - "psalm/plugin-phpunit": "^0.16.1", - "squizlabs/php_codesniffer": "^3.6.2", - "vimeo/psalm": "^4.15" + "phpunit/phpunit": "^7 | ^8 | ^9" }, "type": "library", "autoload": { - "psr-4": { - "Qameta\\Allure\\": "src", - "Yandex\\Allure\\Adapter\\": "src/Legacy" + "psr-0": { + "Yandex": [ + "src/", + "test/" + ] } }, "notification-url": "https://packagist.org/downloads/", @@ -121,31 +105,25 @@ ], "authors": [ { - "name": "Dmitry Baev", - "email": "baev.dm@gmail.com", - "role": "Developer" - }, - { - "name": "Edward Surov", - "email": "zoohie@gmail.com", + "name": "Ivan Krutov", + "email": "vania-pooh@yandex-team.ru", "role": "Developer" } ], - "description": "Allure PHP commons", + "description": "PHP API for Allure adapter", "homepage": "http://allure.qatools.ru/", "keywords": [ "allure", - "commons", + "api", "php", - "report", - "testing" + "report" ], "support": { - "email": "allure@qameta.io", - "issues": "https://github.com/allure-framework/allure-php-commons2/issues", - "source": "https://github.com/allure-framework/allure-php-commons" + "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": "2021-12-28T12:03:10+00:00" + "time": "2021-03-26T14:32:27+00:00" }, { "name": "aws/aws-crt-php", @@ -1936,6 +1914,163 @@ ], "time": "2021-10-05T13:56:00+00:00" }, + { + "name": "jms/metadata", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/metadata.git", + "reference": "a995e6cef6d6f56a6226e1616a519630e2ef0aeb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/a995e6cef6d6f56a6226e1616a519630e2ef0aeb", + "reference": "a995e6cef6d6f56a6226e1616a519630e2ef0aeb", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "require-dev": { + "doctrine/cache": "^1.0", + "doctrine/coding-standard": "^8.0", + "mikey179/vfsstream": "^1.6.7", + "phpunit/phpunit": "^8.5|^9.0", + "psr/container": "^1.0", + "symfony/cache": "^3.1|^4.0|^5.0", + "symfony/dependency-injection": "^3.1|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Metadata\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "Class/method/property metadata management in PHP", + "keywords": [ + "annotations", + "metadata", + "xml", + "yaml" + ], + "support": { + "issues": "https://github.com/schmittjoh/metadata/issues", + "source": "https://github.com/schmittjoh/metadata/tree/2.5.1" + }, + "time": "2021-08-04T19:32:08+00:00" + }, + { + "name": "jms/serializer", + "version": "3.15.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/serializer.git", + "reference": "9d6d9b81889904603383722ca0cd7f7999baeebc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/9d6d9b81889904603383722ca0cd7f7999baeebc", + "reference": "9d6d9b81889904603383722ca0cd7f7999baeebc", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.10.4", + "doctrine/instantiator": "^1.0.3", + "doctrine/lexer": "^1.1", + "jms/metadata": "^2.0", + "php": "^7.2||^8.0", + "phpstan/phpdoc-parser": "^0.4 || ^0.5 || ^1.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.1", + "doctrine/orm": "~2.1", + "doctrine/persistence": "^1.3.3|^2.0|^3.0", + "doctrine/phpcr-odm": "^1.3|^2.0", + "ext-pdo_sqlite": "*", + "jackalope/jackalope-doctrine-dbal": "^1.1.5", + "ocramius/proxy-manager": "^1.0|^2.0", + "phpstan/phpstan": "^0.12.65", + "phpunit/phpunit": "^8.0||^9.0", + "psr/container": "^1.0", + "symfony/dependency-injection": "^3.0|^4.0|^5.0|^6.0", + "symfony/expression-language": "^3.0|^4.0|^5.0|^6.0", + "symfony/filesystem": "^3.0|^4.0|^5.0|^6.0", + "symfony/form": "^3.0|^4.0|^5.0|^6.0", + "symfony/translation": "^3.0|^4.0|^5.0|^6.0", + "symfony/validator": "^3.1.9|^4.0|^5.0|^6.0", + "symfony/yaml": "^3.3|^4.0|^5.0|^6.0", + "twig/twig": "~1.34|~2.4|^3.0" + }, + "suggest": { + "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", + "symfony/cache": "Required if you like to use cache functionality.", + "symfony/yaml": "Required if you'd like to use the YAML metadata format." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "JMS\\Serializer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", + "homepage": "http://jmsyst.com/libs/serializer", + "keywords": [ + "deserialization", + "jaxb", + "json", + "serialization", + "xml" + ], + "support": { + "issues": "https://github.com/schmittjoh/serializer/issues", + "source": "https://github.com/schmittjoh/serializer/tree/3.15.0" + }, + "funding": [ + { + "url": "https://github.com/goetas", + "type": "github" + } + ], + "time": "2021-10-14T20:02:48+00:00" + }, { "name": "justinrainbow/json-schema", "version": "5.2.11", @@ -2898,6 +3033,55 @@ }, "time": "2021-09-10T09:02:12+00:00" }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/dbc093d7af60eff5cd575d2ed761b15ed40bd08e", + "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.2.0" + }, + "time": "2021-09-16T20:46:02+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "9.2.7", @@ -7707,7 +7891,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "~7.4.0||~8.1.0", + "php": ">7.3", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", diff --git a/etc/config/codeception.dist.yml b/etc/config/codeception.dist.yml index cc6a44b14..30697dc8f 100755 --- a/etc/config/codeception.dist.yml +++ b/etc/config/codeception.dist.yml @@ -15,9 +15,9 @@ extensions: enabled: - Magento\FunctionalTestingFramework\Codeception\Subscriber\Console - Magento\FunctionalTestingFramework\Extension\TestContextExtension - - Qameta\Allure\Codeception\AllureCodeception + - Magento\FunctionalTestingFramework\Allure\Adapter\MagentoAllureAdapter config: - Qameta\Allure\Codeception\AllureCodeception: + Magento\FunctionalTestingFramework\Allure\Adapter\MagentoAllureAdapter: deletePreviousResults: false outputDirectory: allure-results ignoredAnnotations: diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 4f240a3bd..75d91bd1c 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -24,6 +24,7 @@ use Magento\FunctionalTestingFramework\Module\Util\ModuleUtils; use Magento\FunctionalTestingFramework\Util\Path\UrlFormatter; use Magento\FunctionalTestingFramework\Util\ConfigSanitizerUtil; +use Qameta\Allure\Allure; use Yandex\Allure\Adapter\AllureException; use Magento\FunctionalTestingFramework\DataTransport\Protocol\CurlTransport; use Yandex\Allure\Adapter\Support\AttachmentSupport; @@ -148,6 +149,9 @@ class MagentoWebDriver extends WebDriver public function _initialize() { $this->config = ConfigSanitizerUtil::sanitizeWebDriverConfig($this->config); + Allure::getLifecycleConfigurator()->setOutputDirectory( + realpath(PROJECT_ROOT . '/dev/tests/acceptance/tests/_output/allure-results') + ); parent::_initialize(); $this->cleanJsError(); } From 88797adc72d3b9c37389c94ff0d19aeb29f22fa9 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 12 Oct 2022 11:42:27 +0530 Subject: [PATCH 297/674] Removed 7.3 php check from build --- .github/workflows/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4a567c7c4..e171fa1db 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', '7.4', '8.0', '8.1'] + php-versions: ['7.4', '8.0', '8.1'] steps: - uses: actions/checkout@v2 @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3', '7.4', '8.0', '8.1'] + php-versions: ['7.4', '8.0', '8.1'] steps: - uses: actions/checkout@v2 @@ -118,7 +118,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3', '7.4', '8.0', '8.1'] + php-versions: ['7.4', '8.0', '8.1'] services: chrome: From 17fab5a1a6a8741b016e360dbc66733b649e4632 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 12 Oct 2022 11:43:36 +0530 Subject: [PATCH 298/674] Removed 7.3 php check from build --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e171fa1db..dc79806d7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,7 +54,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3', '7.4', '8.0', '8.1'] + php-versions: ['7.4', '8.0', '8.1'] steps: - uses: actions/checkout@v2 From 10c1fb20dd30180a5805edeb12e2db57a7d17ef0 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 12 Oct 2022 12:10:28 +0530 Subject: [PATCH 299/674] renamed static check --- ...nGroupArgumentsCheck.php => ActionGroupStandardsCheck.php} | 4 ++-- .../StaticCheck/StaticChecksList.php | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) rename src/Magento/FunctionalTestingFramework/StaticCheck/{ActionGroupArgumentsCheck.php => ActionGroupStandardsCheck.php} (98%) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php similarity index 98% rename from src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php rename to src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php index f789d2e42..e5dc2f4d5 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupArgumentsCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php @@ -20,10 +20,10 @@ * Class ActionGroupArgumentsCheck * @package Magento\FunctionalTestingFramework\StaticCheck */ -class ActionGroupArgumentsCheck implements StaticCheckInterface +class ActionGroupStandardsCheck implements StaticCheckInterface { const ACTIONGROUP_NAME_REGEX_PATTERN = '/<actionGroup name=["\']([^\'"]*)/'; - const ERROR_LOG_FILENAME = 'mftf-arguments-checks'; + const ERROR_LOG_FILENAME = 'mftf-standards-checks'; const ERROR_LOG_MESSAGE = 'MFTF Action Group Unused Arguments Check'; const STEP_KEY_REGEX_PATTERN = '/stepKey=["\']([^\'"]*)/'; diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php index bc0a03fc0..fac893e51 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php @@ -20,7 +20,6 @@ class StaticChecksList implements StaticCheckListInterface const PAUSE_ACTION_USAGE_CHECK_NAME = 'pauseActionUsage'; const CREATED_DATA_FROM_OUTSIDE_ACTIONGROUP = 'createdDataFromOutsideActionGroup'; const UNUSED_ENTITY_CHECK = 'unusedEntityCheck'; - const DUPLICATE_STEP_KEYS = 'duplicateStepKeys'; const STATIC_RESULTS = 'tests' . DIRECTORY_SEPARATOR .'_output' . DIRECTORY_SEPARATOR . 'static-results'; /** @@ -47,13 +46,12 @@ public function __construct(array $checks = []) { $this->checks = [ 'testDependencies' => new TestDependencyCheck(), - 'actionGroupArguments' => new ActionGroupArgumentsCheck(), + 'actionGroupStandards' => new ActionGroupStandardsCheck(), self::DEPRECATED_ENTITY_USAGE_CHECK_NAME => new DeprecatedEntityUsageCheck(), 'annotations' => new AnnotationsCheck(), self::PAUSE_ACTION_USAGE_CHECK_NAME => new PauseActionUsageCheck(), self::UNUSED_ENTITY_CHECK => new UnusedEntityCheck(), self::CREATED_DATA_FROM_OUTSIDE_ACTIONGROUP => new CreatedDataFromOutsideActionGroupCheck(), - self::DUPLICATE_STEP_KEYS => new DuplicateStepKeysCheck() ] + $checks; // Static checks error files directory From 352d53a6f891ec2b84c9986bfb667697d2e95f1c Mon Sep 17 00:00:00 2001 From: Rajesh Kumar <glo71317@adobe.com> Date: Wed, 12 Oct 2022 12:23:33 +0530 Subject: [PATCH 300/674] AC-2660::Fixed the package issue --- composer.json | 1 + composer.lock | 140 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 140 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 0161b4883..8e24efc77 100755 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ "ext-json": "*", "ext-openssl": "*", "allure-framework/allure-codeception": "^1.4", + "allure-framework/allure-phpunit": "^2", "aws/aws-sdk-php": "^3.132", "codeception/codeception": "^4.1", "codeception/module-asserts": "^1.1", diff --git a/composer.lock b/composer.lock index 1f79506a8..786888196 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": "075f7ef8a19879334ba1e0443f4e9679", + "content-hash": "28290f8752fc3852a9fd55021b4db466", "packages": [ { "name": "allure-framework/allure-codeception", @@ -125,6 +125,144 @@ }, "time": "2021-03-26T14:32:27+00:00" }, + { + "name": "allure-framework/allure-php-commons", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/allure-framework/allure-php-commons2.git", + "reference": "946e375e90cce9e43d1622890fb5a312ec8086bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/946e375e90cce9e43d1622890fb5a312ec8086bb", + "reference": "946e375e90cce9e43d1622890fb5a312ec8086bb", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.12", + "ext-json": "*", + "php": "^8", + "psr/log": "^1 || ^2 || ^3", + "ramsey/uuid": "^3 || ^4" + }, + "conflict": { + "amphp/byte-stream": "<1.5.1" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1", + "phpunit/phpunit": "^9.5.10", + "psalm/plugin-phpunit": "^0.16.1", + "squizlabs/php_codesniffer": "^3.6.2", + "vimeo/psalm": "^4.15" + }, + "type": "library", + "autoload": { + "psr-4": { + "Qameta\\Allure\\": "src", + "Yandex\\Allure\\Adapter\\": "src/Legacy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Dmitry Baev", + "email": "baev.dm@gmail.com", + "role": "Developer" + }, + { + "name": "Edward Surov", + "email": "zoohie@gmail.com", + "role": "Developer" + } + ], + "description": "Allure PHP commons", + "homepage": "http://allure.qatools.ru/", + "keywords": [ + "allure", + "commons", + "php", + "report", + "testing" + ], + "support": { + "email": "allure@qameta.io", + "issues": "https://github.com/allure-framework/allure-php-commons2/issues", + "source": "https://github.com/allure-framework/allure-php-commons" + }, + "time": "2021-12-28T12:03:10+00:00" + }, + { + "name": "allure-framework/allure-phpunit", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/allure-framework/allure-phpunit.git", + "reference": "3884842467bcba9607db9d7aa69b82dcf0424218" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/allure-framework/allure-phpunit/zipball/3884842467bcba9607db9d7aa69b82dcf0424218", + "reference": "3884842467bcba9607db9d7aa69b82dcf0424218", + "shasum": "" + }, + "require": { + "allure-framework/allure-php-commons": "^2", + "php": "^8", + "phpunit/phpunit": "^9" + }, + "conflict": { + "amphp/byte-stream": "<1.5.1" + }, + "require-dev": { + "brianium/paratest": "^6.4.1", + "psalm/plugin-phpunit": "^0.16.1", + "squizlabs/php_codesniffer": "^3.6.2", + "vimeo/psalm": "^4.16.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Qameta\\Allure\\PHPUnit\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Ivan Krutov", + "email": "vania-pooh@yandex-team.ru", + "role": "Developer" + }, + { + "name": "Edward Surov", + "email": "zoohie@gmail.com", + "role": "Developer" + } + ], + "description": "Allure PHPUnit integration", + "homepage": "http://allure.qatools.ru/", + "keywords": [ + "allure", + "attachments", + "cases", + "phpunit", + "report", + "steps", + "testing" + ], + "support": { + "email": "allure@qameta.io", + "issues": "https://github.com/allure-framework/allure-phpunit/issues", + "source": "https://github.com/allure-framework/allure-phpunit" + }, + "time": "2021-12-29T11:34:16+00:00" + }, { "name": "aws/aws-crt-php", "version": "v1.0.2", From 8f98592270d786b4bc3083c1aceb1f53b067c6fc Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Wed, 12 Oct 2022 15:20:49 +0530 Subject: [PATCH 301/674] Delete DuplicateStepKeysCheck.php --- .../StaticCheck/DuplicateStepKeysCheck.php | 213 ------------------ 1 file changed, 213 deletions(-) delete mode 100644 src/Magento/FunctionalTestingFramework/StaticCheck/DuplicateStepKeysCheck.php diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/DuplicateStepKeysCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/DuplicateStepKeysCheck.php deleted file mode 100644 index 4f6d94da7..000000000 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/DuplicateStepKeysCheck.php +++ /dev/null @@ -1,213 +0,0 @@ -<?php -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\FunctionalTestingFramework\StaticCheck; - -use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; -use InvalidArgumentException; -use Exception; -use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; -use Magento\FunctionalTestingFramework\Exceptions\XmlException; -use Magento\FunctionalTestingFramework\Page\Objects\SectionObject; -use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; -use Magento\FunctionalTestingFramework\Page\Objects\ElementObject; -use Magento\FunctionalTestingFramework\Test\Objects\ActionGroupObject; -use Magento\FunctionalTestingFramework\Page\Objects\PageObject; -use Magento\FunctionalTestingFramework\Test\Objects\TestObject; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Finder\Finder; -use Magento\FunctionalTestingFramework\Util\Script\ScriptUtil; -use Magento\FunctionalTestingFramework\DataGenerator\Handlers\OperationDefinitionObjectHandler; -use Magento\FunctionalTestingFramework\DataGenerator\Objects\OperationDefinitionObject; -use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler; -use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject; -use Symfony\Component\Finder\SplFileInfo; -use DOMNodeList; -use DOMElement; - -/** - * Class CreatedDataFromOutsideActionGroupCheck - * @package Magento\FunctionalTestingFramework\StaticCheck - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - */ -class DuplicateStepKeysCheck implements StaticCheckInterface -{ - const ERROR_LOG_FILENAME = 'duplicate-step-keys'; - const ERROR_LOG_MESSAGE = 'Duplicate Step Key Check'; - const STEP_KEY_REGEX_PATTERN = '/stepKey=["\']([^\'"]*)/'; - /** - * Array containing all errors found after running the execute() function - * - * @var array - */ - private $errors = []; - - /** - * String representing the output summary found after running the execute() function - * - * @var string - */ - private $output; - - /** - * ScriptUtil instance - * - * @var ScriptUtil - */ - private $scriptUtil; - - /** - * Checks test dependencies, determined by references in tests versus the - * dependencies listed in the Magento module - * - * @param InputInterface $input - * @return void - * @throws Exception - */ - public function execute(InputInterface $input) - { - $this->scriptUtil = new ScriptUtil(); - $this->loadAllXmlFiles($input); - $this->errors += $this->findReferenceErrorsInFiles($this->actionGroupXmlFile); - // hold on to the output and print any errors to a file - $this->output = $this->scriptUtil->printErrorsToFile( - $this->errors, - StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', - self::ERROR_LOG_MESSAGE - ); - } - - /** - * 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 Dependency errors found." - * - * @return string - */ - public function getOutput() - { - return $this->output; - } - - /** - * Read all XML files for scanning - * - * @param InputInterface $input - * @return void - * @throws Exception - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - */ - private function loadAllXmlFiles($input) - { - $modulePaths = []; - $path = $input->getOption('path'); - if ($path) { - if (!realpath($path)) { - throw new InvalidArgumentException('Invalid --path option: ' . $path); - } - MftfApplicationConfig::create( - true, - MftfApplicationConfig::UNIT_TEST_PHASE, - false, - MftfApplicationConfig::LEVEL_DEFAULT, - true - ); - $modulePaths[] = realpath($path); - } else { - $modulePaths = $this->scriptUtil->getAllModulePaths(); - } - - // These files can contain references to other entities - $this->actionGroupXmlFile = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'ActionGroup'); - $this->testXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'Test'); - $this->suiteXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'Suite'); - - if (empty($this->actionGroupXmlFile)) { - if ($path) { - throw new InvalidArgumentException( - 'Invalid --path option: ' - . $path - . PHP_EOL - . 'Please make sure --path points to a valid MFTF Test Module.' - ); - } elseif (empty($this->rootSuiteXmlFiles)) { - throw new TestFrameworkException('No xml file to scan.'); - } - } - } - - /** - * Find reference errors in set of action files - * - * @param Finder $files - * @return array - * @throws XmlException - */ - private function findReferenceErrorsInFiles($files) - { - $testErrors = []; - /** @var SplFileInfo $filePath */ - foreach ($files as $filePath) { - $actionGroupReferencesDataArray = []; - $contents = file_get_contents($filePath); - preg_match_all(self::STEP_KEY_REGEX_PATTERN, $contents, $actionGroupReferences); - foreach ($actionGroupReferences[0] as $actionGroupReferencesData) { - $actionGroupReferencesDataArray[] = trim( - str_replace( - ['stepKey', '='], - [""], - $actionGroupReferencesData - ) - ).'"'; - } - $duplicateStepKeys = array_unique( - array_diff_assoc( - $actionGroupReferencesDataArray, - array_unique( - $actionGroupReferencesDataArray - ) - ) - ); - unset($actionGroupReferencesDataArray); - if (isset($duplicateStepKeys) && count($duplicateStepKeys) > 0) { - $testErrors = array_merge($testErrors, $this->setErrorOutput($duplicateStepKeys, $filePath)); - } - } - return $testErrors; - } - - /** - * Build and return error output for violating references - * - * @param array $violatingReferences - * @param SplFileInfo $path - * @return mixed - */ - private function setErrorOutput($violatingReferences, $path) - { - $testErrors = []; - - $filePath = StaticChecksList::getFilePath($path->getRealPath()); - - if (!empty($violatingReferences)) { - // Build error output - $errorOutput = "\nFile \"{$filePath}\""; - foreach ($violatingReferences as $stepKey) { - $errorOutput .= "\n\t has duplicate stepKey(s): ". $stepKey; - } - $testErrors[$filePath][] = $errorOutput; - } - return $testErrors; - } -} From 66eada58e21877994c3203705f8b1e1e7d2e864f Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Wed, 12 Oct 2022 15:21:15 +0530 Subject: [PATCH 302/674] Update StaticChecksList.php --- .../FunctionalTestingFramework/StaticCheck/StaticChecksList.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php index fac893e51..15afec527 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php @@ -46,7 +46,7 @@ public function __construct(array $checks = []) { $this->checks = [ 'testDependencies' => new TestDependencyCheck(), - 'actionGroupStandards' => new ActionGroupStandardsCheck(), + 'actionGroupArguments' => new ActionGroupStandardsCheck(), self::DEPRECATED_ENTITY_USAGE_CHECK_NAME => new DeprecatedEntityUsageCheck(), 'annotations' => new AnnotationsCheck(), self::PAUSE_ACTION_USAGE_CHECK_NAME => new PauseActionUsageCheck(), From f64e411b24b861a011b7f72868fdcd75554378ee Mon Sep 17 00:00:00 2001 From: Ji Lu <jilu1@adobe.com> Date: Tue, 4 Oct 2022 22:20:33 -0500 Subject: [PATCH 303/674] ACQE-4122: fixed an issue in test generation with config parallel by group --- .../Util/Sorter/ParallelGroupSorterTest.php | 42 +++++++++++++++++++ .../Util/Sorter/ParallelGroupSorter.php | 4 ++ 2 files changed, 46 insertions(+) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php index 5429ec92a..03d4953cb 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php @@ -378,6 +378,48 @@ public function testTestsAndSuitesSplitByMinGroupNumber(): void } } + /** + * Test splitting tests and suites when none of the suites has test. + * For example, this can happen when --filter option is used. + * + * @return void + * @throws FastFailException + */ + public function testTestsAndSuitesSplitByGroupNumberSuiteNoTest(): void + { + // mock tests for test object handler. + $this->createMockForTest(0); + + // create test to size array + $sampleTestArray = [ + 'test1' => 1, + 'test2' => 125, + 'test3' => 35 + ]; + + // create mock suite references + $sampleSuiteArray = [ + 'mockSuite1' => [], + 'mockSuite2' => [], + ]; + + // perform sort + $testSorter = new ParallelGroupSorter(); + $actualResult = $testSorter->getTestsGroupedByFixedGroupCount($sampleSuiteArray, $sampleTestArray, 3); + // verify the resulting groups + $this->assertCount(3, $actualResult); + + $expectedResults = [ + 1 => ['test2'], + 2 => ['test3'], + 3 => ['test1'] + ]; + + foreach ($actualResult as $groupNum => $group) { + $this->assertEquals($expectedResults[$groupNum], array_keys($group)); + } + } + /** * Test splitting tests and suites with invalid group number. * diff --git a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php index 74f5af3ca..d18626851 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php +++ b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php @@ -128,6 +128,10 @@ public function getTestsGroupedByFixedGroupCount($suiteConfiguration, $testNameT */ private function getSuiteGroupCounts($suiteNameToTestSize, $testNameToSize, $groupTotal) { + if (empty($suiteNameToTestSize)) { + return []; + } + // Calculate the minimum possible group time $suiteNameToSize = $this->getSuiteToSize($suiteNameToTestSize); $minGroupTime = ceil((array_sum($testNameToSize) + array_sum($suiteNameToSize)) / $groupTotal); From c365c6eaa53c4619ffd7ebd03f69aa4d17726100 Mon Sep 17 00:00:00 2001 From: glo00108 <glo00108@adobe.com> Date: Thu, 13 Oct 2022 16:07:43 +0530 Subject: [PATCH 304/674] ACQE-3401 Remove environment variable MAGENTO_ADMIN_PASSWORD --- etc/config/.env.example | 1 - .../DataTransport/AdminFormExecutor.php | 5 ++++- .../DataTransport/Auth/WebApiAuth.php | 7 +++++-- .../FunctionalTestingFramework/Util/ModuleResolver.php | 5 ++++- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/etc/config/.env.example b/etc/config/.env.example index 1c181cf8f..5596217e9 100644 --- a/etc/config/.env.example +++ b/etc/config/.env.example @@ -10,7 +10,6 @@ MAGENTO_BASE_URL=http://devdocs.magento.com/ #*** Set the Admin Username and Password for your Magento instance ***# MAGENTO_BACKEND_NAME=admin MAGENTO_ADMIN_USERNAME=admin -MAGENTO_ADMIN_PASSWORD=123123q #*** Path to CLI entry point and command parameter name. Uncomment and change if folder structure differs from standard Magento installation #MAGENTO_CLI_COMMAND_PATH=dev/tests/acceptance/utils/command.php diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/AdminFormExecutor.php b/src/Magento/FunctionalTestingFramework/DataTransport/AdminFormExecutor.php index 5639ee8d7..0573f48ce 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/AdminFormExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/AdminFormExecutor.php @@ -6,6 +6,7 @@ namespace Magento\FunctionalTestingFramework\DataTransport; +use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; use Magento\FunctionalTestingFramework\Util\MftfGlobals; use Magento\FunctionalTestingFramework\DataTransport\Protocol\CurlInterface; use Magento\FunctionalTestingFramework\DataTransport\Protocol\CurlTransport; @@ -73,9 +74,11 @@ private function authorize() // Authenticate admin user $authUrl = MftfGlobals::getBackendBaseUrl() . 'admin/auth/login/'; + $encryptedSecret = CredentialStore::getInstance()->getSecret('magento/MAGENTO_ADMIN_PASSWORD'); + $secret = CredentialStore::getInstance()->decryptSecretValue($encryptedSecret); $data = [ 'login[username]' => getenv('MAGENTO_ADMIN_USERNAME'), - 'login[password]' => getenv('MAGENTO_ADMIN_PASSWORD'), + 'login[password]' => $secret, 'form_key' => $this->formKey, ]; $this->transport->write($authUrl, $data, CurlInterface::POST); diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php index bc4e52571..2e7ff5e48 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php @@ -6,6 +6,7 @@ namespace Magento\FunctionalTestingFramework\DataTransport\Auth; +use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; use Magento\FunctionalTestingFramework\Exceptions\FastFailException; use Magento\FunctionalTestingFramework\Util\MftfGlobals; use Magento\FunctionalTestingFramework\DataTransport\Protocol\CurlInterface; @@ -57,14 +58,16 @@ class WebApiAuth public static function getAdminToken($username = null, $password = null) { $login = $username ?? getenv('MAGENTO_ADMIN_USERNAME'); - $password = $password ?? getenv('MAGENTO_ADMIN_PASSWORD'); + $encryptedSecret = CredentialStore::getInstance()->getSecret('magento/MAGENTO_ADMIN_PASSWORD'); + $secret = CredentialStore::getInstance()->decryptSecretValue($encryptedSecret); + $password = $password ?? $secret; if (!$login || !$password) { $message = 'Cannot retrieve API token without credentials. Please fill out .env.'; $context = [ 'MAGENTO_BASE_URL' => getenv('MAGENTO_BASE_URL'), 'MAGENTO_BACKEND_BASE_URL' => getenv('MAGENTO_BACKEND_BASE_URL'), 'MAGENTO_ADMIN_USERNAME' => getenv('MAGENTO_ADMIN_USERNAME'), - 'MAGENTO_ADMIN_PASSWORD' => getenv('MAGENTO_ADMIN_PASSWORD'), + 'MAGENTO_ADMIN_PASSWORD' => $secret, ]; throw new FastFailException($message, $context); } diff --git a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php index b330ac84b..2cbed00fc 100644 --- a/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php +++ b/src/Magento/FunctionalTestingFramework/Util/ModuleResolver.php @@ -7,6 +7,7 @@ namespace Magento\FunctionalTestingFramework\Util; use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; +use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; use Magento\FunctionalTestingFramework\Exceptions\FastFailException; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\Util\ModuleResolver\ModuleResolverService; @@ -198,10 +199,12 @@ public function getEnabledModules() if (!$response) { $message = "Could not retrieve Modules from Magento Instance."; + $encryptedSecret = CredentialStore::getInstance()->getSecret('magento/MAGENTO_ADMIN_PASSWORD'); + $secret = CredentialStore::getInstance()->decryptSecretValue($encryptedSecret); $context = [ "Admin Module List Url" => $url, "MAGENTO_ADMIN_USERNAME" => getenv("MAGENTO_ADMIN_USERNAME"), - "MAGENTO_ADMIN_PASSWORD" => getenv("MAGENTO_ADMIN_PASSWORD"), + "MAGENTO_ADMIN_PASSWORD" => $secret, ]; throw new FastFailException($message, $context); } From 1230c8786790e97b5a5e16590091da54ad0f9e9e Mon Sep 17 00:00:00 2001 From: Petar <petar@customgento.com> Date: Thu, 13 Oct 2022 13:24:37 +0200 Subject: [PATCH 305/674] Add magento admin password to credentials example --- etc/config/.credentials.example | 1 + 1 file changed, 1 insertion(+) diff --git a/etc/config/.credentials.example b/etc/config/.credentials.example index 25400bd63..fe6dd19a9 100644 --- a/etc/config/.credentials.example +++ b/etc/config/.credentials.example @@ -1,4 +1,5 @@ magento/tfa/OTP_SHARED_SECRET +magento/MAGENTO_ADMIN_PASSWORD #magento/carriers_fedex_account= #magento/carriers_fedex_meter_number= From ac4bbf4054c5c879abfa43972a1d89ee5bc8ef7b Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 13 Oct 2022 17:38:39 +0530 Subject: [PATCH 306/674] fixed unit test --- .../FunctionalTestFramework/Util/ModuleResolverTest.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php index 25fd20d73..d6c0f04e2 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php @@ -16,6 +16,8 @@ use ReflectionProperty; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\TestLoggingUtil; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; + /** * Class ModuleResolverTest @@ -807,7 +809,7 @@ public function testGetModulePathsNoAdminToken(): void $this->setMockResolverProperties($resolver); // Cannot Generate if no --force was passed in and no Admin Token is returned successfully - $this->expectException(FastFailException::class); + $this->expectException(TestFrameworkException::class); $resolver->getModulesPath(); } @@ -859,7 +861,7 @@ public function testGetAdminTokenWithMissingEnv(): void $this->setMockResolverProperties($resolver); // Expect exception - $this->expectException(FastFailException::class); + $this->expectException(TestFrameworkException::class); $resolver->getModulesPath(); } @@ -879,7 +881,7 @@ public function testGetAdminTokenWithBadResponse(): void $this->setMockResolverProperties($resolver); // Expect exception - $this->expectException(FastFailException::class); + $this->expectException(TestFrameworkException::class); $resolver->getModulesPath(); } From 4714912caefc86a4842c6fdd6a404e2814662a48 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 13 Oct 2022 17:40:05 +0530 Subject: [PATCH 307/674] fixed unit test --- .../Magento/FunctionalTestFramework/Util/ModuleResolverTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php index d6c0f04e2..efcfad10d 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php @@ -18,7 +18,6 @@ use tests\unit\Util\TestLoggingUtil; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; - /** * Class ModuleResolverTest */ From cc4819e5779df256175701a8bd1817990444f651 Mon Sep 17 00:00:00 2001 From: glo00108 <glo00108@adobe.com> Date: Fri, 14 Oct 2022 10:09:55 +0530 Subject: [PATCH 308/674] added credentials file --- .gitignore | 3 +- dev/.credentials | 78 +++++++++++++++++++ dev/.credentials.example | 78 +++++++++++++++++++ .../Util/ModuleResolverTest.php | 7 +- docs/configuration.md | 12 +-- 5 files changed, 161 insertions(+), 17 deletions(-) create mode 100644 dev/.credentials create mode 100644 dev/.credentials.example diff --git a/.gitignore b/.gitignore index 1ab55a2ff..28d66e825 100755 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,5 @@ dev/tests/docs/* dev/tests/_output dev/tests/functional.suite.yml /v2/ -dev/.credentials.example dev/tests/.phpunit.result.cache -dev/tests/verification/TestModule/Test/testFile.xml \ No newline at end of file +dev/tests/verification/TestModule/Test/testFile.xml diff --git a/dev/.credentials b/dev/.credentials new file mode 100644 index 000000000..aeeda4fc6 --- /dev/null +++ b/dev/.credentials @@ -0,0 +1,78 @@ +#magento/tfa/OTP_SHARED_SECRET= + +magento/MAGENTO_ADMIN_PASSWORD=123123q + +#magento/carriers_fedex_account= +#magento/carriers_fedex_meter_number= +#magento/carriers_fedex_key= +#magento/carriers_fedex_password= + +#magento/carriers_ups_password= +#magento/carriers_ups_username= +#magento/carriers_ups_access_license_number= +#magento/carriers_ups_shipper_number= + +#magento/carriers_usps_userid= +#magento/carriers_usps_password= + +#magento/carriers_dhl_id_us= +#magento/carriers_dhl_password_us= +#magento/carriers_dhl_account_us= + +#magento/carriers_dhl_id_eu= +#magento/carriers_dhl_password_eu= +#magento/carriers_dhl_account_eu= + + +#magento/payment_authorizenet_login= +#magento/payment_authorizenet_trans_key= +#magento/payment_authorizenet_trans_md5= + +#magento/authorizenet_fraud_review_login= +#magento/authorizenet_fraud_review_trans_key= +#magento/authorizenet_fraud_review_md5= + +#magento/braintree_enabled_fraud_merchant_account_id= +#magento/braintree_enabled_fraud_merchant_id= +#magento/braintree_enabled_fraud_public_key= +#magento/braintree_enabled_fraud_private_key= + +#magento/braintree_disabled_fraud_merchant_account_id= +#magento/braintree_disabled_fraud_merchant_id= +#magento/braintree_disabled_fraud_public_key= +#magento/braintree_disabled_fraud_private_key= + +#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_business_account= +#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_api_username= +#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_api_password= +#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_api_signature= +#magento/payment_paypal_express_merchant_id= + +#magento/payflow_pro_fraud_protection_enabled_business_account= +#magento/payflow_pro_fraud_protection_enabled_partner= +#magento/payflow_pro_fraud_protection_enabled_user= +#magento/payflow_pro_fraud_protection_enabled_pwd= +#magento/payflow_pro_fraud_protection_enabled_vendor= + +#magento/payflow_pro_business_account= +#magento/payflow_pro_partner= +#magento/payflow_pro_user= +#magento/payflow_pro_pwd= +#magento/payflow_pro_vendor= + +#magento/payflow_link_business_account_email= +#magento/payflow_link_partner= +#magento/payflow_link_user= +#magento/payflow_link_password= +#magento/payflow_link_vendor= + +#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_business_account= +#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_api_username= +#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_api_password= +#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_api_signature= + +#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_business_account= +#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_api_username= +#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_api_password= +#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_api_signature= + diff --git a/dev/.credentials.example b/dev/.credentials.example new file mode 100644 index 000000000..14720d0ab --- /dev/null +++ b/dev/.credentials.example @@ -0,0 +1,78 @@ +#magento/tfa/OTP_SHARED_SECRET + +magento/MAGENTO_ADMIN_PASSWORD=123123q + +#magento/carriers_fedex_account= +#magento/carriers_fedex_meter_number= +#magento/carriers_fedex_key= +#magento/carriers_fedex_password= + +#magento/carriers_ups_password= +#magento/carriers_ups_username= +#magento/carriers_ups_access_license_number= +#magento/carriers_ups_shipper_number= + +#magento/carriers_usps_userid= +#magento/carriers_usps_password= + +#magento/carriers_dhl_id_us= +#magento/carriers_dhl_password_us= +#magento/carriers_dhl_account_us= + +#magento/carriers_dhl_id_eu= +#magento/carriers_dhl_password_eu= +#magento/carriers_dhl_account_eu= + + +#magento/payment_authorizenet_login= +#magento/payment_authorizenet_trans_key= +#magento/payment_authorizenet_trans_md5= + +#magento/authorizenet_fraud_review_login= +#magento/authorizenet_fraud_review_trans_key= +#magento/authorizenet_fraud_review_md5= + +#magento/braintree_enabled_fraud_merchant_account_id= +#magento/braintree_enabled_fraud_merchant_id= +#magento/braintree_enabled_fraud_public_key= +#magento/braintree_enabled_fraud_private_key= + +#magento/braintree_disabled_fraud_merchant_account_id= +#magento/braintree_disabled_fraud_merchant_id= +#magento/braintree_disabled_fraud_public_key= +#magento/braintree_disabled_fraud_private_key= + +#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_business_account= +#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_api_username= +#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_api_password= +#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_api_signature= +#magento/payment_paypal_express_merchant_id= + +#magento/payflow_pro_fraud_protection_enabled_business_account= +#magento/payflow_pro_fraud_protection_enabled_partner= +#magento/payflow_pro_fraud_protection_enabled_user= +#magento/payflow_pro_fraud_protection_enabled_pwd= +#magento/payflow_pro_fraud_protection_enabled_vendor= + +#magento/payflow_pro_business_account= +#magento/payflow_pro_partner= +#magento/payflow_pro_user= +#magento/payflow_pro_pwd= +#magento/payflow_pro_vendor= + +#magento/payflow_link_business_account_email= +#magento/payflow_link_partner= +#magento/payflow_link_user= +#magento/payflow_link_password= +#magento/payflow_link_vendor= + +#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_business_account= +#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_api_username= +#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_api_password= +#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_api_signature= + +#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_business_account= +#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_api_username= +#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_api_password= +#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_api_signature= + diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php index efcfad10d..25fd20d73 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php @@ -16,7 +16,6 @@ use ReflectionProperty; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\TestLoggingUtil; -use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; /** * Class ModuleResolverTest @@ -808,7 +807,7 @@ public function testGetModulePathsNoAdminToken(): void $this->setMockResolverProperties($resolver); // Cannot Generate if no --force was passed in and no Admin Token is returned successfully - $this->expectException(TestFrameworkException::class); + $this->expectException(FastFailException::class); $resolver->getModulesPath(); } @@ -860,7 +859,7 @@ public function testGetAdminTokenWithMissingEnv(): void $this->setMockResolverProperties($resolver); // Expect exception - $this->expectException(TestFrameworkException::class); + $this->expectException(FastFailException::class); $resolver->getModulesPath(); } @@ -880,7 +879,7 @@ public function testGetAdminTokenWithBadResponse(): void $this->setMockResolverProperties($resolver); // Expect exception - $this->expectException(TestFrameworkException::class); + $this->expectException(FastFailException::class); $resolver->getModulesPath(); } diff --git a/docs/configuration.md b/docs/configuration.md index 501b1d5e9..de7fd5859 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -52,16 +52,6 @@ Example: MAGENTO_ADMIN_USERNAME=admin ``` -### MAGENTO_ADMIN_PASSWORD - -The password that tests will use to log in to the Magento Admin page. - -Example: - -```conf -MAGENTO_ADMIN_PASSWORD=1234reTyt%$7 -``` - ## Advanced configuration Depending on the environment you use, you may need to configure MFTF more precisely by setting additional configuration parameters. @@ -362,7 +352,7 @@ WAIT_TIMEOUT=30 ### ENABLE_PAUSE Enables the ability to pause test execution at any point, and enter an interactive shell where you can try commands in action. -When pause is enabled, MFTF will generate pause() command in _failed() hook so that test will pause execution when failed. +When pause is enabled, MFTF will generate pause() command in _failed() hook so that test will pause execution when failed. ```conf ENABLE_PAUSE=true From e85e6d5bf94ef6af835fbe8490130e544b6529ac Mon Sep 17 00:00:00 2001 From: glo00108 <glo00108@adobe.com> Date: Fri, 14 Oct 2022 10:37:05 +0530 Subject: [PATCH 309/674] rollback changes --- .gitignore | 1 + dev/.credentials | 78 ---------------------------------------- dev/.credentials.example | 78 ---------------------------------------- 3 files changed, 1 insertion(+), 156 deletions(-) delete mode 100644 dev/.credentials delete mode 100644 dev/.credentials.example diff --git a/.gitignore b/.gitignore index 28d66e825..419218ba4 100755 --- a/.gitignore +++ b/.gitignore @@ -20,5 +20,6 @@ dev/tests/docs/* dev/tests/_output dev/tests/functional.suite.yml /v2/ +dev/.credentials.example dev/tests/.phpunit.result.cache dev/tests/verification/TestModule/Test/testFile.xml diff --git a/dev/.credentials b/dev/.credentials deleted file mode 100644 index aeeda4fc6..000000000 --- a/dev/.credentials +++ /dev/null @@ -1,78 +0,0 @@ -#magento/tfa/OTP_SHARED_SECRET= - -magento/MAGENTO_ADMIN_PASSWORD=123123q - -#magento/carriers_fedex_account= -#magento/carriers_fedex_meter_number= -#magento/carriers_fedex_key= -#magento/carriers_fedex_password= - -#magento/carriers_ups_password= -#magento/carriers_ups_username= -#magento/carriers_ups_access_license_number= -#magento/carriers_ups_shipper_number= - -#magento/carriers_usps_userid= -#magento/carriers_usps_password= - -#magento/carriers_dhl_id_us= -#magento/carriers_dhl_password_us= -#magento/carriers_dhl_account_us= - -#magento/carriers_dhl_id_eu= -#magento/carriers_dhl_password_eu= -#magento/carriers_dhl_account_eu= - - -#magento/payment_authorizenet_login= -#magento/payment_authorizenet_trans_key= -#magento/payment_authorizenet_trans_md5= - -#magento/authorizenet_fraud_review_login= -#magento/authorizenet_fraud_review_trans_key= -#magento/authorizenet_fraud_review_md5= - -#magento/braintree_enabled_fraud_merchant_account_id= -#magento/braintree_enabled_fraud_merchant_id= -#magento/braintree_enabled_fraud_public_key= -#magento/braintree_enabled_fraud_private_key= - -#magento/braintree_disabled_fraud_merchant_account_id= -#magento/braintree_disabled_fraud_merchant_id= -#magento/braintree_disabled_fraud_public_key= -#magento/braintree_disabled_fraud_private_key= - -#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_business_account= -#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_api_username= -#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_api_password= -#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_api_signature= -#magento/payment_paypal_express_merchant_id= - -#magento/payflow_pro_fraud_protection_enabled_business_account= -#magento/payflow_pro_fraud_protection_enabled_partner= -#magento/payflow_pro_fraud_protection_enabled_user= -#magento/payflow_pro_fraud_protection_enabled_pwd= -#magento/payflow_pro_fraud_protection_enabled_vendor= - -#magento/payflow_pro_business_account= -#magento/payflow_pro_partner= -#magento/payflow_pro_user= -#magento/payflow_pro_pwd= -#magento/payflow_pro_vendor= - -#magento/payflow_link_business_account_email= -#magento/payflow_link_partner= -#magento/payflow_link_user= -#magento/payflow_link_password= -#magento/payflow_link_vendor= - -#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_business_account= -#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_api_username= -#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_api_password= -#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_api_signature= - -#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_business_account= -#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_api_username= -#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_api_password= -#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_api_signature= - diff --git a/dev/.credentials.example b/dev/.credentials.example deleted file mode 100644 index 14720d0ab..000000000 --- a/dev/.credentials.example +++ /dev/null @@ -1,78 +0,0 @@ -#magento/tfa/OTP_SHARED_SECRET - -magento/MAGENTO_ADMIN_PASSWORD=123123q - -#magento/carriers_fedex_account= -#magento/carriers_fedex_meter_number= -#magento/carriers_fedex_key= -#magento/carriers_fedex_password= - -#magento/carriers_ups_password= -#magento/carriers_ups_username= -#magento/carriers_ups_access_license_number= -#magento/carriers_ups_shipper_number= - -#magento/carriers_usps_userid= -#magento/carriers_usps_password= - -#magento/carriers_dhl_id_us= -#magento/carriers_dhl_password_us= -#magento/carriers_dhl_account_us= - -#magento/carriers_dhl_id_eu= -#magento/carriers_dhl_password_eu= -#magento/carriers_dhl_account_eu= - - -#magento/payment_authorizenet_login= -#magento/payment_authorizenet_trans_key= -#magento/payment_authorizenet_trans_md5= - -#magento/authorizenet_fraud_review_login= -#magento/authorizenet_fraud_review_trans_key= -#magento/authorizenet_fraud_review_md5= - -#magento/braintree_enabled_fraud_merchant_account_id= -#magento/braintree_enabled_fraud_merchant_id= -#magento/braintree_enabled_fraud_public_key= -#magento/braintree_enabled_fraud_private_key= - -#magento/braintree_disabled_fraud_merchant_account_id= -#magento/braintree_disabled_fraud_merchant_id= -#magento/braintree_disabled_fraud_public_key= -#magento/braintree_disabled_fraud_private_key= - -#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_business_account= -#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_api_username= -#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_api_password= -#magento/payment_paypal_group_all_in_one_wpp_usuk_wpp_required_settings_wpp_and_express_checkout_api_signature= -#magento/payment_paypal_express_merchant_id= - -#magento/payflow_pro_fraud_protection_enabled_business_account= -#magento/payflow_pro_fraud_protection_enabled_partner= -#magento/payflow_pro_fraud_protection_enabled_user= -#magento/payflow_pro_fraud_protection_enabled_pwd= -#magento/payflow_pro_fraud_protection_enabled_vendor= - -#magento/payflow_pro_business_account= -#magento/payflow_pro_partner= -#magento/payflow_pro_user= -#magento/payflow_pro_pwd= -#magento/payflow_pro_vendor= - -#magento/payflow_link_business_account_email= -#magento/payflow_link_partner= -#magento/payflow_link_user= -#magento/payflow_link_password= -#magento/payflow_link_vendor= - -#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_business_account= -#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_api_username= -#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_api_password= -#magento/payment_paypal_group_all_in_one_payments_pro_hosted_solution_with_express_checkout_pphs_required_settings_pphs_required_settings_pphs_api_signature= - -#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_business_account= -#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_api_username= -#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_api_password= -#magento/payment_paypal_alternative_payment_methods_express_checkout_us_express_checkout_required_express_checkout_required_express_checkout_api_signature= - From b0ca2aed50b000a1d9dac61ff0ec43c3a46204c5 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 17 Oct 2022 11:16:24 +0530 Subject: [PATCH 310/674] update composer.json to reflect dropping support of php 7.3 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 0161b4883..fe4264d6a 100755 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "sort-packages": true }, "require": { - "php": ">7.3", + "php": ">7.4", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", From 5f2b9a0925df20b3ab1e7b33ab1151034a8556e6 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 18 Oct 2022 15:25:10 +0530 Subject: [PATCH 311/674] added exception --- .../DataTransport/Auth/WebApiAuth.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php index 2e7ff5e48..d2277ad21 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php @@ -58,9 +58,14 @@ class WebApiAuth public static function getAdminToken($username = null, $password = null) { $login = $username ?? getenv('MAGENTO_ADMIN_USERNAME'); - $encryptedSecret = CredentialStore::getInstance()->getSecret('magento/MAGENTO_ADMIN_PASSWORD'); - $secret = CredentialStore::getInstance()->decryptSecretValue($encryptedSecret); - $password = $password ?? $secret; + try { + $encryptedSecret = CredentialStore::getInstance()->getSecret('magento/MAGENTO_ADMIN_PASSWORD'); + $secret = CredentialStore::getInstance()->decryptSecretValue($encryptedSecret); + $password = $password ?? $secret; + } catch (TestFrameworkException $e) { + $message = "Password not found in credentials file"; + throw new FastFailException($message . $e->getMessage(), $e->getContext()); + } if (!$login || !$password) { $message = 'Cannot retrieve API token without credentials. Please fill out .env.'; $context = [ From 11fdd4c41507f2a43e2aac93d6e8e1effd74e644 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 18 Oct 2022 15:30:07 +0530 Subject: [PATCH 312/674] added exception --- .../FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php index d2277ad21..775dcc6e9 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php @@ -54,6 +54,7 @@ class WebApiAuth * @throws FastFailException * * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) */ public static function getAdminToken($username = null, $password = null) { From 53c3b1cbe71b507c1a89c80b3f84895be4b89ec0 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 19 Oct 2022 14:53:40 +0530 Subject: [PATCH 313/674] ACQE-4111 : 3.11.0 Deployment Release Checklist --- CHANGELOG.md | 19 +++++++++++++++++++ composer.json | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62c181c0b..76a162796 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,25 @@ Magento Functional Testing Framework Changelog ================================================ +3.11.0 +--------- +### Enhancements +* Composer updated to 2.4.2 version +* Static check for duplicate step keys in action group + + +### Fixes + +* Fixed incorrect MFTF test dependencies path + +3.10.2 +--------- + +### Fixes + +* Fixed admin credentials being output to console in WebAPIAuth +* Fixed links in docs + 3.10.3 --------- diff --git a/composer.json b/composer.json index 5c9f14d1d..555cff0a0 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": "3.10.3", + "version": "3.11.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { From 7e7434b78ebb4ce320f80d7b6422ead7b8d5d52b Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 19 Oct 2022 15:13:36 +0530 Subject: [PATCH 314/674] added new key point in changelog.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76a162796..e57e341da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Magento Functional Testing Framework Changelog ### Fixes * Fixed incorrect MFTF test dependencies path +* Removed PHP 7.3 build check from MFTF PR build as PHP 7.3 is no longer supported 3.10.2 --------- From dacbfea045d7c0bd372c4d0d1def80e3b567da39 Mon Sep 17 00:00:00 2001 From: Rajesh Kumar <glo71317@adobe.com> Date: Fri, 21 Oct 2022 16:26:05 +0530 Subject: [PATCH 315/674] AC-3005::Resolve the conflicts --- composer.lock | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.lock b/composer.lock index fa1c2174e..487a9ca77 100644 --- a/composer.lock +++ b/composer.lock @@ -993,7 +993,6 @@ } ], "time": "2022-06-19T11:31:27+00:00" - "time": "2022-06-19T11:31:27+00:00" }, { "name": "composer/composer", @@ -8191,7 +8190,7 @@ "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1.6|^2" }, - + "conflict": { "ext-psr": "<1.1|>=2", "symfony/config": "<5.3", From 795c8d98301a0c90c3f301efcad160c96e165dcb Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Fri, 21 Oct 2022 22:03:55 +0530 Subject: [PATCH 316/674] ACQE-4111 : Added appropriate error message --- .../StaticCheck/ActionGroupStandardsCheck.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php index e5dc2f4d5..646e1d752 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php @@ -119,7 +119,7 @@ private function findErrorsInFileSet($files) ); unset($actionGroupReferencesDataArray); if (isset($duplicateStepKeys) && count($duplicateStepKeys) > 0) { - throw new TestFrameworkException('Action group has duplicate step keys'); + throw new TestFrameworkException('Action group has duplicate step keys '.implode(",",array_unique($duplicateStepKeys))." File Path ".$filePath ); } /** @var DOMElement $actionGroup */ $actionGroup = $this->getActionGroupDomElement($contents); From e27e7dbfe1dad9fac7d80043de0a0473c5a2dd4c Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Fri, 21 Oct 2022 22:07:09 +0530 Subject: [PATCH 317/674] ACQE-4111 : Added appropriate error message --- .../StaticCheck/ActionGroupStandardsCheck.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php index 646e1d752..c28835084 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php @@ -119,7 +119,8 @@ private function findErrorsInFileSet($files) ); unset($actionGroupReferencesDataArray); if (isset($duplicateStepKeys) && count($duplicateStepKeys) > 0) { - throw new TestFrameworkException('Action group has duplicate step keys '.implode(",",array_unique($duplicateStepKeys))." File Path ".$filePath ); + throw new TestFrameworkException('Action group has duplicate step keys ' + .implode(",", array_unique($duplicateStepKeys))." File Path ".$filePath); } /** @var DOMElement $actionGroup */ $actionGroup = $this->getActionGroupDomElement($contents); From b4b79bb6b5a390000fc7d93edba91c5618d64069 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 24 Oct 2022 13:09:11 +0530 Subject: [PATCH 318/674] ACQE-4111 : Exclude commented lines before pattern matching --- .../StaticCheck/ActionGroupStandardsCheck.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php index c28835084..4d002849d 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php @@ -103,7 +103,7 @@ private function findErrorsInFileSet($files) $actionGroupReferencesDataArray = []; $actionGroupToArguments = []; $contents = $filePath->getContents(); - preg_match_all(self::STEP_KEY_REGEX_PATTERN, $contents, $actionGroupReferences); + preg_match_all(self::STEP_KEY_REGEX_PATTERN, preg_replace('/<!--(.|\s)*?-->/', '', $contents), $actionGroupReferences); foreach ($actionGroupReferences[0] as $actionGroupReferencesData) { $actionGroupReferencesDataArray[] = trim( str_replace(['stepKey', '='], [""], $actionGroupReferencesData) From 938897300e1eed905e9917eb35e1d06a82007b46 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 26 Oct 2022 18:28:13 +0530 Subject: [PATCH 319/674] ACQE-4111: Fixed PSR Standards --- .../StaticCheck/ActionGroupStandardsCheck.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php index 4d002849d..fdc90b6d9 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ActionGroupStandardsCheck.php @@ -103,7 +103,11 @@ private function findErrorsInFileSet($files) $actionGroupReferencesDataArray = []; $actionGroupToArguments = []; $contents = $filePath->getContents(); - preg_match_all(self::STEP_KEY_REGEX_PATTERN, preg_replace('/<!--(.|\s)*?-->/', '', $contents), $actionGroupReferences); + preg_match_all( + self::STEP_KEY_REGEX_PATTERN, + preg_replace('/<!--(.|\s)*?-->/', '', $contents), + $actionGroupReferences + ); foreach ($actionGroupReferences[0] as $actionGroupReferencesData) { $actionGroupReferencesDataArray[] = trim( str_replace(['stepKey', '='], [""], $actionGroupReferencesData) From 5f9b5854bf753edf470f8f6482769114b5b360be Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Wed, 26 Oct 2022 19:32:49 +0530 Subject: [PATCH 320/674] Update CHANGELOG.md --- CHANGELOG.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e57e341da..d130031bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,13 +13,6 @@ Magento Functional Testing Framework Changelog * Fixed incorrect MFTF test dependencies path * Removed PHP 7.3 build check from MFTF PR build as PHP 7.3 is no longer supported -3.10.2 ---------- - -### Fixes - -* Fixed admin credentials being output to console in WebAPIAuth -* Fixed links in docs 3.10.3 --------- From 5f33985d4dfafe958adc3a3a5098faa117ae7d93 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 27 Oct 2022 13:24:38 +0530 Subject: [PATCH 321/674] ACQE-3210 : Cannot Use WaitForElementClickable Action More Than Once in Actiongroup or Test Case Fix --- .../Test/Config/Converter/Dom/Flat.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php b/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php index 23d8d5331..20e74fed7 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php +++ b/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php @@ -84,6 +84,10 @@ public function convertXml(\DOMNode $source, $basePath = '') $isNumericArrayNode = $this->arrayNodeConfig->isNumericArray($nodePath); $isArrayNode = $isNumericArrayNode || $arrayKeyAttribute; + if(isset($value[$nodeName]) && $nodeName === 'waitForElementClickable' ) { + unset($value[$nodeName]); + } + if (isset($value[$nodeName]) && !$isArrayNode) { throw new \UnexpectedValueException( "Node path '{$nodePath}' is not unique, but it has not been marked as array." From 0d91a425258a1bcac6bce662b6ab8157f0045b7d Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 27 Oct 2022 13:27:09 +0530 Subject: [PATCH 322/674] ACQE-3210 : Cannot Use WaitForElementClickable Action More Than Once in Actiongroup or Test Case Fix --- .../Test/Config/Converter/Dom/Flat.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php b/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php index 20e74fed7..c5f0f7a9d 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php +++ b/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php @@ -84,7 +84,7 @@ public function convertXml(\DOMNode $source, $basePath = '') $isNumericArrayNode = $this->arrayNodeConfig->isNumericArray($nodePath); $isArrayNode = $isNumericArrayNode || $arrayKeyAttribute; - if(isset($value[$nodeName]) && $nodeName === 'waitForElementClickable' ) { + if (isset($value[$nodeName]) && $nodeName === 'waitForElementClickable' ) { unset($value[$nodeName]); } From 4e6498ee32bdd10ac0ebe35072d2f5969ebee206 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 27 Oct 2022 13:31:45 +0530 Subject: [PATCH 323/674] ACQE-3210 : Cannot Use WaitForElementClickable Action More Than Once in Actiongroup or Test Case Fix --- .../Test/Config/Converter/Dom/Flat.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php b/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php index c5f0f7a9d..3e7508d61 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php +++ b/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php @@ -84,7 +84,7 @@ public function convertXml(\DOMNode $source, $basePath = '') $isNumericArrayNode = $this->arrayNodeConfig->isNumericArray($nodePath); $isArrayNode = $isNumericArrayNode || $arrayKeyAttribute; - if (isset($value[$nodeName]) && $nodeName === 'waitForElementClickable' ) { + if (isset($value[$nodeName]) && $nodeName === 'waitForElementClickable') { unset($value[$nodeName]); } From a81144df1db3381fa446ca34a8cbf4a5fc9ff432 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 27 Oct 2022 13:33:57 +0530 Subject: [PATCH 324/674] ACQE-3210 : Cannot Use WaitForElementClickable Action More Than Once in Actiongroup or Test Case Fix --- .../Test/Config/Converter/Dom/Flat.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php b/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php index 3e7508d61..869ca6f9a 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php +++ b/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php @@ -70,6 +70,7 @@ public function convert($source) * @return string|array * @throws \UnexpectedValueException * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) * Revisited to reduce cyclomatic complexity, left unrefactored for readability */ public function convertXml(\DOMNode $source, $basePath = '') From e00b1d80a6aa61886ce7549d4e7c605424418072 Mon Sep 17 00:00:00 2001 From: Ji Lu <jilu1@adobe.com> Date: Tue, 4 Oct 2022 22:20:33 -0500 Subject: [PATCH 325/674] ACQE-4122: fixed an issue in test generation with config parallel by group --- .../Util/Sorter/ParallelGroupSorterTest.php | 42 +++++++++++++++++++ .../Util/Sorter/ParallelGroupSorter.php | 4 ++ 2 files changed, 46 insertions(+) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php index 5429ec92a..03d4953cb 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php @@ -378,6 +378,48 @@ public function testTestsAndSuitesSplitByMinGroupNumber(): void } } + /** + * Test splitting tests and suites when none of the suites has test. + * For example, this can happen when --filter option is used. + * + * @return void + * @throws FastFailException + */ + public function testTestsAndSuitesSplitByGroupNumberSuiteNoTest(): void + { + // mock tests for test object handler. + $this->createMockForTest(0); + + // create test to size array + $sampleTestArray = [ + 'test1' => 1, + 'test2' => 125, + 'test3' => 35 + ]; + + // create mock suite references + $sampleSuiteArray = [ + 'mockSuite1' => [], + 'mockSuite2' => [], + ]; + + // perform sort + $testSorter = new ParallelGroupSorter(); + $actualResult = $testSorter->getTestsGroupedByFixedGroupCount($sampleSuiteArray, $sampleTestArray, 3); + // verify the resulting groups + $this->assertCount(3, $actualResult); + + $expectedResults = [ + 1 => ['test2'], + 2 => ['test3'], + 3 => ['test1'] + ]; + + foreach ($actualResult as $groupNum => $group) { + $this->assertEquals($expectedResults[$groupNum], array_keys($group)); + } + } + /** * Test splitting tests and suites with invalid group number. * diff --git a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php index 74f5af3ca..d18626851 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php +++ b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php @@ -128,6 +128,10 @@ public function getTestsGroupedByFixedGroupCount($suiteConfiguration, $testNameT */ private function getSuiteGroupCounts($suiteNameToTestSize, $testNameToSize, $groupTotal) { + if (empty($suiteNameToTestSize)) { + return []; + } + // Calculate the minimum possible group time $suiteNameToSize = $this->getSuiteToSize($suiteNameToTestSize); $minGroupTime = ceil((array_sum($testNameToSize) + array_sum($suiteNameToSize)) / $groupTotal); From fdc7de9ad19ff0faabf01c055461e87ca9f326a1 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Fri, 28 Oct 2022 12:52:17 +0530 Subject: [PATCH 326/674] ACQE-4111 : Updated ChangeLog.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d130031bf..06e2554ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Magento Functional Testing Framework Changelog * Fixed incorrect MFTF test dependencies path * Removed PHP 7.3 build check from MFTF PR build as PHP 7.3 is no longer supported +* Fixed fatal error when running generate:tests --config parallel -g 3.10.3 From 8bb8763944437a2ad912d0ce706e8c41ca4f46e6 Mon Sep 17 00:00:00 2001 From: Rajesh Kumar <glo71317@adobe.com> Date: Fri, 28 Oct 2022 15:20:20 +0530 Subject: [PATCH 327/674] No changes in lock file hence rolled back --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index 9228da8cd..487a9ca77 100644 --- a/composer.lock +++ b/composer.lock @@ -8190,7 +8190,7 @@ "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1.6|^2" }, - + "conflict": { "ext-psr": "<1.1|>=2", "symfony/config": "<5.3", From 9955c583733a6fdaf323cb87c4a30ff36d45c584 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 3 Nov 2022 11:46:12 +0530 Subject: [PATCH 328/674] ACQE-3401 : 3.11.1 RC --- CHANGELOG.md | 7 +++++++ composer.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d130031bf..8fc2094a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Magento Functional Testing Framework Changelog ================================================ +3.11.1 +--------- + +### Fixes + +* Removed environment variable MAGENTO_ADMIN_PASSWORD + 3.11.0 --------- ### Enhancements diff --git a/composer.json b/composer.json index 23677c834..3ff584b3b 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": "3.11.0", + "version": "3.11.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { From d58eaa023b6c8a3c48b478df3c1d52ba625da487 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 3 Nov 2022 16:47:05 +0530 Subject: [PATCH 329/674] ACQE-3210 : Cannot Use WaitForElementClickable Action More Than Once fixed --- etc/di.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/di.xml b/etc/di.xml index 586158286..a3dfa1292 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -8,7 +8,7 @@ <!-- Entity value gets replaced in Dom.php before reading $xml --> <!DOCTYPE config [ - <!ENTITY commonTestActions "acceptPopup|actionGroup|amOnPage|amOnUrl|amOnSubdomain|appendField|assertArrayIsSortasserted|assertElementContainsAttribute|attachFile|cancelPopup|checkOption|clearField|click|clickWithLeftButton|clickWithRightButton|closeAdminNotification|closeTab|comment|conditionalClick|createData|deleteData|updateData|getData|dontSee|dontSeeJsError|dontSeeCheckboxIsChecked|dontSeeCookie|dontSeeCurrentUrlEquals|dontSeeCurrentUrlMatches|dontSeeElement|dontSeeElementInDOM|dontSeeInCurrentUrl|dontSeeInField|dontSeeInFormFields|dontSeeInPageSource|dontSeeInSource|dontSeeInTitle|dontSeeLink|dontSeeOptionIsSelected|doubleClick|dragAndDrop|entity|executeJS|fillField|formatCurrency|generateDate|getOTP|grabAttributeFrom|grabCookie|grabCookieAttributes|grabFromCurrentUrl|grabMultiple|grabPageSource|grabTextFrom|grabValueFrom|return|loadSessionSnapshot|loginAsAdmin|magentoCLI|magentoCron|makeScreenshot|maximizeWindow|moveBack|moveForward|moveMouseOver|mSetLocale|mResetLocale|openNewTab|pause|parseFloat|pressKey|reloadPage|resetCookie|submitForm|resizeWindow|saveSessionSnapshot|scrollTo|scrollToTopOfPage|searchAndMultiSelectOption|see|seeCheckboxIsChecked|seeCookie|seeCurrentUrlEquals|seeCurrentUrlMatches|seeElement|seeElementInDOM|seeInCurrentUrl|seeInField|seeInFormFields|seeInPageSource|seeInPopup|seeInSource|seeInTitle|seeLink|seeNumberOfElements|seeOptionIsSelected|selectOption|setCookie|submitForm|switchToIFrame|switchToNextTab|switchToPreviousTab|switchToWindow|typeInPopup|uncheckOption|unselectOption|wait|waitForAjaxLoad|waitForElement|waitForElementChange|waitForElementNotVisible|waitForElementVisible|waitForPwaElementNotVisible|waitForPwaElementVisible|waitForJS|waitForLoadingMaskToDisappear|waitForPageLoad|waitForText|assertArrayHasKey|assertArrayNotHasKey|assertContains|assertStringContainsString|assertStringContainsStringIgnoringCase|assertCount|assertEmpty|assertEquals|assertFalse|assertFileExists|assertFileNotExists|assertGreaterOrEquals|assertGreaterThan|assertGreaterThanOrEqual|assertInstanceOf|assertIsEmpty|assertLessOrEquals|assertLessThan|assertLessThanOrEqual|assertNotContains|assertStringNotContainsString|assertStringNotContainsStringIgnoringCase|assertNotEmpty|assertNotEquals|assertNotInstanceOf|assertNotNull|assertNotRegExp|assertNotSame|assertNull|assertRegExp|assertSame|assertStringStartsNotWith|assertStringStartsWith|assertTrue|expectException|fail|dontSeeFullUrlEquals|dontSee|dontSeeFullUrlMatches|dontSeeInFullUrl|seeFullUrlEquals|seeFullUrlMatches|seeInFullUrl|grabFromFullUrl|helper|assertEqualsWithDelta|assertEqualsCanonicalizing|assertEqualsIgnoringCase|assertNotEqualsWithDelta|assertNotEqualsCanonicalizing|assertNotEqualsIgnoringCase"> + <!ENTITY commonTestActions "acceptPopup|actionGroup|amOnPage|amOnUrl|amOnSubdomain|appendField|assertArrayIsSortasserted|assertElementContainsAttribute|attachFile|cancelPopup|checkOption|clearField|click|clickWithLeftButton|clickWithRightButton|closeAdminNotification|closeTab|comment|conditionalClick|createData|deleteData|updateData|getData|dontSee|dontSeeJsError|dontSeeCheckboxIsChecked|dontSeeCookie|dontSeeCurrentUrlEquals|dontSeeCurrentUrlMatches|dontSeeElement|dontSeeElementInDOM|dontSeeInCurrentUrl|dontSeeInField|dontSeeInFormFields|dontSeeInPageSource|dontSeeInSource|dontSeeInTitle|dontSeeLink|dontSeeOptionIsSelected|doubleClick|dragAndDrop|entity|executeJS|fillField|formatCurrency|generateDate|getOTP|grabAttributeFrom|grabCookie|grabCookieAttributes|grabFromCurrentUrl|grabMultiple|grabPageSource|grabTextFrom|grabValueFrom|return|loadSessionSnapshot|loginAsAdmin|magentoCLI|magentoCron|makeScreenshot|maximizeWindow|moveBack|moveForward|moveMouseOver|mSetLocale|mResetLocale|openNewTab|pause|parseFloat|pressKey|reloadPage|resetCookie|submitForm|resizeWindow|saveSessionSnapshot|scrollTo|scrollToTopOfPage|searchAndMultiSelectOption|see|seeCheckboxIsChecked|seeCookie|seeCurrentUrlEquals|seeCurrentUrlMatches|seeElement|seeElementInDOM|seeInCurrentUrl|seeInField|seeInFormFields|seeInPageSource|seeInPopup|seeInSource|seeInTitle|seeLink|seeNumberOfElements|seeOptionIsSelected|selectOption|setCookie|submitForm|switchToIFrame|switchToNextTab|switchToPreviousTab|switchToWindow|typeInPopup|uncheckOption|unselectOption|wait|waitForAjaxLoad|waitForElement|waitForElementChange|waitForElementNotVisible|waitForElementVisible|waitForPwaElementNotVisible|waitForPwaElementVisible|waitForElementClickable|waitForJS|waitForLoadingMaskToDisappear|waitForPageLoad|waitForText|assertArrayHasKey|assertArrayNotHasKey|assertContains|assertStringContainsString|assertStringContainsStringIgnoringCase|assertCount|assertEmpty|assertEquals|assertFalse|assertFileExists|assertFileNotExists|assertGreaterOrEquals|assertGreaterThan|assertGreaterThanOrEqual|assertInstanceOf|assertIsEmpty|assertLessOrEquals|assertLessThan|assertLessThanOrEqual|assertNotContains|assertStringNotContainsString|assertStringNotContainsStringIgnoringCase|assertNotEmpty|assertNotEquals|assertNotInstanceOf|assertNotNull|assertNotRegExp|assertNotSame|assertNull|assertRegExp|assertSame|assertStringStartsNotWith|assertStringStartsWith|assertTrue|expectException|fail|dontSeeFullUrlEquals|dontSee|dontSeeFullUrlMatches|dontSeeInFullUrl|seeFullUrlEquals|seeFullUrlMatches|seeInFullUrl|grabFromFullUrl|helper|assertEqualsWithDelta|assertEqualsCanonicalizing|assertEqualsIgnoringCase|assertNotEqualsWithDelta|assertNotEqualsCanonicalizing|assertNotEqualsIgnoringCase"> ]> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../src/Magento/FunctionalTestingFramework/ObjectManager/etc/config.xsd"> From a453b497ace3040232ba066b58a386c78d8622a6 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Thu, 3 Nov 2022 16:48:31 +0530 Subject: [PATCH 330/674] Update Flat.php --- .../Test/Config/Converter/Dom/Flat.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php b/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php index 869ca6f9a..23d8d5331 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php +++ b/src/Magento/FunctionalTestingFramework/Test/Config/Converter/Dom/Flat.php @@ -70,7 +70,6 @@ public function convert($source) * @return string|array * @throws \UnexpectedValueException * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.NPathComplexity) * Revisited to reduce cyclomatic complexity, left unrefactored for readability */ public function convertXml(\DOMNode $source, $basePath = '') @@ -85,10 +84,6 @@ public function convertXml(\DOMNode $source, $basePath = '') $isNumericArrayNode = $this->arrayNodeConfig->isNumericArray($nodePath); $isArrayNode = $isNumericArrayNode || $arrayKeyAttribute; - if (isset($value[$nodeName]) && $nodeName === 'waitForElementClickable') { - unset($value[$nodeName]); - } - if (isset($value[$nodeName]) && !$isArrayNode) { throw new \UnexpectedValueException( "Node path '{$nodePath}' is not unique, but it has not been marked as array." From 5a034cec805c2c21311174708d2c8fd51a0cb10d Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Fri, 4 Nov 2022 12:57:17 +0530 Subject: [PATCH 331/674] ACQE-3210 : Release --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fc2094a6..24ca7e626 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Magento Functional Testing Framework Changelog ### Fixes * Removed environment variable MAGENTO_ADMIN_PASSWORD +* Fixed WaitForElementClickable action cannot be used more than once 3.11.0 --------- From 11ae4e542d5b0af8ae8c24557eeea46288c13e30 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Fri, 4 Nov 2022 20:06:55 +0530 Subject: [PATCH 332/674] Updated composer.lock --- composer.lock | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 487a9ca77..2285d51c2 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": "657428977803e30350f9c25ed94c9860", + "content-hash": "ce0ead528f54123eb247b60c9dbd56ba", "packages": [ { "name": "allure-framework/allure-codeception", @@ -2626,9 +2626,6 @@ "require": { "php": "^7.1 || ^8.0" }, - "replace": { - "myclabs/deep-copy": "self.version" - }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", @@ -8190,7 +8187,6 @@ "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1.6|^2" }, - "conflict": { "ext-psr": "<1.1|>=2", "symfony/config": "<5.3", @@ -8327,7 +8323,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">7.3", + "php": ">7.4", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", From f94fe8809fa94e5220de229ee2e89a609639bf54 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Fri, 4 Nov 2022 20:12:00 +0530 Subject: [PATCH 333/674] Update composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 3ff584b3b..b5f7ab673 100755 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ "codeception/module-asserts": "^1.1", "codeception/module-sequence": "^1.0", "codeception/module-webdriver": "^1.0", - "composer/composer": "^2.0, !=2.2.16", + "composer/composer": "^1.9 || ^2.0, !=2.2.16", "csharpru/vault-php": "^4.2.1", "guzzlehttp/guzzle": "^7.3.0", "laminas/laminas-diactoros": "^2.8", From c8f9243bcadcf305e7682284f63066630fa63696 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 7 Nov 2022 15:52:13 +0530 Subject: [PATCH 334/674] ACQE-4210 : Php update 8.2.0 --- composer.json | 2 +- composer.lock | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 23677c834..357e51eab 100755 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "sort-packages": true }, "require": { - "php": ">7.4", + "php": "~8.1.0||~8.2.0", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", diff --git a/composer.lock b/composer.lock index 487a9ca77..0193ac390 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": "657428977803e30350f9c25ed94c9860", + "content-hash": "f50af01d932e25302d529692bd4887d6", "packages": [ { "name": "allure-framework/allure-codeception", @@ -2315,7 +2315,7 @@ "shasum": "" }, "require": { - "php": "^7.3 || ~8.0.0 || ~8.1.0", + "php": "^7.3 || ~8.0.0 || ~8.1.0 || ~8.2.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.0" }, @@ -3141,7 +3141,7 @@ }, "require": { "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", + "php": "^7.2 || ~8.0, <=8.2", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0", "sebastian/recursion-context": "^3.0 || ^4.0" @@ -8190,7 +8190,6 @@ "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1.6|^2" }, - "conflict": { "ext-psr": "<1.1|>=2", "symfony/config": "<5.3", @@ -8327,7 +8326,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">7.3", + "php": "~8.1.0||~8.2.0", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", From 3fa5bdb258678e112e6b1bff70968f9ce08c6747 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 14 Nov 2022 15:58:51 +0530 Subject: [PATCH 335/674] updated composer.json and composer.lock to support 7.4 and above --- composer.json | 2 +- composer.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 357e51eab..6414374c5 100755 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "sort-packages": true }, "require": { - "php": "~8.1.0||~8.2.0", + "php": ">=7.4", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", diff --git a/composer.lock b/composer.lock index 0193ac390..c4912993f 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": "f50af01d932e25302d529692bd4887d6", + "content-hash": "0a03c0d9728b114cf546845bd6a368fc", "packages": [ { "name": "allure-framework/allure-codeception", @@ -8326,7 +8326,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "~8.1.0||~8.2.0", + "php": ">=7.4", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", From 612dc5c8f591bd70039c8892e61543fe7d5655a3 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 14 Nov 2022 16:01:16 +0530 Subject: [PATCH 336/674] added 8.2 in main.yml file --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dc79806d7..5b22bb3ce 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.4', '8.0', '8.1'] + php-versions: ['7.4', '8.0', '8.1', '8.2'] steps: - uses: actions/checkout@v2 @@ -54,7 +54,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.4', '8.0', '8.1'] + php-versions: ['7.4', '8.0', '8.1', '8.2'] steps: - uses: actions/checkout@v2 @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.4', '8.0', '8.1'] + php-versions: ['7.4', '8.0', '8.1', '8.2'] steps: - uses: actions/checkout@v2 @@ -118,7 +118,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.4', '8.0', '8.1'] + php-versions: ['7.4', '8.0', '8.1', '8.2'] services: chrome: From d55e0d5719c4ffdb93d99d5b9ab835729e9436c6 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Tue, 22 Nov 2022 20:47:07 +0530 Subject: [PATCH 337/674] ACQE-2580: Helpers & ActionGroups Allow Duplicate Argument Names to be Passed --- .../Util/TestGenerator.php | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index d95526676..60e6da423 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -344,6 +344,28 @@ private function assembleAllTestPhp($testManifest, array $testsToIgnore) } foreach ($testObjects as $test) { + + // Throw exception if found duplicate arguments in helper or actionGroup + $allTag = @(array) next($test); + $arrStores = []; + foreach ($allTag as $value) { + $allArgs = (array) $value; + if (array_values($allArgs)[2] == 'actionGroup' || array_values($allArgs)[2] == 'helper') { + if (isset(array_values($allArgs)[3]['arguments']) && array_values($allArgs)[2] == 'actionGroup') { + $arrStores[] = array_keys(array_values($allArgs)[3]['arguments']); + } else if (isset(array_values($allArgs)[3]) && array_values($allArgs)[2] == 'helper') { + $arrStores[] = array_keys(array_values($allArgs)[3]); + } + } + } + $err = []; + foreach ($arrStores as $arrStore) { + if (count(array_unique($arrStore)) != count($arrStore)) { + $err = 'Duplicate argument not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + } + try { // Reset flag for new test $removeLastTest = false; From 59996cb8d27db3c9e6c4b5f996f878f0cd4014ad Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Tue, 22 Nov 2022 20:51:56 +0530 Subject: [PATCH 338/674] ACQE-2580: Helpers & ActionGroups Allow Duplicate Argument Names to be Passed --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 60e6da423..2319fbaac 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -349,11 +349,11 @@ private function assembleAllTestPhp($testManifest, array $testsToIgnore) $allTag = @(array) next($test); $arrStores = []; foreach ($allTag as $value) { - $allArgs = (array) $value; + $allArgs = (array) $value; if (array_values($allArgs)[2] == 'actionGroup' || array_values($allArgs)[2] == 'helper') { if (isset(array_values($allArgs)[3]['arguments']) && array_values($allArgs)[2] == 'actionGroup') { $arrStores[] = array_keys(array_values($allArgs)[3]['arguments']); - } else if (isset(array_values($allArgs)[3]) && array_values($allArgs)[2] == 'helper') { + } elseif (isset(array_values($allArgs)[3]) && array_values($allArgs)[2] == 'helper') { $arrStores[] = array_keys(array_values($allArgs)[3]); } } From 9ef5fae0fe56f88abd394dd643ae5a9c8a809eb4 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Tue, 22 Nov 2022 20:55:33 +0530 Subject: [PATCH 339/674] ACQE-2580: Helpers & ActionGroups Allow Duplicate Argument Names to be Passed --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 2319fbaac..e575a7b7e 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -342,9 +342,7 @@ private function assembleAllTestPhp($testManifest, array $testsToIgnore) foreach ($filters as $filter) { $filter->filter($testObjects); } - foreach ($testObjects as $test) { - // Throw exception if found duplicate arguments in helper or actionGroup $allTag = @(array) next($test); $arrStores = []; From 7103f7dc0d611ca8df5f3cfe7eb2f4486364544d Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Tue, 22 Nov 2022 21:01:49 +0530 Subject: [PATCH 340/674] ACQE-2580: Helpers & ActionGroups Allow Duplicate Argument Names to be Passed --- .../Util/TestGenerator.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index e575a7b7e..af513dc52 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -348,11 +348,13 @@ private function assembleAllTestPhp($testManifest, array $testsToIgnore) $arrStores = []; foreach ($allTag as $value) { $allArgs = (array) $value; - if (array_values($allArgs)[2] == 'actionGroup' || array_values($allArgs)[2] == 'helper') { - if (isset(array_values($allArgs)[3]['arguments']) && array_values($allArgs)[2] == 'actionGroup') { - $arrStores[] = array_keys(array_values($allArgs)[3]['arguments']); - } elseif (isset(array_values($allArgs)[3]) && array_values($allArgs)[2] == 'helper') { - $arrStores[] = array_keys(array_values($allArgs)[3]); + if (isset(array_values($allArgs)[2])) { + if (array_values($allArgs)[2] == 'actionGroup' || array_values($allArgs)[2] == 'helper') { + if (isset(array_values($allArgs)[3]['arguments']) && array_values($allArgs)[2] == 'actionGroup') { + $arrStores[] = array_keys(array_values($allArgs)[3]['arguments']); + } elseif (isset(array_values($allArgs)[3]) && array_values($allArgs)[2] == 'helper') { + $arrStores[] = array_keys(array_values($allArgs)[3]); + } } } } From 915733df4ec8afefcae9b60f27c568f37e857a9d Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Tue, 22 Nov 2022 21:03:41 +0530 Subject: [PATCH 341/674] ACQE-2580: Helpers & ActionGroups Allow Duplicate Argument Names to be Passed --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index af513dc52..2123b2417 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -350,7 +350,7 @@ private function assembleAllTestPhp($testManifest, array $testsToIgnore) $allArgs = (array) $value; if (isset(array_values($allArgs)[2])) { if (array_values($allArgs)[2] == 'actionGroup' || array_values($allArgs)[2] == 'helper') { - if (isset(array_values($allArgs)[3]['arguments']) && array_values($allArgs)[2] == 'actionGroup') { + if (isset(array_values($allArgs)[3]['arguments'])) { $arrStores[] = array_keys(array_values($allArgs)[3]['arguments']); } elseif (isset(array_values($allArgs)[3]) && array_values($allArgs)[2] == 'helper') { $arrStores[] = array_keys(array_values($allArgs)[3]); From 31f861a1260332f79f202baf9c4f85b4f3e5a772 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Tue, 22 Nov 2022 21:06:35 +0530 Subject: [PATCH 342/674] ACQE-2580: Helpers & ActionGroups Allow Duplicate Argument Names to be Passed --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 2123b2417..de7a97ba9 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -343,7 +343,7 @@ private function assembleAllTestPhp($testManifest, array $testsToIgnore) $filter->filter($testObjects); } foreach ($testObjects as $test) { - // Throw exception if found duplicate arguments in helper or actionGroup + // Throw exception if duplicate arguments found in helper or actionGroup $allTag = @(array) next($test); $arrStores = []; foreach ($allTag as $value) { From 6ec40a4b2b303ce92d6c61b3e64b8d056938c5f7 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Fri, 25 Nov 2022 00:53:30 +0530 Subject: [PATCH 343/674] ACQE-2580: new changes --- .../Util/TestGenerator.php | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index de7a97ba9..56dc2129f 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -259,6 +259,21 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) */ public function assembleTestPhp($testObject) { + // Throw exception if duplicate arguments found in helper or actionGroup + $fileToArr = file($testObject->getFilename()); + $argArr = []; + foreach ($fileToArr as $key => $fileVal) { + if (strpos($fileVal,"<argument name") == true) { + $argArr[$key] = explode(" ",trim($fileVal))[1]; + } + } + foreach ($argArr as $key => $arrVal) { + if ( @$argArr[$key + 1] == $arrVal || @$argArr[$key - 1] == $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + } + $this->customHelpers = []; $usePhp = $this->generateUseStatementsPhp(); @@ -343,29 +358,6 @@ private function assembleAllTestPhp($testManifest, array $testsToIgnore) $filter->filter($testObjects); } foreach ($testObjects as $test) { - // Throw exception if duplicate arguments found in helper or actionGroup - $allTag = @(array) next($test); - $arrStores = []; - foreach ($allTag as $value) { - $allArgs = (array) $value; - if (isset(array_values($allArgs)[2])) { - if (array_values($allArgs)[2] == 'actionGroup' || array_values($allArgs)[2] == 'helper') { - if (isset(array_values($allArgs)[3]['arguments'])) { - $arrStores[] = array_keys(array_values($allArgs)[3]['arguments']); - } elseif (isset(array_values($allArgs)[3]) && array_values($allArgs)[2] == 'helper') { - $arrStores[] = array_keys(array_values($allArgs)[3]); - } - } - } - } - $err = []; - foreach ($arrStores as $arrStore) { - if (count(array_unique($arrStore)) != count($arrStore)) { - $err = 'Duplicate argument not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } - } - try { // Reset flag for new test $removeLastTest = false; From e0a7b26c20db4654c2d2c57711150092c3167902 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Fri, 25 Nov 2022 00:56:23 +0530 Subject: [PATCH 344/674] ACQE-2580: new changes --- .../FunctionalTestingFramework/Util/TestGenerator.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 56dc2129f..bed4486f6 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -263,17 +263,17 @@ public function assembleTestPhp($testObject) $fileToArr = file($testObject->getFilename()); $argArr = []; foreach ($fileToArr as $key => $fileVal) { - if (strpos($fileVal,"<argument name") == true) { - $argArr[$key] = explode(" ",trim($fileVal))[1]; + if (strpos($fileVal, "<argument name") == true) { + $argArr[$key] = explode(" ", trim($fileVal))[1]; } } foreach ($argArr as $key => $arrVal) { - if ( @$argArr[$key + 1] == $arrVal || @$argArr[$key - 1] == $arrVal) { + if (@$argArr[$key + 1] == $arrVal || @$argArr[$key - 1] == $arrVal) { $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; throw new TestFrameworkException(implode(PHP_EOL, $err)); } } - + $this->customHelpers = []; $usePhp = $this->generateUseStatementsPhp(); From 02aca5bffd0099a7a9e33df982a07a118d5bc2cc Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Fri, 25 Nov 2022 01:00:19 +0530 Subject: [PATCH 345/674] ACQE-2580: new changes --- .../FunctionalTestingFramework/Util/TestGenerator.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index bed4486f6..0d09219b3 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -260,14 +260,14 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) public function assembleTestPhp($testObject) { // Throw exception if duplicate arguments found in helper or actionGroup - $fileToArr = file($testObject->getFilename()); + $fileToArr = @file($testObject->getFilename()); $argArr = []; - foreach ($fileToArr as $key => $fileVal) { + foreach (@$fileToArr as $key => $fileVal) { if (strpos($fileVal, "<argument name") == true) { $argArr[$key] = explode(" ", trim($fileVal))[1]; } } - foreach ($argArr as $key => $arrVal) { + foreach (@$argArr as $key => $arrVal) { if (@$argArr[$key + 1] == $arrVal || @$argArr[$key - 1] == $arrVal) { $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; throw new TestFrameworkException(implode(PHP_EOL, $err)); From b599cff2c3814599fe7d31322e6d31a8e8b8bcd3 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Fri, 25 Nov 2022 01:03:23 +0530 Subject: [PATCH 346/674] ACQE-2580: new changes --- .../Util/TestGenerator.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 0d09219b3..f0e70f35e 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -260,17 +260,19 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) public function assembleTestPhp($testObject) { // Throw exception if duplicate arguments found in helper or actionGroup - $fileToArr = @file($testObject->getFilename()); + $fileToArr = file(@$testObject->getFilename()); $argArr = []; - foreach (@$fileToArr as $key => $fileVal) { + if (isset($fileToArr)) { + foreach ($fileToArr as $key => $fileVal) { if (strpos($fileVal, "<argument name") == true) { $argArr[$key] = explode(" ", trim($fileVal))[1]; + } } - } - foreach (@$argArr as $key => $arrVal) { - if (@$argArr[$key + 1] == $arrVal || @$argArr[$key - 1] == $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); + foreach ($argArr as $key => $arrVal) { + if (@$argArr[$key + 1] == $arrVal || @$argArr[$key - 1] == $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } } } From 054fe4c37135a4222ff86d7714e7de2006ec9a84 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Fri, 25 Nov 2022 01:06:28 +0530 Subject: [PATCH 347/674] ACQE-2580: new changes --- .../FunctionalTestingFramework/Util/TestGenerator.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index f0e70f35e..666b5e7e5 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -260,9 +260,9 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) public function assembleTestPhp($testObject) { // Throw exception if duplicate arguments found in helper or actionGroup - $fileToArr = file(@$testObject->getFilename()); - $argArr = []; - if (isset($fileToArr)) { + if (isset($testObject->getFilename())) { + $fileToArr = file($testObject->getFilename()); + $argArr = []; foreach ($fileToArr as $key => $fileVal) { if (strpos($fileVal, "<argument name") == true) { $argArr[$key] = explode(" ", trim($fileVal))[1]; From e837b49eb445170eb835d2daa647b9980a338691 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Fri, 25 Nov 2022 01:09:35 +0530 Subject: [PATCH 348/674] ACQE-2580: new changes --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 666b5e7e5..3280d1f3e 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -260,7 +260,7 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) public function assembleTestPhp($testObject) { // Throw exception if duplicate arguments found in helper or actionGroup - if (isset($testObject->getFilename())) { + if (null !== $testObject->getFilename()) { $fileToArr = file($testObject->getFilename()); $argArr = []; foreach ($fileToArr as $key => $fileVal) { From 04c1eaef1f246b95c504995a9fec14190b1a4934 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Fri, 25 Nov 2022 01:11:53 +0530 Subject: [PATCH 349/674] ACQE-2580: new changes --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 3280d1f3e..8b0e63bc6 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -260,7 +260,7 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) public function assembleTestPhp($testObject) { // Throw exception if duplicate arguments found in helper or actionGroup - if (null !== $testObject->getFilename()) { + if (!empty($testObject->getFilename())) { $fileToArr = file($testObject->getFilename()); $argArr = []; foreach ($fileToArr as $key => $fileVal) { From 923a5199930d5d714ceca9bac5be8ed8dcc151af Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Fri, 25 Nov 2022 01:26:54 +0530 Subject: [PATCH 350/674] ACQE-2580: new changes --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 8b0e63bc6..982b459f3 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -261,7 +261,7 @@ public function assembleTestPhp($testObject) { // Throw exception if duplicate arguments found in helper or actionGroup if (!empty($testObject->getFilename())) { - $fileToArr = file($testObject->getFilename()); + $fileToArr = explode("\n", file_get_contents($testObject->getFilename())); $argArr = []; foreach ($fileToArr as $key => $fileVal) { if (strpos($fileVal, "<argument name") == true) { From 7c0d162b398571d663bbad1e90098dc8d5459ce8 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Fri, 25 Nov 2022 01:29:49 +0530 Subject: [PATCH 351/674] ACQE-2580: new changes --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 982b459f3..f75374ab0 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -260,7 +260,7 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) public function assembleTestPhp($testObject) { // Throw exception if duplicate arguments found in helper or actionGroup - if (!empty($testObject->getFilename())) { + if (!empty($testObject->getFilename()) && file_exists($testObject->getFilename())) { $fileToArr = explode("\n", file_get_contents($testObject->getFilename())); $argArr = []; foreach ($fileToArr as $key => $fileVal) { From fc3b3e4dad541cadd29da5d8d0055224871a2c48 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Fri, 25 Nov 2022 01:32:36 +0530 Subject: [PATCH 352/674] ACQE-2580: new changes --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index f75374ab0..da70a2fa1 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -264,8 +264,8 @@ public function assembleTestPhp($testObject) $fileToArr = explode("\n", file_get_contents($testObject->getFilename())); $argArr = []; foreach ($fileToArr as $key => $fileVal) { - if (strpos($fileVal, "<argument name") == true) { - $argArr[$key] = explode(" ", trim($fileVal))[1]; + if (strpos($fileVal, "<argument name") == true) { + $argArr[$key] = explode(" ", trim($fileVal))[1]; } } foreach ($argArr as $key => $arrVal) { From 4a1dcebf2c8ba8d500c160a47d48bc57eeef9c44 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 28 Nov 2022 16:37:41 +0530 Subject: [PATCH 353/674] ACQE-4265 : Deprecation errors fix --- .../Suite/Handlers/SuiteObjectHandler.php | 2 +- .../Test/Handlers/TestObjectHandler.php | 2 +- .../Test/Parsers/ActionGroupDataParser.php | 2 ++ src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- .../Util/Validation/NameValidationUtil.php | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/Handlers/SuiteObjectHandler.php b/src/Magento/FunctionalTestingFramework/Suite/Handlers/SuiteObjectHandler.php index 7583f2472..75e86b3a8 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/Handlers/SuiteObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/Suite/Handlers/SuiteObjectHandler.php @@ -80,7 +80,7 @@ public function getObject($objectName): SuiteObject { if (!array_key_exists($objectName, $this->suiteObjects)) { throw new TestReferenceException( - "Suite ${objectName} is not defined in xml or is invalid." + "Suite {$objectName} is not defined in xml or is invalid." ); } return $this->suiteObjects[$objectName]; diff --git a/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php b/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php index 287e5306e..2361c5938 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/Test/Handlers/TestObjectHandler.php @@ -86,7 +86,7 @@ private function __construct() public function getObject($testName) { if (!array_key_exists($testName, $this->tests)) { - throw new TestReferenceException("Test ${testName} not defined in xml."); + throw new TestReferenceException("Test {$testName} not defined in xml."); } $testObject = $this->tests[$testName]; diff --git a/src/Magento/FunctionalTestingFramework/Test/Parsers/ActionGroupDataParser.php b/src/Magento/FunctionalTestingFramework/Test/Parsers/ActionGroupDataParser.php index 4709d3aa8..9902a3764 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Parsers/ActionGroupDataParser.php +++ b/src/Magento/FunctionalTestingFramework/Test/Parsers/ActionGroupDataParser.php @@ -11,6 +11,8 @@ /** * Class ActionGroupDataParser */ +#[\AllowDynamicProperties] + class ActionGroupDataParser { /** diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index d95526676..612ed9001 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1505,7 +1505,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $this->getUniqueIdForInput($actionObject->getCustomActionAttributes()['unique'], $input) : $input; $argRef .= str_replace(ucfirst($fieldKey), "", $stepKey) . - "Fields['{$fieldKey}'] = ${input};"; + "Fields['{$fieldKey}'] = {$input};"; $testSteps .= $argRef; break; case "generateDate": diff --git a/src/Magento/FunctionalTestingFramework/Util/Validation/NameValidationUtil.php b/src/Magento/FunctionalTestingFramework/Util/Validation/NameValidationUtil.php index 68642c53a..bef552da3 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Validation/NameValidationUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Validation/NameValidationUtil.php @@ -68,7 +68,7 @@ public static function validateName($name, $type) } if (!empty($illegalCharArray)) { - $errorMessage = "{$type} name \"${name}\" contains illegal characters, please fix and re-run."; + $errorMessage = "{$type} name \"{$name}\" contains illegal characters, please fix and re-run."; foreach ($illegalCharArray as $diffChar) { $errorMessage .= "\nTest names cannot contain '{$diffChar}'"; From c18ad149c9e2a4c4424752b212fa3b510e9dee46 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 29 Nov 2022 17:32:38 +0530 Subject: [PATCH 354/674] updated laminas to latest package --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index c4912993f..63391e9db 100644 --- a/composer.lock +++ b/composer.lock @@ -2302,7 +2302,7 @@ }, { "name": "laminas/laminas-diactoros", - "version": "2.8.0", + "version": "2.22.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", From c93cc72ae285535d07247fe14ee971a20a3fda9f Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Tue, 29 Nov 2022 19:00:05 +0530 Subject: [PATCH 355/674] ACQE-2580: extra validation added --- .../FunctionalTestingFramework/Util/TestGenerator.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index da70a2fa1..5fbeb92f5 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -264,12 +264,16 @@ public function assembleTestPhp($testObject) $fileToArr = explode("\n", file_get_contents($testObject->getFilename())); $argArr = []; foreach ($fileToArr as $key => $fileVal) { - if (strpos($fileVal, "<argument name") == true) { + if (!empty(strpos($fileVal, "<argument name"))) { $argArr[$key] = explode(" ", trim($fileVal))[1]; } } foreach ($argArr as $key => $arrVal) { - if (@$argArr[$key + 1] == $arrVal || @$argArr[$key - 1] == $arrVal) { + if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal ) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + if (!empty($argArr[$key - 1]) && $argArr[$key - 1] === $arrVal) { $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; throw new TestFrameworkException(implode(PHP_EOL, $err)); } From 7b4c95d94afc7af4d6e583c5210044c8e3d56a3b Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Tue, 29 Nov 2022 19:02:14 +0530 Subject: [PATCH 356/674] ACQE-2580: extra validation added --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 5fbeb92f5..1b4133c9d 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -269,7 +269,7 @@ public function assembleTestPhp($testObject) } } foreach ($argArr as $key => $arrVal) { - if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal ) { + if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; throw new TestFrameworkException(implode(PHP_EOL, $err)); } From e7898e2daad03edf905a46d9b22c99f23a12b84c Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 1 Dec 2022 12:15:00 +0530 Subject: [PATCH 357/674] ACQE-4305 : Upgraded 8.2 --- composer.json | 2 +- composer.lock | 47 +++++++++++++++++++++-------------------------- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/composer.json b/composer.json index 6414374c5..e62826344 100755 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "sort-packages": true }, "require": { - "php": ">=7.4", + "php": ">=8.0", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", diff --git a/composer.lock b/composer.lock index c4912993f..f88c58655 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": "0a03c0d9728b114cf546845bd6a368fc", + "content-hash": "a605dc88d14ca426ab5d2887381d1c4e", "packages": [ { "name": "allure-framework/allure-codeception", @@ -2302,25 +2302,24 @@ }, { "name": "laminas/laminas-diactoros", - "version": "2.8.0", + "version": "2.22.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199" + "reference": "df8c7f9e11d854269f4aa7c06ffa38caa42e4405" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/0c26ef1d95b6d7e6e3943a243ba3dc0797227199", - "reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/df8c7f9e11d854269f4aa7c06ffa38caa42e4405", + "reference": "df8c7f9e11d854269f4aa7c06ffa38caa42e4405", "shasum": "" }, "require": { - "php": "^7.3 || ~8.0.0 || ~8.1.0 || ~8.2.0", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.0" }, "conflict": { - "phpspec/prophecy": "<1.9.0", "zendframework/zend-diactoros": "*" }, "provide": { @@ -2332,13 +2331,12 @@ "ext-dom": "*", "ext-gd": "*", "ext-libxml": "*", - "http-interop/http-factory-tests": "^0.8.0", - "laminas/laminas-coding-standard": "~1.0.0", - "php-http/psr7-integration-tests": "^1.1", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.1", - "psalm/plugin-phpunit": "^0.14.0", - "vimeo/psalm": "^4.3" + "http-interop/http-factory-tests": "^0.9.0", + "laminas/laminas-coding-standard": "^2.4.0", + "php-http/psr7-integration-tests": "^1.1.1", + "phpunit/phpunit": "^9.5.26", + "psalm/plugin-phpunit": "^0.18.0", + "vimeo/psalm": "^4.29.0" }, "type": "library", "extra": { @@ -2397,7 +2395,7 @@ "type": "community_bridge" } ], - "time": "2021-09-22T03:54:36+00:00" + "time": "2022-11-22T05:54:54+00:00" }, { "name": "monolog/monolog", @@ -2626,9 +2624,6 @@ "require": { "php": "^7.1 || ^8.0" }, - "replace": { - "myclabs/deep-copy": "self.version" - }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", @@ -3127,21 +3122,21 @@ }, { "name": "phpspec/prophecy", - "version": "1.14.0", + "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" + "reference": "be8cac52a0827776ff9ccda8c381ac5b71aeb359" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", - "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be8cac52a0827776ff9ccda8c381ac5b71aeb359", + "reference": "be8cac52a0827776ff9ccda8c381ac5b71aeb359", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <=8.2", + "php": "^7.2 || 8.0.* || 8.1.* || 8.2.*", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0", "sebastian/recursion-context": "^3.0 || ^4.0" @@ -3188,9 +3183,9 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.14.0" + "source": "https://github.com/phpspec/prophecy/tree/v1.16.0" }, - "time": "2021-09-10T09:02:12+00:00" + "time": "2022-11-29T15:06:56+00:00" }, { "name": "phpstan/phpdoc-parser", @@ -8326,7 +8321,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.4", + "php": ">=8.0", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", From e1e534432843f0f898fa53e8ad6f46b4da4b6a37 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 1 Dec 2022 12:17:21 +0530 Subject: [PATCH 358/674] ACQE-4305 : Upgraded 8.2 --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5b22bb3ce..fb3268b96 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.4', '8.0', '8.1', '8.2'] + php-versions: ['8.0', '8.1', '8.2'] steps: - uses: actions/checkout@v2 @@ -54,7 +54,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.4', '8.0', '8.1', '8.2'] + php-versions: ['8.0', '8.1', '8.2'] steps: - uses: actions/checkout@v2 @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.4', '8.0', '8.1', '8.2'] + php-versions: ['8.0', '8.1', '8.2'] steps: - uses: actions/checkout@v2 @@ -118,7 +118,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.4', '8.0', '8.1', '8.2'] + php-versions: ['8.0', '8.1', '8.2'] services: chrome: From 122d91cb4fcb8abe4031fe224c4a1851c1d1ebd8 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Fri, 2 Dec 2022 21:50:19 +0530 Subject: [PATCH 359/674] Update composer.json and changelog.md and lock file --- CHANGELOG.md | 11 ++++++++++- composer.json | 2 +- composer.lock | 6 +++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b197e9501..59ebf2d70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ Magento Functional Testing Framework Changelog ================================================ +3.12.0 +--------- + +### Enhancements +* PHP 8.2 upgrade + +### Fixes +* Removed obsolete docs/ directory + 3.11.1 --------- @@ -20,7 +29,7 @@ Magento Functional Testing Framework Changelog * Fixed incorrect MFTF test dependencies path * Removed PHP 7.3 build check from MFTF PR build as PHP 7.3 is no longer supported -* Fixed fatal error when running generate:tests --config parallel -g +* Fixed fatal error when running generate:tests --config parallel -g 3.10.3 diff --git a/composer.json b/composer.json index f17616f03..7587c8e69 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": "3.11.1", + "version": "3.12.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 2a89e16e0..f1ba2a720 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": "0a03c0d9728b114cf546845bd6a368fc", + "content-hash": "5166946691764450a52bcb32f7df5ed5", "packages": [ { "name": "allure-framework/allure-codeception", @@ -2315,7 +2315,7 @@ "shasum": "" }, "require": { - "php": "^7.3 || ~8.0.0 || ~8.1.0 || ~8.2.0", + "php": "^7.3 || ~8.0.0 || ~8.1.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.0" }, @@ -3138,7 +3138,7 @@ }, "require": { "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <=8.2", + "php": "^7.2 || ~8.0, <8.2", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0", "sebastian/recursion-context": "^3.0 || ^4.0" From cbc99d6c32cbbe03293f4357365120510be70bde Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Fri, 2 Dec 2022 21:52:33 +0530 Subject: [PATCH 360/674] Update composer.json and changelog.md and lock file --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59ebf2d70..3125a0a09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Magento Functional Testing Framework Changelog ### Enhancements * PHP 8.2 upgrade +* Added 8.2 PR check ### Fixes * Removed obsolete docs/ directory From 7a3f6989ab3fef1bf92e588e4fd1755885d03198 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 5 Dec 2022 17:14:09 +0530 Subject: [PATCH 361/674] ACQE-4310 : Unable to connect to selenum server message display --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 4f240a3bd..55ff3f101 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -904,7 +904,7 @@ public function _failed(TestInterface $test, $fail) } if ($this->current_test === null) { - throw new \RuntimeException("Suite condition failure: \n" . $fail->getMessage()); + throw new \RuntimeException("Suite condition failure: \n" . " Unable to connect to selenium server "); } $this->addAttachment($this->pngReport, $test->getMetadata()->getName() . '.png', 'image/png'); From b35a93856cc18d05333fa23773912f6d4f111470 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 5 Dec 2022 17:21:12 +0530 Subject: [PATCH 362/674] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3125a0a09..edf3c370a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ Magento Functional Testing Framework Changelog ### Enhancements * PHP 8.2 upgrade -* Added 8.2 PR check +* Added 8.2 PHP PR check ### Fixes * Removed obsolete docs/ directory From e687c7dc6ac2b75fd7b621f2a0e4f37ccd82eedd Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 5 Dec 2022 17:22:25 +0530 Subject: [PATCH 363/674] updated MFTF version --- .github/workflows/main.yml | 8 ++++---- CHANGELOG.md | 6 +----- composer.json | 2 +- composer.lock | 4 ++-- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5b22bb3ce..dc79806d7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.4', '8.0', '8.1', '8.2'] + php-versions: ['7.4', '8.0', '8.1'] steps: - uses: actions/checkout@v2 @@ -54,7 +54,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.4', '8.0', '8.1', '8.2'] + php-versions: ['7.4', '8.0', '8.1'] steps: - uses: actions/checkout@v2 @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.4', '8.0', '8.1', '8.2'] + php-versions: ['7.4', '8.0', '8.1'] steps: - uses: actions/checkout@v2 @@ -118,7 +118,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.4', '8.0', '8.1', '8.2'] + php-versions: ['7.4', '8.0', '8.1'] services: chrome: diff --git a/CHANGELOG.md b/CHANGELOG.md index edf3c370a..f7c3aa52c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,8 @@ Magento Functional Testing Framework Changelog 3.12.0 --------- -### Enhancements -* PHP 8.2 upgrade -* Added 8.2 PHP PR check - ### Fixes -* Removed obsolete docs/ directory +* Removed obsolete docs/directories 3.11.1 --------- diff --git a/composer.json b/composer.json index 7587c8e69..acce9c538 100755 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "sort-packages": true }, "require": { - "php": ">=7.4", + "php": ">7.4", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", diff --git a/composer.lock b/composer.lock index f1ba2a720..675c10142 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": "5166946691764450a52bcb32f7df5ed5", + "content-hash": "5c71813955e7c4eed34b8f3ab5d85ad6", "packages": [ { "name": "allure-framework/allure-codeception", @@ -8323,7 +8323,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.4", + "php": ">7.4", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", From bf6c3ddd5d1821be29c80233f78b78eac8e780b1 Mon Sep 17 00:00:00 2001 From: Faizan Shaikh <glo88465@adobe.com> Date: Tue, 6 Dec 2022 13:51:46 +0530 Subject: [PATCH 364/674] AC-7354:Composer laminas issue when using 2.4.6-develop with Composer 2.4.2 - Downgraded composer to 2.2.x LTS version --- composer.json | 1 + composer.lock | 347 +++++++++++++++----------------------------------- 2 files changed, 102 insertions(+), 246 deletions(-) diff --git a/composer.json b/composer.json index f17616f03..8bb87779e 100755 --- a/composer.json +++ b/composer.json @@ -32,6 +32,7 @@ "php-webdriver/webdriver": "^1.9.0", "spomky-labs/otphp": "^10.0", "symfony/console": "^4.4||^5.4", + "symfony/string": "^5.4", "symfony/dotenv": "^5.3", "symfony/finder": "^5.0", "symfony/http-foundation": "^5.0", diff --git a/composer.lock b/composer.lock index 2a89e16e0..bc7d331cc 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": "0a03c0d9728b114cf546845bd6a368fc", + "content-hash": "142da041e0d8a87aff0865cc1cdeaa4f", "packages": [ { "name": "allure-framework/allure-codeception", @@ -847,16 +847,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.3", + "version": "1.3.4", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" + "reference": "69098eca243998b53eed7a48d82dedd28b447cd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", - "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/69098eca243998b53eed7a48d82dedd28b447cd5", + "reference": "69098eca243998b53eed7a48d82dedd28b447cd5", "shasum": "" }, "require": { @@ -903,7 +903,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.3" + "source": "https://github.com/composer/ca-bundle/tree/1.3.4" }, "funding": [ { @@ -919,124 +919,43 @@ "type": "tidelift" } ], - "time": "2022-07-20T07:14:26+00:00" - }, - { - "name": "composer/class-map-generator", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", - "shasum": "" - }, - "require": { - "composer/pcre": "^2 || ^3", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" - }, - "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\ClassMapGenerator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Utilities to scan PHP code and generate class maps.", - "keywords": [ - "classmap" - ], - "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" - }, - "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": "2022-06-19T11:31:27+00:00" + "time": "2022-10-12T12:08:29+00:00" }, { "name": "composer/composer", - "version": "2.4.2", + "version": "2.2.18", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9" + "reference": "84175907664ca8b73f73f4883e67e886dfefb9f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/7d887621e69a0311eb50aed4a16f7044b2b385b9", - "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9", + "url": "https://api.github.com/repos/composer/composer/zipball/84175907664ca8b73f73f4883e67e886dfefb9f5", + "reference": "84175907664ca8b73f73f4883e67e886dfefb9f5", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2 || ^3", + "composer/pcre": "^1.0", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.5.7", - "composer/xdebug-handler": "^2.0.2 || ^3.0.3", + "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^2.0 || ^3.0", "justinrainbow/json-schema": "^5.2.11", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8", + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0 || ^2.0", + "react/promise": "^1.2 || ^2.7", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.2", - "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/polyfill-php73": "^1.24", - "symfony/polyfill-php80": "^1.24", - "symfony/process": "^5.4 || ^6.0" + "seld/phar-utils": "^1.0", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", + "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" }, "require-dev": { - "phpstan/phpstan": "^1.4.1", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1", - "phpstan/phpstan-symfony": "^1.2.10", - "symfony/phpunit-bridge": "^6.0" + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -1049,12 +968,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" - }, - "phpstan": { - "includes": [ - "phpstan/rules.neon" - ] + "dev-main": "2.2-dev" } }, "autoload": { @@ -1088,7 +1002,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.4.2" + "source": "https://github.com/composer/composer/tree/2.2.18" }, "funding": [ { @@ -1104,7 +1018,7 @@ "type": "tidelift" } ], - "time": "2022-09-14T14:11:15+00:00" + "time": "2022-08-20T09:33:38+00:00" }, { "name": "composer/metadata-minifier", @@ -1177,30 +1091,30 @@ }, { "name": "composer/pcre", - "version": "3.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560", + "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.3", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.x-dev" + "dev-main": "1.x-dev" } }, "autoload": { @@ -1228,7 +1142,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" + "source": "https://github.com/composer/pcre/tree/1.0.1" }, "funding": [ { @@ -1244,7 +1158,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T20:21:48+00:00" + "time": "2022-01-21T20:24:37+00:00" }, { "name": "composer/semver", @@ -1409,25 +1323,27 @@ }, { "name": "composer/xdebug-handler", - "version": "2.0.2", + "version": "2.0.5", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" + "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", - "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/9e36aeed4616366d2b690bdce11f71e9178c579a", + "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a", "shasum": "" }, "require": { + "composer/pcre": "^1", "php": "^5.3.2 || ^7.0 || ^8.0", "psr/log": "^1 || ^2 || ^3" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" }, "type": "library", "autoload": { @@ -1453,7 +1369,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" + "source": "https://github.com/composer/xdebug-handler/tree/2.0.5" }, "funding": [ { @@ -1469,7 +1385,7 @@ "type": "tidelift" } ], - "time": "2021-07-31T17:03:58+00:00" + "time": "2022-02-24T20:20:32+00:00" }, { "name": "csharpru/vault-php", @@ -5339,67 +5255,6 @@ }, "time": "2022-08-31T10:31:18+00:00" }, - { - "name": "seld/signal-handler", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "require-dev": { - "phpstan/phpstan": "^1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "psr/log": "^1 || ^2 || ^3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\Signal\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", - "keywords": [ - "posix", - "sigint", - "signal", - "sigterm", - "unix" - ], - "support": { - "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" - }, - "time": "2022-07-20T18:31:45+00:00" - }, { "name": "spomky-labs/otphp", "version": "v10.0.1", @@ -5477,16 +5332,16 @@ }, { "name": "symfony/console", - "version": "v5.4.13", + "version": "v5.4.16", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be" + "reference": "8e9b9c8dfb33af6057c94e1b44846bee700dc5ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", - "reference": "3f97f6c7b7e26848a90c0c0cfb91eeb2bb8618be", + "url": "https://api.github.com/repos/symfony/console/zipball/8e9b9c8dfb33af6057c94e1b44846bee700dc5ef", + "reference": "8e9b9c8dfb33af6057c94e1b44846bee700dc5ef", "shasum": "" }, "require": { @@ -5556,7 +5411,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.13" + "source": "https://github.com/symfony/console/tree/v5.4.16" }, "funding": [ { @@ -5572,7 +5427,7 @@ "type": "tidelift" } ], - "time": "2022-08-26T13:50:20+00:00" + "time": "2022-11-25T14:09:27+00:00" }, { "name": "symfony/css-selector", @@ -6225,16 +6080,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { @@ -6249,7 +6104,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6287,7 +6142,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -6303,20 +6158,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -6328,7 +6183,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6368,7 +6223,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" }, "funding": [ { @@ -6384,7 +6239,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6475,16 +6330,16 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -6496,7 +6351,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6539,7 +6394,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { @@ -6555,20 +6410,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { @@ -6583,7 +6438,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6622,7 +6477,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -6638,7 +6493,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php72", @@ -6718,16 +6573,16 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", "shasum": "" }, "require": { @@ -6736,7 +6591,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6777,7 +6632,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" }, "funding": [ { @@ -6793,20 +6648,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { @@ -6815,7 +6670,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6860,7 +6715,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { @@ -6876,7 +6731,7 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php81", @@ -7104,16 +6959,16 @@ }, { "name": "symfony/string", - "version": "v5.4.13", + "version": "v5.4.15", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "2900c668a32138a34118740de3e4d5a701801f53" + "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/2900c668a32138a34118740de3e4d5a701801f53", - "reference": "2900c668a32138a34118740de3e4d5a701801f53", + "url": "https://api.github.com/repos/symfony/string/zipball/571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", + "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", "shasum": "" }, "require": { @@ -7170,7 +7025,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.13" + "source": "https://github.com/symfony/string/tree/v5.4.15" }, "funding": [ { @@ -7186,7 +7041,7 @@ "type": "tidelift" } ], - "time": "2022-09-01T01:52:16+00:00" + "time": "2022-10-05T15:16:54+00:00" }, { "name": "symfony/yaml", @@ -8332,5 +8187,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.2.0" } From a01b754c96b89033c62644145f1a87cc21ff21f5 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 7 Dec 2022 21:05:18 +0530 Subject: [PATCH 365/674] Upgrade php 8.2, mftf deprecation error fixes , drop 7.4 support --- .../Test/Parsers/ActionGroupDataParser.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Parsers/ActionGroupDataParser.php b/src/Magento/FunctionalTestingFramework/Test/Parsers/ActionGroupDataParser.php index 9902a3764..57e90dd0e 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Parsers/ActionGroupDataParser.php +++ b/src/Magento/FunctionalTestingFramework/Test/Parsers/ActionGroupDataParser.php @@ -11,10 +11,14 @@ /** * Class ActionGroupDataParser */ -#[\AllowDynamicProperties] class ActionGroupDataParser { + /** + * @var DataInterface + */ + private $actionGroupData; + /** * ActionGroupDataParser constructor. * From cb3756315010e2d94e43c7f747a7570c5d34194e Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Thu, 8 Dec 2022 19:25:04 +0530 Subject: [PATCH 366/674] ACQE-2580: changes --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 1b4133c9d..da41a14a5 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -273,7 +273,7 @@ public function assembleTestPhp($testObject) $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; throw new TestFrameworkException(implode(PHP_EOL, $err)); } - if (!empty($argArr[$key - 1]) && $argArr[$key - 1] === $arrVal) { + if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; throw new TestFrameworkException(implode(PHP_EOL, $err)); } From 86f4f10df54983cfe2cf6f284f0b10a628c87703 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Sat, 10 Dec 2022 19:40:48 -0600 Subject: [PATCH 367/674] Update main.yml --- .github/workflows/main.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cad5c70a6..fb3268b96 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,6 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.0', '8.1', '8.2'] steps: - uses: actions/checkout@v2 @@ -55,7 +54,6 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.0', '8.1', '8.2'] steps: - uses: actions/checkout@v2 @@ -88,7 +86,6 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.0', '8.1', '8.2'] steps: - uses: actions/checkout@v2 @@ -121,7 +118,6 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.0', '8.1', '8.2'] services: From 27017d30e893f8f2588b701ff1dc924877de9cb6 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Sat, 10 Dec 2022 19:49:15 -0600 Subject: [PATCH 368/674] Update DeprecatedContentSection.xml --- .../tests/MFTF/DevDocs/Section/DeprecatedContentSection.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/functional/tests/MFTF/DevDocs/Section/DeprecatedContentSection.xml b/dev/tests/functional/tests/MFTF/DevDocs/Section/DeprecatedContentSection.xml index 8ed018146..63431e2a1 100644 --- a/dev/tests/functional/tests/MFTF/DevDocs/Section/DeprecatedContentSection.xml +++ b/dev/tests/functional/tests/MFTF/DevDocs/Section/DeprecatedContentSection.xml @@ -9,6 +9,6 @@ <sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd"> <section name="DeprecatedContentSection" deprecated="New section was introduces. Please use 'contentSection'"> - <element name="pageIntro" type="text" selector=".page-intro"/> + <element name="pageIntro" type="text" selector="#introduction-to-the-functional-testing-framework"/> </section> </sections> From a5c32e1928bb3418618481c2d311bbe261ecc713 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Sat, 10 Dec 2022 19:53:34 -0600 Subject: [PATCH 369/674] Update DeprecatedMessageData.xml --- .../tests/MFTF/DevDocs/Data/DeprecatedMessageData.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/functional/tests/MFTF/DevDocs/Data/DeprecatedMessageData.xml b/dev/tests/functional/tests/MFTF/DevDocs/Data/DeprecatedMessageData.xml index ba1460a60..8be85b447 100644 --- a/dev/tests/functional/tests/MFTF/DevDocs/Data/DeprecatedMessageData.xml +++ b/dev/tests/functional/tests/MFTF/DevDocs/Data/DeprecatedMessageData.xml @@ -9,7 +9,7 @@ <entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd"> <entity name="DeprecatedMessageData" deprecated="Entity is deprecated. Please use 'MessageData'."> - <data key="message">Introduction to the Magento Functional Testing Framework</data> + <data key="message">Introduction to the Functional Testing Framework</data> </entity> <entity name="MessageData"> <data key="justSomeField">Some data</data> From 6aece8cefa119aec9b46c9cf56a65af5d8f996ee Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Sat, 10 Dec 2022 20:03:11 -0600 Subject: [PATCH 370/674] Update Functional Tests --- dev/tests/functional/tests/MFTF/DevDocs/Data/MessageData.xml | 2 +- .../functional/tests/MFTF/DevDocs/Section/ContentSection.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/functional/tests/MFTF/DevDocs/Data/MessageData.xml b/dev/tests/functional/tests/MFTF/DevDocs/Data/MessageData.xml index f35812e54..2a973ce53 100644 --- a/dev/tests/functional/tests/MFTF/DevDocs/Data/MessageData.xml +++ b/dev/tests/functional/tests/MFTF/DevDocs/Data/MessageData.xml @@ -9,7 +9,7 @@ <entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd"> <entity name="MessageData"> - <data key="message">Introduction to the Magento Functional Testing Framework</data> + <data key="message">Introduction to the Functional Testing Framework</data> <array key="numbers"> <item name="zero">0</item> <item name="one">1</item> diff --git a/dev/tests/functional/tests/MFTF/DevDocs/Section/ContentSection.xml b/dev/tests/functional/tests/MFTF/DevDocs/Section/ContentSection.xml index a365c9ff5..219752bf5 100644 --- a/dev/tests/functional/tests/MFTF/DevDocs/Section/ContentSection.xml +++ b/dev/tests/functional/tests/MFTF/DevDocs/Section/ContentSection.xml @@ -11,7 +11,7 @@ <sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd"> <section name="contentSection"> - <element name="pageIntro" type="text" selector=".page-intro"/> + <element name="pageIntro" type="text" selector="#introduction-to-the-functional-testing-framework"/> <element name="parametrizedSelector" type="text" selector=".page-intro > {{justToProofItWorks}}" parameterized="true"/> <element name="deprecatedPageIntro" type="text" selector=".page-intro-old" deprecated="New element was introduced. Please use 'contentSection.pageIntro'"/> </section> From e60ad9eb177d6f684a7167377b3ddd5abb3bf285 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Mon, 12 Dec 2022 10:45:10 +0530 Subject: [PATCH 371/674] MFTF 4.0.0 Release checklist --- CHANGELOG.md | 13 +++++++++++++ composer.json | 2 +- composer.lock | 4 ++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7c3aa52c..f7145925b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,19 @@ Magento Functional Testing Framework Changelog ================================================ +4.0.0 +--------- +### Enhancements + +* Added Supported for PHP 8.2 and enabled PR checks for PHP 8.2 +* Dropped Support for PHP 7.4 and disabled PR checks for PHP 7.4 +* Upgraded allure-framework/allure-phpunit to its latest version + +### Fixes + +* MFTF deprecation errors fixes +* Composer downgraded from 2.4 to 2.2 due to lamina issue + 3.12.0 --------- diff --git a/composer.json b/composer.json index 03dbe1529..c1cf2dd20 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": "3.12.0", + "version": "4.0.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 813ae76fe..15e5a1ec7 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": "a605dc88d14ca426ab5d2887381d1c4e", + "content-hash": "4391b8b8b703305e036f1e42ac445ea3", "packages": [ { "name": "allure-framework/allure-codeception", @@ -8323,5 +8323,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.3.0" } From c5c4938dc5f47188e540c13fd6cd3d0396a5de26 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 20 Dec 2022 13:01:40 +0530 Subject: [PATCH 372/674] ACQE-4375 : Fix for png and html files not shown in allure report --- .../Module/MagentoWebDriver.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 75d91bd1c..bc9d92662 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -30,6 +30,8 @@ use Yandex\Allure\Adapter\Support\AttachmentSupport; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; +use Yandex\Allure\Adapter\Allure as YandexAllure; +use Yandex\Allure\Adapter\Event\AddAttachmentEvent; /** * MagentoWebDriver module provides common Magento web actions through Selenium WebDriver. @@ -910,10 +912,8 @@ public function _failed(TestInterface $test, $fail) if ($this->current_test === null) { throw new \RuntimeException("Suite condition failure: \n" . $fail->getMessage()); } - - $this->addAttachment($this->pngReport, $test->getMetadata()->getName() . '.png', 'image/png'); - $this->addAttachment($this->htmlReport, $test->getMetadata()->getName() . '.html', 'text/html'); - + YandexAllure::lifecycle()->fire(new AddAttachmentEvent($this->pngReport, $test->getMetadata()->getName() . '.png', 'image/png')); + YandexAllure::lifecycle()->fire(new AddAttachmentEvent($this->htmlReport, $test->getMetadata()->getName() . '.html', 'text/html')); $this->debug("Failure due to : {$fail->getMessage()}"); $this->debug("Screenshot saved to {$this->pngReport}"); $this->debug("Html saved to {$this->htmlReport}"); From 89be1343e57d5d31f35567e76af4c3810d72db85 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 20 Dec 2022 13:44:16 +0530 Subject: [PATCH 373/674] Fixed static check error --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index bc9d92662..65d0dd660 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -912,8 +912,10 @@ public function _failed(TestInterface $test, $fail) if ($this->current_test === null) { throw new \RuntimeException("Suite condition failure: \n" . $fail->getMessage()); } - YandexAllure::lifecycle()->fire(new AddAttachmentEvent($this->pngReport, $test->getMetadata()->getName() . '.png', 'image/png')); - YandexAllure::lifecycle()->fire(new AddAttachmentEvent($this->htmlReport, $test->getMetadata()->getName() . '.html', 'text/html')); + YandexAllure::lifecycle() + ->fire(new AddAttachmentEvent($this->pngReport, $test->getMetadata()->getName() . '.png', 'image/png')); + YandexAllure::lifecycle() + ->fire(new AddAttachmentEvent($this->htmlReport, $test->getMetadata()->getName() . '.html', 'text/html')); $this->debug("Failure due to : {$fail->getMessage()}"); $this->debug("Screenshot saved to {$this->pngReport}"); $this->debug("Html saved to {$this->htmlReport}"); From b997ad505b766ea8d7a52077d4e1d93e0c85c394 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Wed, 21 Dec 2022 14:19:02 +0530 Subject: [PATCH 374/674] Update MagentoWebDriver.php --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 9428c4955..327996abe 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -908,7 +908,7 @@ public function _failed(TestInterface $test, $fail) } if ($this->current_test === null) { - throw new \RuntimeException("Suite condition failure: \n" . " Unable to connect to selenium server "); + throw new \RuntimeException("Suite condition failure: \n" . " Something went wrong with selenium server/chrome driver "); } $this->addAttachment($this->pngReport, $test->getMetadata()->getName() . '.png', 'image/png'); From 300c3e23b424ea37fd05074eab6ce6b276944779 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Wed, 21 Dec 2022 14:20:52 +0530 Subject: [PATCH 375/674] Update MagentoWebDriver.php --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 327996abe..62706766d 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -908,7 +908,8 @@ public function _failed(TestInterface $test, $fail) } if ($this->current_test === null) { - throw new \RuntimeException("Suite condition failure: \n" . " Something went wrong with selenium server/chrome driver "); + throw new \RuntimeException("Suite condition failure: \n" + . " Something went wrong with selenium server/chrome driver "); } $this->addAttachment($this->pngReport, $test->getMetadata()->getName() . '.png', 'image/png'); From 0e7c386d6b99b909f6d6bbcc92361d3cd8008013 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Wed, 21 Dec 2022 14:22:15 +0530 Subject: [PATCH 376/674] Update MagentoWebDriver.php --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 62706766d..fc0e78762 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -908,7 +908,7 @@ public function _failed(TestInterface $test, $fail) } if ($this->current_test === null) { - throw new \RuntimeException("Suite condition failure: \n" + throw new \RuntimeException("Suite condition failure: \n" . " Something went wrong with selenium server/chrome driver "); } From 8e967d4e5c333b23c08191d36ece9c458b227833 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Thu, 29 Dec 2022 19:29:50 +0530 Subject: [PATCH 377/674] Update MagentoWebDriver.php --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 32e49a5e1..65efa726d 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -910,8 +910,9 @@ public function _failed(TestInterface $test, $fail) } if ($this->current_test === null) { - throw new \RuntimeException("Suite condition failure: \n" - . " Something went wrong with selenium server/chrome driver "); + throw new \RuntimeEcleaxception("Suite condition failure: \n" + . " Something went wrong with selenium server/chrome driver : \n . + {$fail->getMessage()}\n{$fail->getTraceAsString()}"); } YandexAllure::lifecycle() ->fire(new AddAttachmentEvent($this->pngReport, $test->getMetadata()->getName() . '.png', 'image/png')); From d15444126c6c2c5067da3256fca6d1423b052ae5 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Mon, 2 Jan 2023 16:02:48 +0530 Subject: [PATCH 378/674] ACQE-4318: suite format changes --- src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 44e4e0b45..ac2928754 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -165,6 +165,7 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa $this->validateTestsReferencedInSuite($suiteName, $tests, $originalSuiteName); foreach ($tests as $testName) { try { + echo $suiteCount.":".$key.":".$suiteName.':'.$testName."\n"; $relevantTests[$testName] = TestObjectHandler::getInstance()->getObject($testName); } catch (FastFailException $e) { throw $e; From 97aaa06c5d8e724579bfb52c38de5c35eb10fb11 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Mon, 2 Jan 2023 16:10:24 +0530 Subject: [PATCH 379/674] ACQE-4318: suite format changes --- src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index ac2928754..44e4e0b45 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -165,7 +165,6 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa $this->validateTestsReferencedInSuite($suiteName, $tests, $originalSuiteName); foreach ($tests as $testName) { try { - echo $suiteCount.":".$key.":".$suiteName.':'.$testName."\n"; $relevantTests[$testName] = TestObjectHandler::getInstance()->getObject($testName); } catch (FastFailException $e) { throw $e; From f07777382150e621d986d7d197d6d5ee4cf01c35 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Mon, 2 Jan 2023 16:11:40 +0530 Subject: [PATCH 380/674] ACQE-4318: suite format changes --- src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 44e4e0b45..ac2928754 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -165,6 +165,7 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa $this->validateTestsReferencedInSuite($suiteName, $tests, $originalSuiteName); foreach ($tests as $testName) { try { + echo $suiteCount.":".$key.":".$suiteName.':'.$testName."\n"; $relevantTests[$testName] = TestObjectHandler::getInstance()->getObject($testName); } catch (FastFailException $e) { throw $e; From a506a276a2b1415f3c507264f2933449e8b7d482 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Thu, 5 Jan 2023 11:28:29 +0530 Subject: [PATCH 381/674] MFTF 4.0.1 Release checklist --- CHANGELOG.md | 6 ++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7145925b..602cd5ada 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Magento Functional Testing Framework Changelog ================================================ +4.0.1 +--------- +### Fixes + +* Fixed HTML files and images not attached to allure report issue + 4.0.0 --------- ### Enhancements diff --git a/composer.json b/composer.json index c1cf2dd20..576d373bb 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": "4.0.0", + "version": "4.0.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 15e5a1ec7..1314c0a40 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": "4391b8b8b703305e036f1e42ac445ea3", + "content-hash": "dfd91f632124125cb11795b89e327530", "packages": [ { "name": "allure-framework/allure-codeception", From b23a47bafd5fa70ffd61f73b3ea7b56e8089be80 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Wed, 11 Jan 2023 19:13:09 +0530 Subject: [PATCH 382/674] ACQE-4318: testgroupmembership file updated --- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index ac2928754..10d5e59de 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -156,8 +156,9 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa { $relativePath = TestGenerator::GENERATED_DIR . DIRECTORY_SEPARATOR . $suiteName; $fullPath = FilePathFormatter::format(TESTS_MODULE_PATH) . $relativePath . DIRECTORY_SEPARATOR; - DirSetupUtil::createGroupDir($fullPath); + $memberShipFilePath = FilePathFormatter::format(TESTS_MODULE_PATH).'_generated/testgroupmembership.txt'; + static $suiteCount = 0; $exceptionCollector = new ExceptionCollector(); try { $relevantTests = []; @@ -165,7 +166,8 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa $this->validateTestsReferencedInSuite($suiteName, $tests, $originalSuiteName); foreach ($tests as $testName) { try { - echo $suiteCount.":".$key.":".$suiteName.':'.$testName."\n"; + $suiteTests = $suiteCount.":".$key.":".$suiteName.':'.$testName."\n"; + file_put_contents($memberShipFilePath, $suiteTests, FILE_APPEND); $relevantTests[$testName] = TestObjectHandler::getInstance()->getObject($testName); } catch (FastFailException $e) { throw $e; @@ -179,7 +181,7 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa } else { $relevantTests = SuiteObjectHandler::getInstance()->getObject($suiteName)->getTests(); } - + $suiteCount++; if (empty($relevantTests)) { $exceptionCollector->reset(); // There are suites that include no test on purpose for certain Magento edition. From 0022b3631c72ea6e461d78bdf95ce3c60816fb14 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Sun, 15 Jan 2023 14:48:05 +0530 Subject: [PATCH 383/674] ACQE-4318 --- src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 10d5e59de..7e6b7fa3e 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -164,7 +164,7 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa $relevantTests = []; if (!empty($tests)) { $this->validateTestsReferencedInSuite($suiteName, $tests, $originalSuiteName); - foreach ($tests as $testName) { + foreach ($tests as $key => $testName) { try { $suiteTests = $suiteCount.":".$key.":".$suiteName.':'.$testName."\n"; file_put_contents($memberShipFilePath, $suiteTests, FILE_APPEND); From d244b3a22eecb91e114121cd4cba2f46a23be454 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Sun, 15 Jan 2023 14:50:37 +0530 Subject: [PATCH 384/674] ACQE-4318 --- src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 7e6b7fa3e..9577db5c6 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -157,7 +157,7 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa $relativePath = TestGenerator::GENERATED_DIR . DIRECTORY_SEPARATOR . $suiteName; $fullPath = FilePathFormatter::format(TESTS_MODULE_PATH) . $relativePath . DIRECTORY_SEPARATOR; DirSetupUtil::createGroupDir($fullPath); - $memberShipFilePath = FilePathFormatter::format(TESTS_MODULE_PATH).'_generated/testgroupmembership.txt'; + $memberShipFilePath = FilePathFormatter::format(TESTS_MODULE_PATH).'_generated/groups/testgroupmembership.txt'; static $suiteCount = 0; $exceptionCollector = new ExceptionCollector(); try { From e7b5ee455e6bb3b3a82ad36b230d3b26c84bb7b5 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Sun, 15 Jan 2023 14:54:28 +0530 Subject: [PATCH 385/674] ACQE-4318 --- src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 9577db5c6..7e6b7fa3e 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -157,7 +157,7 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa $relativePath = TestGenerator::GENERATED_DIR . DIRECTORY_SEPARATOR . $suiteName; $fullPath = FilePathFormatter::format(TESTS_MODULE_PATH) . $relativePath . DIRECTORY_SEPARATOR; DirSetupUtil::createGroupDir($fullPath); - $memberShipFilePath = FilePathFormatter::format(TESTS_MODULE_PATH).'_generated/groups/testgroupmembership.txt'; + $memberShipFilePath = FilePathFormatter::format(TESTS_MODULE_PATH).'_generated/testgroupmembership.txt'; static $suiteCount = 0; $exceptionCollector = new ExceptionCollector(); try { From a0e77ef460eb353de75393d8249a1a8f41f10c1f Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 16 Jan 2023 13:57:19 +0530 Subject: [PATCH 386/674] Update MagentoWebDriver.php --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 65efa726d..68e8d5064 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -910,7 +910,7 @@ public function _failed(TestInterface $test, $fail) } if ($this->current_test === null) { - throw new \RuntimeEcleaxception("Suite condition failure: \n" + throw new \RuntimeException("Suite condition failure: \n" . " Something went wrong with selenium server/chrome driver : \n . {$fail->getMessage()}\n{$fail->getTraceAsString()}"); } From bdcde5cac572dfa9236f273b5ad1462580d4114d Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 18 Jan 2023 12:29:36 +0530 Subject: [PATCH 387/674] ACQE-2580: Wrote unit test --- .../Util/TestGeneratorTest.php | 99 +++++++++++++++++++ .../Util/TestGenerator.php | 48 +++++---- 2 files changed, 128 insertions(+), 19 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index dbdff8304..9808c516b 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -24,6 +24,7 @@ use ReflectionProperty; use tests\unit\Util\MagentoTestCase; use tests\unit\Util\TestLoggingUtil; +use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; class TestGeneratorTest extends MagentoTestCase { @@ -299,6 +300,104 @@ function ($filename) use (&$generatedTests) { $this->assertArrayNotHasKey('test2Cest', $generatedTests); } + /** + * Test for exception thrown when duplicate arguments found + * + * @return void + * @throws TestFrameworkException + */ + public function testIfExceptionThrownWhenDuplicateArgumentsFound() + { + $fileContents = '<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="ActionGroupReturningValueActionGroup"> + <arguments> + <argument name="count" type="string"/> + <argument name="count" type="string"/> + </arguments> + <grabMultiple selector="selector" stepKey="grabProducts1"/> + <assertCount stepKey="assertCount"> + <expectedResult type="int">{{count}}</expectedResult> + <actualResult type="variable">grabProducts1</actualResult> + </assertCount> + <return value="{$grabProducts1}" stepKey="returnProducts1"/> + </actionGroup> + </actionGroups>'; + $actionInput = 'fakeInput'; + $actionObject = new ActionObject('fakeAction', 'comment', [ + 'userInput' => $actionInput + ]); + $annotation1 = ['group' => ['someGroupValue']]; + + $test1 = new TestObject( + 'test1', + ['fakeAction' => $actionObject], + $annotation1, + [], + 'filename' + ); + $annotation2 = ['group' => ['someOtherGroupValue']]; + + $test2 = new TestObject( + 'test2', + ['fakeAction' => $actionObject], + $annotation2, + [], + 'filename' + ); + $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); + $this->expectException(TestFrameworkException::class); + $testGeneratorObject->throwExceptionIfDuplicateArgumentsFound($fileContents); + } + + /** + * Test for exception not thrown when duplicate arguments not found + * + * @return void + */ + public function testIfExceptionNotThrownWhenDuplicateArgumentsNotFound() + { + $fileContents = '<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="ActionGroupReturningValueActionGroup"> + <arguments> + <argument name="count" type="string"/> + </arguments> + <grabMultiple selector="selector" stepKey="grabProducts1"/> + <assertCount stepKey="assertCount"> + <expectedResult type="int">{{count}}</expectedResult> + <actualResult type="variable">grabProducts1</actualResult> + </assertCount> + <return value="{$grabProducts1}" stepKey="returnProducts1"/> + </actionGroup> + </actionGroups>'; + $actionInput = 'fakeInput'; + $actionObject = new ActionObject('fakeAction', 'comment', [ + 'userInput' => $actionInput + ]); + $annotation1 = ['group' => ['someGroupValue']]; + + $test1 = new TestObject( + 'test1', + ['fakeAction' => $actionObject], + $annotation1, + [], + 'filename' + ); + $annotation2 = ['group' => ['someOtherGroupValue']]; + + $test2 = new TestObject( + 'test2', + ['fakeAction' => $actionObject], + $annotation2, + [], + 'filename' + ); + $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); + $result = $testGeneratorObject->throwExceptionIfDuplicateArgumentsFound($fileContents); + $this->assertEquals($result, ""); + } + /** * Tests that TestGenerator createAllTestFiles correctly filters based on group. * diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 614df5bce..20d764189 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -247,6 +247,34 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) $this->createCestFile($testPhpFile[1], $testPhpFile[0]); } } + /** + * Throw exception if duplicate arguments found + * + * @param string $fileContents + * @return void + * @throws TestFrameworkException + */ + public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) + { + // Throw exception if duplicate arguments found in helper or actionGroup + $fileToArr = explode("\n", $fileContents); + $argArr = []; + foreach ($fileToArr as $key => $fileVal) { + if (!empty(strpos($fileVal, "<argument name"))) { + $argArr[$key] = explode(" ", trim($fileVal))[1]; + } + } + foreach ($argArr as $key => $arrVal) { + if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + } + } /** * Assemble the entire PHP string for a single Test based on a Test Object. @@ -259,27 +287,9 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) */ public function assembleTestPhp($testObject) { - // Throw exception if duplicate arguments found in helper or actionGroup if (!empty($testObject->getFilename()) && file_exists($testObject->getFilename())) { - $fileToArr = explode("\n", file_get_contents($testObject->getFilename())); - $argArr = []; - foreach ($fileToArr as $key => $fileVal) { - if (!empty(strpos($fileVal, "<argument name"))) { - $argArr[$key] = explode(" ", trim($fileVal))[1]; - } - } - foreach ($argArr as $key => $arrVal) { - if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } - if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } - } + $this->throwExceptionIfDuplicateArgumentsFound(file_get_contents($testObject->getFilename())); } - $this->customHelpers = []; $usePhp = $this->generateUseStatementsPhp(); From ae8661e1dcfced7c29534dd22c778d888e3a7c48 Mon Sep 17 00:00:00 2001 From: Ji Lu <jilu1@adobe.com> Date: Thu, 26 Jan 2023 09:52:39 -0600 Subject: [PATCH 388/674] ACQE-4538: Allow mftf generate minimum possible groups runnable by codecept --- .../Util/Sorter/ParallelGroupSorterTest.php | 46 ++++++++- .../Util/Sorter/ParallelGroupSorter.php | 96 ++++++++++++++----- 2 files changed, 115 insertions(+), 27 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php index 03d4953cb..3d64e1346 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php @@ -420,6 +420,45 @@ public function testTestsAndSuitesSplitByGroupNumberSuiteNoTest(): void } } + /** + * Test splitting into minimum groups. + * + * @return void + */ + public function testSplitMinGroups(): void + { + // mock tests for test object handler. + $this->createMockForTest(0); + + // create test to size array + $sampleTestArray = [ + 'test1' => 1, + 'test2' => 125, + 'test3' => 35 + ]; + // create mock suite references + $sampleSuiteArray = [ + 'mockSuite1' => ['mockTest1', 'mockTest2'], + 'mockSuite2' => ['mockTest3', 'mockTest4'], + ]; + + // perform sort + $testSorter = new ParallelGroupSorter(); + $actualResult = $testSorter->getTestsGroupedByFixedGroupCount($sampleSuiteArray, $sampleTestArray, 3); + // verify the resulting groups + $this->assertCount(3, $actualResult); + + $expectedResults = [ + 1 => ['test2', 'test3', 'test1'], + 2 => ['mockSuite1'], + 3 => ['mockSuite2'], + ]; + + foreach ($actualResult as $groupNum => $group) { + $this->assertEquals($expectedResults[$groupNum], array_keys($group)); + } + } + /** * Test splitting tests and suites with invalid group number. * @@ -438,15 +477,16 @@ public function testTestsAndSuitesSplitByInvalidGroupNumber(): void ]; // create mock suite references $sampleSuiteArray = [ - 'mockSuite1' => ['mockTest1', 'mockTest2'] + 'mockSuite1' => ['mockTest1', 'mockTest2'], + 'mockSuite2' => ['mockTest3', 'mockTest4'], ]; $this->expectException(FastFailException::class); - $this->expectExceptionMessage("Invalid parameter 'groupTotal': must be equal or greater than 2"); + $this->expectExceptionMessage("Invalid parameter 'groupTotal': must be equal or greater than 3"); // perform sort $testSorter = new ParallelGroupSorter(); - $testSorter->getTestsGroupedByFixedGroupCount($sampleSuiteArray, $sampleTestArray, 1); + $testSorter->getTestsGroupedByFixedGroupCount($sampleSuiteArray, $sampleTestArray, 2); } /** diff --git a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php index d18626851..0049ed81a 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php +++ b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php @@ -37,7 +37,7 @@ public function __construct() public function getTestsGroupedBySize($suiteConfiguration, $testNameToSize, $time) { // we must have the lines argument in order to create the test groups - if ($time === 0) { + if ($time == 0) { throw new FastFailException( "Please provide the argument '--time' to the robo command in order to". " generate grouped tests manifests for a parallel execution" @@ -86,27 +86,38 @@ public function getTestsGroupedBySize($suiteConfiguration, $testNameToSize, $tim */ public function getTestsGroupedByFixedGroupCount($suiteConfiguration, $testNameToSize, $groupTotal) { - $suiteNameToTestSize = $this->getSuiteNameToTestSize($suiteConfiguration); - - $minRequiredGroupCount = count($suiteNameToTestSize); - if (!empty($testNameToSize)) { - $minRequiredGroupCount += 1; - } - if ($groupTotal < $minRequiredGroupCount) { - throw new FastFailException( - "Invalid parameter 'groupTotal': must be equal or greater than {$minRequiredGroupCount}" - ); - } - if (empty($suiteConfiguration)) { return $this->convertArrayIndexStartingAtOne($this->splitTestsIntoGroups($testNameToSize, $groupTotal)); } + $suiteNameToTestSize = $this->getSuiteNameToTestSize($suiteConfiguration); + // Calculate suite group totals $suiteNameToGroupCount = $this->getSuiteGroupCounts($suiteNameToTestSize, $testNameToSize, $groupTotal); - // Calculate test group total - $testGroupTotal = $groupTotal - array_sum($suiteNameToGroupCount); + $suitesGroupTotal = array_sum($suiteNameToGroupCount); + + // Calculate minimum required groups + $minSuiteGroupTotal = count($suiteNameToTestSize); + $minTestGroupTotal = empty($testNameToSize) ? 0 : 1; + $minRequiredGroupTotal = $minSuiteGroupTotal + $minTestGroupTotal; + + if ($groupTotal < $minRequiredGroupTotal) { + throw new FastFailException( + "Invalid parameter 'groupTotal': must be equal or greater than {$minRequiredGroupTotal}" + ); + } elseif ($groupTotal < $suitesGroupTotal + $minTestGroupTotal) { + // Split in savvy mode when $groupTotal requested is very small + $testGroupTotal = $minTestGroupTotal; + // Reduce suite group total + $suiteNameToGroupCount = $this->reduceSuiteGroupTotal( + $suiteNameToGroupCount, + $groupTotal - $minTestGroupTotal + ); + } else { + // Calculate test group total + $testGroupTotal = $groupTotal - $suitesGroupTotal; + } // Split tests and suites $testGroups = $this->splitTestsIntoGroups($testNameToSize, $testGroupTotal); @@ -140,19 +151,19 @@ private function getSuiteGroupCounts($suiteNameToTestSize, $testNameToSize, $gro $maxSuiteTime = max($suiteNameToSize); // Calculate 2 possible suite group times - $ceilSuiteGroupNumber = ceil($maxSuiteTime / $minGroupTime); + $ceilSuiteGroupNumber = (int)ceil($maxSuiteTime / $minGroupTime); $ceilSuiteGroupTime = max(ceil($maxSuiteTime / $ceilSuiteGroupNumber), $minGroupTime); - $floorSuiteGroupNumber = floor($maxSuiteTime / $minGroupTime); - if ($floorSuiteGroupNumber !== 0) { + $floorSuiteGroupNumber = (int)floor($maxSuiteTime / $minGroupTime); + if ($floorSuiteGroupNumber != 0) { $floorSuiteGroupTime = max(ceil($maxSuiteTime / $floorSuiteGroupNumber), $minGroupTime); } // Calculate test group time for ceiling $ceilSuiteNameToGroupCount = $this->getSuiteGroupCountFromGroupTime($suiteNameToTestSize, $ceilSuiteGroupTime); $ceilSuiteGroupTotal = array_sum($ceilSuiteNameToGroupCount); - $ceilTestGroupTotal = (int) $groupTotal - (int) $ceilSuiteGroupTotal; + $ceilTestGroupTotal = $groupTotal - $ceilSuiteGroupTotal; - if ($ceilTestGroupTotal === 0) { + if ($ceilTestGroupTotal == 0) { $ceilTestGroupTime = 0; } else { $ceilTestGroupTime = ceil(array_sum($testNameToSize) / $ceilTestGroupTotal); @@ -161,7 +172,7 @@ private function getSuiteGroupCounts($suiteNameToTestSize, $testNameToSize, $gro // Set suite group total to ceiling $suiteNameToGroupCount = $ceilSuiteNameToGroupCount; - if (isset($floorSuiteGroupTime) && $ceilSuiteGroupTime !== $floorSuiteGroupTime) { + if (isset($floorSuiteGroupTime) && $ceilSuiteGroupTime != $floorSuiteGroupTime) { // Calculate test group time for floor $floorSuiteNameToGroupCount = $this->getSuiteGroupCountFromGroupTime( $suiteNameToTestSize, @@ -169,7 +180,7 @@ private function getSuiteGroupCounts($suiteNameToTestSize, $testNameToSize, $gro ); $floorSuiteGroupTotal = array_sum($floorSuiteNameToGroupCount); $floorTestGroupTotal = $groupTotal - $floorSuiteGroupTotal; - if ($floorTestGroupTotal === 0) { + if ($floorTestGroupTotal == 0) { $floorTestGroupTime = 0; } else { $floorTestGroupTime = ceil(array_sum($testNameToSize) / $floorTestGroupTotal); @@ -187,6 +198,39 @@ private function getSuiteGroupCounts($suiteNameToTestSize, $testNameToSize, $gro return $suiteNameToGroupCount; } + /** + * Reduce total suite groups to a given $total. + * This method will reduce 1 from a suite that's greater than 1 repeatedly until sum of all groups reaches $total. + * + * @param array $suiteNameToGroupCount + * @param integer $total + * @return array + * @throws FastFailException + */ + private function reduceSuiteGroupTotal($suiteNameToGroupCount, $total) + { + if (count($suiteNameToGroupCount) > $total) { + throw new FastFailException( + "Invalid parameter 'total': must be equal or greater than {count($suiteNameToGroupCount)}" + ); + } + + $done = false; + while (!$done) { + foreach ($suiteNameToGroupCount as $suite => $count) { + if (array_sum($suiteNameToGroupCount) == $total) { + $done = true; + break; + } + if ($count > 1) { + $suiteNameToGroupCount[$suite] -= 1; + } + } + } + + return $suiteNameToGroupCount; + } + /** * Return array contains suitename to number of groups to be split based on time. * @@ -203,7 +247,7 @@ private function getSuiteGroupCountFromGroupTime($suiteNameToTestSize, $time) if ($suiteTime <= $time) { $suiteNameToGroupCount[$suiteName] = 1; } else { - $suiteNameToGroupCount[$suiteName] = min(ceil($suiteTime/$time), $maxCount); + $suiteNameToGroupCount[$suiteName] = min((int)ceil($suiteTime/$time), $maxCount); } } return $suiteNameToGroupCount; @@ -218,6 +262,10 @@ private function getSuiteGroupCountFromGroupTime($suiteNameToTestSize, $time) */ private function splitTestsIntoGroups($tests, $groupCnt) { + if (empty($tests)) { + return []; + } + // Reverse sort the test array by size uasort($tests, function ($a, $b) { return $a >= $b ? -1 : 1; @@ -247,7 +295,7 @@ private function splitSuitesIntoGroups($suiteNameToTestSize, $suiteNameToGroupCo $groups = []; foreach ($suiteNameToTestSize as $suiteName => $suiteTests) { $suiteCnt = $suiteNameToGroupCount[$suiteName]; - if ($suiteCnt === 1) { + if ($suiteCnt == 1) { $groups[][$suiteName] = array_sum($suiteTests); $this->addSuiteToConfig($suiteName, null, $suiteTests); } elseif ($suiteCnt > 1) { From b25d82bcd623e8a1ef0da79b209fe1ee01a28b5a Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 7 Feb 2023 10:42:25 +0530 Subject: [PATCH 389/674] ACQE-4573 : Fixed Allure report not generating issue --- composer.json | 3 +- composer.lock | 2124 +++++++++++++++++++++++++------------------------ 2 files changed, 1102 insertions(+), 1025 deletions(-) diff --git a/composer.json b/composer.json index 576d373bb..cc9d03115 100755 --- a/composer.json +++ b/composer.json @@ -39,7 +39,8 @@ "symfony/http-foundation": "^5.0", "symfony/mime": "^5.0", "symfony/process": "^4.4||^5.4", - "weew/helpers-array": "^1.3" + "weew/helpers-array": "^1.3", + "doctrine/annotations": "^1.13" }, "require-dev": { "brainmaestro/composer-git-hooks": "^2.3.1", diff --git a/composer.lock b/composer.lock index 1314c0a40..4eb64838f 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": "dfd91f632124125cb11795b89e327530", + "content-hash": "5d9d79116fc425859ae9db8604899a84", "packages": [ { "name": "allure-framework/allure-codeception", @@ -69,16 +69,16 @@ }, { "name": "allure-framework/allure-php-api", - "version": "1.3.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-php-api.git", - "reference": "f64b69afeff472c564a4e2379efb2b69c430ec5a" + "reference": "50507f482d490f114054f2281cca487db47fa2bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-api/zipball/f64b69afeff472c564a4e2379efb2b69c430ec5a", - "reference": "f64b69afeff472c564a4e2379efb2b69c430ec5a", + "url": "https://api.github.com/repos/allure-framework/allure-php-api/zipball/50507f482d490f114054f2281cca487db47fa2bd", + "reference": "50507f482d490f114054f2281cca487db47fa2bd", "shasum": "" }, "require": { @@ -110,7 +110,7 @@ "role": "Developer" } ], - "description": "PHP API for Allure adapter", + "description": "Allure PHP commons", "homepage": "http://allure.qatools.ru/", "keywords": [ "allure", @@ -119,28 +119,28 @@ "report" ], "support": { - "email": "allure@yandex-team.ru", + "email": "allure@qameta.io", "issues": "https://github.com/allure-framework/allure-php-api/issues", "source": "https://github.com/allure-framework/allure-php-api" }, - "time": "2021-03-26T14:32:27+00:00" + "time": "2021-11-15T13:15:20+00:00" }, { "name": "allure-framework/allure-php-commons", - "version": "v2.0.0", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-php-commons2.git", - "reference": "946e375e90cce9e43d1622890fb5a312ec8086bb" + "reference": "c2b222c1f999c851e029290c09a3fe4933390bda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/946e375e90cce9e43d1622890fb5a312ec8086bb", - "reference": "946e375e90cce9e43d1622890fb5a312ec8086bb", + "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/c2b222c1f999c851e029290c09a3fe4933390bda", + "reference": "c2b222c1f999c851e029290c09a3fe4933390bda", "shasum": "" }, "require": { - "doctrine/annotations": "^1.12", + "doctrine/annotations": "^1.12 || ^2", "ext-json": "*", "php": "^8", "psr/log": "^1 || ^2 || ^3", @@ -152,9 +152,9 @@ "require-dev": { "jetbrains/phpstorm-attributes": "^1", "phpunit/phpunit": "^9.5.10", - "psalm/plugin-phpunit": "^0.16.1", - "squizlabs/php_codesniffer": "^3.6.2", - "vimeo/psalm": "^4.15" + "psalm/plugin-phpunit": "^0.18.4", + "squizlabs/php_codesniffer": "^3.7.1", + "vimeo/psalm": "^5.4" }, "type": "library", "autoload": { @@ -193,20 +193,20 @@ "issues": "https://github.com/allure-framework/allure-php-commons2/issues", "source": "https://github.com/allure-framework/allure-php-commons" }, - "time": "2021-12-28T12:03:10+00:00" + "time": "2023-01-12T14:28:21+00:00" }, { "name": "allure-framework/allure-phpunit", - "version": "v2.0.0", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-phpunit.git", - "reference": "3884842467bcba9607db9d7aa69b82dcf0424218" + "reference": "a08e0092cdddfc8ead1953cf5bddf80b48595109" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-phpunit/zipball/3884842467bcba9607db9d7aa69b82dcf0424218", - "reference": "3884842467bcba9607db9d7aa69b82dcf0424218", + "url": "https://api.github.com/repos/allure-framework/allure-phpunit/zipball/a08e0092cdddfc8ead1953cf5bddf80b48595109", + "reference": "a08e0092cdddfc8ead1953cf5bddf80b48595109", "shasum": "" }, "require": { @@ -218,10 +218,10 @@ "amphp/byte-stream": "<1.5.1" }, "require-dev": { - "brianium/paratest": "^6.4.1", - "psalm/plugin-phpunit": "^0.16.1", - "squizlabs/php_codesniffer": "^3.6.2", - "vimeo/psalm": "^4.16.1" + "brianium/paratest": "^6.8", + "psalm/plugin-phpunit": "^0.18.4", + "squizlabs/php_codesniffer": "^3.7.1", + "vimeo/psalm": "^5.4" }, "type": "library", "autoload": { @@ -261,27 +261,27 @@ "issues": "https://github.com/allure-framework/allure-phpunit/issues", "source": "https://github.com/allure-framework/allure-phpunit" }, - "time": "2021-12-29T11:34:16+00:00" + "time": "2023-01-12T14:27:20+00:00" }, { "name": "aws/aws-crt-php", - "version": "v1.0.2", + "version": "v1.0.4", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "3942776a8c99209908ee0b287746263725685732" + "reference": "f5c64ee7c5fce196e2519b3d9b7138649efe032d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/3942776a8c99209908ee0b287746263725685732", - "reference": "3942776a8c99209908ee0b287746263725685732", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/f5c64ee7c5fce196e2519b3d9b7138649efe032d", + "reference": "f5c64ee7c5fce196e2519b3d9b7138649efe032d", "shasum": "" }, "require": { "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "^4.8.35|^5.4.3" + "phpunit/phpunit": "^4.8.35|^5.6.3" }, "type": "library", "autoload": { @@ -309,32 +309,32 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.0.2" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.0.4" }, - "time": "2021-09-03T22:57:30+00:00" + "time": "2023-01-31T23:08:25+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.198.7", + "version": "3.258.4", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "40197a954c9f49557a1b0d49e2a9bd6f7bf6adfc" + "reference": "c20d674f502ed96ed0de63e9da087eb5f0e95590" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/40197a954c9f49557a1b0d49e2a9bd6f7bf6adfc", - "reference": "40197a954c9f49557a1b0d49e2a9bd6f7bf6adfc", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c20d674f502ed96ed0de63e9da087eb5f0e95590", + "reference": "c20d674f502ed96ed0de63e9da087eb5f0e95590", "shasum": "" }, "require": { - "aws/aws-crt-php": "^1.0.2", + "aws/aws-crt-php": "^1.0.4", "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", - "guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", "guzzlehttp/promises": "^1.4.0", - "guzzlehttp/psr7": "^1.7.0", + "guzzlehttp/psr7": "^1.8.5 || ^2.3", "mtdowling/jmespath.php": "^2.6", "php": ">=5.5" }, @@ -342,6 +342,8 @@ "andrewsville/php-token-reflection": "^1.4", "aws/aws-php-sns-message-validator": "~1.0", "behat/behat": "~3.0", + "composer/composer": "^1.10.22", + "dms/phpunit-arraysubset-asserts": "^0.4.0", "doctrine/cache": "~1.4", "ext-dom": "*", "ext-openssl": "*", @@ -349,10 +351,11 @@ "ext-sockets": "*", "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^4.8.35|^5.4.3", + "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", "psr/cache": "^1.0", "psr/simple-cache": "^1.0", - "sebastian/comparator": "^1.2.3" + "sebastian/comparator": "^1.2.3 || ^4.0", + "yoast/phpunit-polyfills": "^1.0" }, "suggest": { "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", @@ -400,22 +403,22 @@ "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.198.7" + "source": "https://github.com/aws/aws-sdk-php/tree/3.258.4" }, - "time": "2021-10-18T18:17:12+00:00" + "time": "2023-02-06T19:28:40+00:00" }, { "name": "beberlei/assert", - "version": "v3.3.1", + "version": "v3.3.2", "source": { "type": "git", "url": "https://github.com/beberlei/assert.git", - "reference": "5e721d7e937ca3ba2cdec1e1adf195f9e5188372" + "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/beberlei/assert/zipball/5e721d7e937ca3ba2cdec1e1adf195f9e5188372", - "reference": "5e721d7e937ca3ba2cdec1e1adf195f9e5188372", + "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655", + "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655", "shasum": "" }, "require": { @@ -467,9 +470,9 @@ ], "support": { "issues": "https://github.com/beberlei/assert/issues", - "source": "https://github.com/beberlei/assert/tree/v3.3.1" + "source": "https://github.com/beberlei/assert/tree/v3.3.2" }, - "time": "2021-04-18T20:11:03+00:00" + "time": "2021-12-16T21:41:27+00:00" }, { "name": "behat/gherkin", @@ -536,26 +539,26 @@ }, { "name": "brick/math", - "version": "0.9.3", + "version": "0.10.2", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" + "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", - "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", + "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f", + "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f", "shasum": "" }, "require": { "ext-json": "*", - "php": "^7.1 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", - "vimeo/psalm": "4.9.2" + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "4.25.0" }, "type": "library", "autoload": { @@ -580,39 +583,35 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.9.3" + "source": "https://github.com/brick/math/tree/0.10.2" }, "funding": [ { "url": "https://github.com/BenMorel", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/brick/math", - "type": "tidelift" } ], - "time": "2021-08-15T20:50:18+00:00" + "time": "2022-08-10T22:54:19+00:00" }, { "name": "codeception/codeception", - "version": "4.1.22", + "version": "4.2.2", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f" + "reference": "b88014f3348c93f3df99dc6d0967b0dbfa804474" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", - "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/b88014f3348c93f3df99dc6d0967b0dbfa804474", + "reference": "b88014f3348c93f3df99dc6d0967b0dbfa804474", "shasum": "" }, "require": { "behat/gherkin": "^4.4.0", - "codeception/lib-asserts": "^1.0", + "codeception/lib-asserts": "^1.0 | 2.0.*@dev", "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", + "codeception/stub": "^2.0 | ^3.0 | ^4.0", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", @@ -625,11 +624,11 @@ "symfony/yaml": ">=2.7 <6.0" }, "require-dev": { - "codeception/module-asserts": "1.*@dev", - "codeception/module-cli": "1.*@dev", - "codeception/module-db": "1.*@dev", - "codeception/module-filesystem": "1.*@dev", - "codeception/module-phpbrowser": "1.*@dev", + "codeception/module-asserts": "^1.0 | 2.0.*@dev", + "codeception/module-cli": "^1.0 | 2.0.*@dev", + "codeception/module-db": "^1.0 | 2.0.*@dev", + "codeception/module-filesystem": "^1.0 | 2.0.*@dev", + "codeception/module-phpbrowser": "^1.0 | 2.0.*@dev", "codeception/specify": "~0.3", "codeception/util-universalframework": "*@dev", "monolog/monolog": "~1.8", @@ -652,6 +651,9 @@ "branch-alias": [] }, "autoload": { + "files": [ + "functions.php" + ], "psr-4": { "Codeception\\": "src/Codeception", "Codeception\\Extension\\": "ext" @@ -665,11 +667,11 @@ { "name": "Michael Bodnarchuk", "email": "davert@mail.ua", - "homepage": "http://codegyre.com" + "homepage": "https://codegyre.com" } ], "description": "BDD-style testing framework", - "homepage": "http://codeception.com/", + "homepage": "https://codeception.com/", "keywords": [ "BDD", "TDD", @@ -679,7 +681,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/4.1.22" + "source": "https://github.com/Codeception/Codeception/tree/4.2.2" }, "funding": [ { @@ -687,7 +689,7 @@ "type": "open_collective" } ], - "time": "2021-08-06T17:15:34+00:00" + "time": "2022-08-13T13:28:25+00:00" }, { "name": "codeception/lib-asserts", @@ -846,16 +848,16 @@ }, { "name": "codeception/module-webdriver", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/Codeception/module-webdriver.git", - "reference": "baa18b7bf70aa024012f967b5ce5021e1faa9151" + "reference": "e22ac7da756df659df6dd4fac2dff9c859e30131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/baa18b7bf70aa024012f967b5ce5021e1faa9151", - "reference": "baa18b7bf70aa024012f967b5ce5021e1faa9151", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/e22ac7da756df659df6dd4fac2dff9c859e30131", + "reference": "e22ac7da756df659df6dd4fac2dff9c859e30131", "shasum": "" }, "require": { @@ -896,22 +898,22 @@ ], "support": { "issues": "https://github.com/Codeception/module-webdriver/issues", - "source": "https://github.com/Codeception/module-webdriver/tree/1.4.0" + "source": "https://github.com/Codeception/module-webdriver/tree/1.4.1" }, - "time": "2021-09-02T12:01:02+00:00" + "time": "2022-09-12T05:09:51+00:00" }, { "name": "codeception/phpunit-wrapper", - "version": "9.0.6", + "version": "9.0.9", "source": { "type": "git", "url": "https://github.com/Codeception/phpunit-wrapper.git", - "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc" + "reference": "7439a53ae367986e9c22b2ac00f9d7376bb2f8cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/b0c06abb3181eedca690170f7ed0fd26a70bfacc", - "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc", + "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/7439a53ae367986e9c22b2ac00f9d7376bb2f8cf", + "reference": "7439a53ae367986e9c22b2ac00f9d7376bb2f8cf", "shasum": "" }, "require": { @@ -945,26 +947,30 @@ "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" + "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.9" }, - "time": "2020-12-28T13:59:47+00:00" + "time": "2022-05-23T06:24:11+00:00" }, { "name": "codeception/stub", - "version": "3.7.0", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "468dd5fe659f131fc997f5196aad87512f9b1304" + "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/468dd5fe659f131fc997f5196aad87512f9b1304", - "reference": "468dd5fe659f131fc997f5196aad87512f9b1304", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/18a148dacd293fc7b044042f5aa63a82b08bff5d", + "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d", "shasum": "" }, "require": { - "phpunit/phpunit": "^8.4 | ^9.0" + "php": "^7.4 | ^8.0", + "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | 10.0.x-dev" + }, + "require-dev": { + "consolidation/robo": "^3.0" }, "type": "library", "autoload": { @@ -979,22 +985,22 @@ "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" + "source": "https://github.com/Codeception/Stub/tree/4.0.2" }, - "time": "2020-07-03T15:54:43+00:00" + "time": "2022-01-31T19:25:15+00:00" }, { "name": "composer/ca-bundle", - "version": "1.3.4", + "version": "1.3.5", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "69098eca243998b53eed7a48d82dedd28b447cd5" + "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/69098eca243998b53eed7a48d82dedd28b447cd5", - "reference": "69098eca243998b53eed7a48d82dedd28b447cd5", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", "shasum": "" }, "require": { @@ -1041,7 +1047,80 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.4" + "source": "https://github.com/composer/ca-bundle/tree/1.3.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": "2023-01-11T08:27:00+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "shasum": "" + }, + "require": { + "composer/pcre": "^2 || ^3", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.6", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/filesystem": "^5.4 || ^6", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.0.0" }, "funding": [ { @@ -1057,43 +1136,52 @@ "type": "tidelift" } ], - "time": "2022-10-12T12:08:29+00:00" + "time": "2022-06-19T11:31:27+00:00" }, { "name": "composer/composer", - "version": "2.2.18", + "version": "2.5.2", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "84175907664ca8b73f73f4883e67e886dfefb9f5" + "reference": "c76c013c555160410af47c03a0e173518e3f5796" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/84175907664ca8b73f73f4883e67e886dfefb9f5", - "reference": "84175907664ca8b73f73f4883e67e886dfefb9f5", + "url": "https://api.github.com/repos/composer/composer/zipball/c76c013c555160410af47c03a0e173518e3f5796", + "reference": "c76c013c555160410af47c03a0e173518e3f5796", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", + "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^1.0", + "composer/pcre": "^2.1 || ^3.1", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^2.0 || ^3.0", + "composer/spdx-licenses": "^1.5.7", + "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0 || ^2.0", - "react/promise": "^1.2 || ^2.7", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "react/promise": "^2.8", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" + "seld/phar-utils": "^1.2", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.11 || ^6.0.11", + "symfony/filesystem": "^5.4 || ^6.0", + "symfony/finder": "^5.4 || ^6.0", + "symfony/polyfill-php73": "^1.24", + "symfony/polyfill-php80": "^1.24", + "symfony/polyfill-php81": "^1.24", + "symfony/process": "^5.4 || ^6.0" }, "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + "phpstan/phpstan": "^1.9.3", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1", + "phpstan/phpstan-symfony": "^1.2.10", + "symfony/phpunit-bridge": "^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -1106,7 +1194,12 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.2-dev" + "dev-main": "2.5-dev" + }, + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] } }, "autoload": { @@ -1140,7 +1233,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.2.18" + "source": "https://github.com/composer/composer/tree/2.5.2" }, "funding": [ { @@ -1156,7 +1249,7 @@ "type": "tidelift" } ], - "time": "2022-08-20T09:33:38+00:00" + "time": "2023-02-04T13:33:22+00:00" }, { "name": "composer/metadata-minifier", @@ -1229,30 +1322,30 @@ }, { "name": "composer/pcre", - "version": "1.0.1", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560" + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560", - "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560", + "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.3", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^4.2 || ^5" + "symfony/phpunit-bridge": "^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -1280,7 +1373,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/1.0.1" + "source": "https://github.com/composer/pcre/tree/3.1.0" }, "funding": [ { @@ -1296,7 +1389,7 @@ "type": "tidelift" } ], - "time": "2022-01-21T20:24:37+00:00" + "time": "2022-11-17T09:50:14+00:00" }, { "name": "composer/semver", @@ -1461,27 +1554,27 @@ }, { "name": "composer/xdebug-handler", - "version": "2.0.5", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a" + "reference": "ced299686f41dce890debac69273b47ffe98a40c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/9e36aeed4616366d2b690bdce11f71e9178c579a", - "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", "shasum": "" }, "require": { - "composer/pcre": "^1", - "php": "^5.3.2 || ^7.0 || ^8.0", + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", "psr/log": "^1 || ^2 || ^3" }, "require-dev": { "phpstan/phpstan": "^1.0", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + "symfony/phpunit-bridge": "^6.0" }, "type": "library", "autoload": { @@ -1507,7 +1600,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/2.0.5" + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" }, "funding": [ { @@ -1523,30 +1616,29 @@ "type": "tidelift" } ], - "time": "2022-02-24T20:20:32+00:00" + "time": "2022-02-25T21:32:43+00:00" }, { "name": "csharpru/vault-php", - "version": "4.2.1", + "version": "4.3.1", "source": { "type": "git", "url": "https://github.com/CSharpRU/vault-php.git", - "reference": "89b393ecf65f61a44d3a1872547f65085982b481" + "reference": "918bfffe85d3b290e1bf667b5f14e521fdc0063c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CSharpRU/vault-php/zipball/89b393ecf65f61a44d3a1872547f65085982b481", - "reference": "89b393ecf65f61a44d3a1872547f65085982b481", + "url": "https://api.github.com/repos/CSharpRU/vault-php/zipball/918bfffe85d3b290e1bf667b5f14e521fdc0063c", + "reference": "918bfffe85d3b290e1bf667b5f14e521fdc0063c", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.2 || ^8.0", - "psr/cache": "^1.0", + "psr/cache": "^1.0|^2.0|^3.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", - "psr/log": "^1.0", - "weew/helpers-array": "^1.3" + "psr/log": "^1.0|^2.0|^3.0" }, "require-dev": { "alextartan/guzzle-psr18-adapter": "^1.2 || ^2.0", @@ -1584,36 +1676,40 @@ ], "support": { "issues": "https://github.com/CSharpRU/vault-php/issues", - "source": "https://github.com/CSharpRU/vault-php/tree/4.2.1" + "source": "https://github.com/CSharpRU/vault-php/tree/4.3.1" }, - "time": "2021-05-21T06:39:35+00:00" + "time": "2022-04-04T08:31:44+00:00" }, { "name": "doctrine/annotations", - "version": "1.13.2", + "version": "1.14.3", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "5b668aef16090008790395c02c893b1ba13f7e08" + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", - "reference": "5b668aef16090008790395c02c893b1ba13f7e08", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", "shasum": "" }, "require": { - "doctrine/lexer": "1.*", + "doctrine/lexer": "^1 || ^2", "ext-tokenizer": "*", "php": "^7.1 || ^8.0", "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2" + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "vimeo/psalm": "^4.10" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" }, "type": "library", "autoload": { @@ -1656,35 +1752,79 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.2" + "source": "https://github.com/doctrine/annotations/tree/1.14.3" + }, + "time": "2023-02-01T09:20:38+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5|^8.5|^9.5", + "psr/log": "^1|^2|^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" }, - "time": "2021-08-05T19:00:23+00:00" + "time": "2022-05-02T15:47:09+00:00" }, { "name": "doctrine/instantiator", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^8.0", + "doctrine/coding-standard": "^9 || ^11", "ext-pdo": "*", "ext-phar": "*", - "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" + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.30 || ^5.4" }, "type": "library", "autoload": { @@ -1711,7 +1851,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" }, "funding": [ { @@ -1727,39 +1867,37 @@ "type": "tidelift" } ], - "time": "2020-11-10T18:47:58+00:00" + "time": "2022-12-30T00:15:36+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.1", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1791,7 +1929,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" + "source": "https://github.com/doctrine/lexer/tree/2.1.0" }, "funding": [ { @@ -1807,38 +1945,38 @@ "type": "tidelift" } ], - "time": "2020-05-25T17:44:05+00:00" + "time": "2022-12-14T08:49:07+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.4.0", + "version": "7.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94" + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/868b3571a039f0ebc11ac8f344f4080babe2cb94", - "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.8.3 || ^2.1", + "guzzlehttp/psr7": "^1.9 || ^2.4", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2" + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "provide": { "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -1848,8 +1986,12 @@ }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, "branch-alias": { - "dev-master": "7.4-dev" + "dev-master": "7.5-dev" } }, "autoload": { @@ -1915,7 +2057,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.0" + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" }, "funding": [ { @@ -1931,20 +2073,20 @@ "type": "tidelift" } ], - "time": "2021-10-18T09:52:00+00:00" + "time": "2022-08-28T15:39:27+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.0", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "136a635e2b4a49b9d79e9c8fee267ffb257fdba0" + "reference": "b94b2807d85443f9719887892882d0329d1e2598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/136a635e2b4a49b9d79e9c8fee267ffb257fdba0", - "reference": "136a635e2b4a49b9d79e9c8fee267ffb257fdba0", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", "shasum": "" }, "require": { @@ -1999,7 +2141,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.0" + "source": "https://github.com/guzzle/promises/tree/1.5.2" }, "funding": [ { @@ -2015,47 +2157,51 @@ "type": "tidelift" } ], - "time": "2021-10-07T13:05:22+00:00" + "time": "2022-08-28T14:55:35+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.8.3", + "version": "2.4.3", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85" + "reference": "67c26b443f348a51926030c83481b85718457d3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/1afdd860a2566ed3c2b0b4a3de6e23434a79ec85", - "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", + "reference": "67c26b443f348a51926030c83481b85718457d3d", "shasum": "" }, "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" }, "provide": { + "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "2.4-dev" } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Psr7\\": "src/" } @@ -2094,6 +2240,11 @@ "name": "Tobias Schultze", "email": "webmaster@tubo-world.de", "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", @@ -2109,7 +2260,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.3" + "source": "https://github.com/guzzle/psr7/tree/2.4.3" }, "funding": [ { @@ -2125,20 +2276,20 @@ "type": "tidelift" } ], - "time": "2021-10-05T13:56:00+00:00" + "time": "2022-10-26T14:07:24+00:00" }, { "name": "jms/metadata", - "version": "2.5.1", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/metadata.git", - "reference": "a995e6cef6d6f56a6226e1616a519630e2ef0aeb" + "reference": "283c714831d272d78ddd6e52e08ac16d76be30fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/a995e6cef6d6f56a6226e1616a519630e2ef0aeb", - "reference": "a995e6cef6d6f56a6226e1616a519630e2ef0aeb", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/283c714831d272d78ddd6e52e08ac16d76be30fd", + "reference": "283c714831d272d78ddd6e52e08ac16d76be30fd", "shasum": "" }, "require": { @@ -2187,29 +2338,29 @@ ], "support": { "issues": "https://github.com/schmittjoh/metadata/issues", - "source": "https://github.com/schmittjoh/metadata/tree/2.5.1" + "source": "https://github.com/schmittjoh/metadata/tree/2.7.0" }, - "time": "2021-08-04T19:32:08+00:00" + "time": "2022-09-13T19:18:27+00:00" }, { "name": "jms/serializer", - "version": "3.15.0", + "version": "3.22.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "9d6d9b81889904603383722ca0cd7f7999baeebc" + "reference": "576d226178697534e214531dbf80058637a10ebc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/9d6d9b81889904603383722ca0cd7f7999baeebc", - "reference": "9d6d9b81889904603383722ca0cd7f7999baeebc", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/576d226178697534e214531dbf80058637a10ebc", + "reference": "576d226178697534e214531dbf80058637a10ebc", "shasum": "" }, "require": { - "doctrine/annotations": "^1.10.4", + "doctrine/annotations": "^1.13 || ^2.0", "doctrine/instantiator": "^1.0.3", - "doctrine/lexer": "^1.1", - "jms/metadata": "^2.0", + "doctrine/lexer": "^1.1 || ^2", + "jms/metadata": "^2.6", "php": "^7.2||^8.0", "phpstan/phpdoc-parser": "^0.4 || ^0.5 || ^1.0" }, @@ -2221,14 +2372,16 @@ "ext-pdo_sqlite": "*", "jackalope/jackalope-doctrine-dbal": "^1.1.5", "ocramius/proxy-manager": "^1.0|^2.0", - "phpstan/phpstan": "^0.12.65", - "phpunit/phpunit": "^8.0||^9.0", + "phpbench/phpbench": "^1.0", + "phpstan/phpstan": "^1.0.2", + "phpunit/phpunit": "^8.5.21||^9.0", "psr/container": "^1.0", "symfony/dependency-injection": "^3.0|^4.0|^5.0|^6.0", - "symfony/expression-language": "^3.0|^4.0|^5.0|^6.0", + "symfony/expression-language": "^3.2|^4.0|^5.0|^6.0", "symfony/filesystem": "^3.0|^4.0|^5.0|^6.0", "symfony/form": "^3.0|^4.0|^5.0|^6.0", "symfony/translation": "^3.0|^4.0|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", "symfony/validator": "^3.1.9|^4.0|^5.0|^6.0", "symfony/yaml": "^3.3|^4.0|^5.0|^6.0", "twig/twig": "~1.34|~2.4|^3.0" @@ -2236,6 +2389,7 @@ "suggest": { "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", "symfony/cache": "Required if you like to use cache functionality.", + "symfony/uid": "Required if you'd like to serialize UID objects.", "symfony/yaml": "Required if you'd like to use the YAML metadata format." }, "type": "library", @@ -2263,7 +2417,7 @@ "email": "goetas@gmail.com" } ], - "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", + "description": "Library for (de-)serializing data of any complexity; supports XML, and JSON.", "homepage": "http://jmsyst.com/libs/serializer", "keywords": [ "deserialization", @@ -2274,7 +2428,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/3.15.0" + "source": "https://github.com/schmittjoh/serializer/tree/3.22.0" }, "funding": [ { @@ -2282,7 +2436,7 @@ "type": "github" } ], - "time": "2021-10-14T20:02:48+00:00" + "time": "2023-02-03T04:58:11+00:00" }, { "name": "justinrainbow/json-schema", @@ -2356,16 +2510,16 @@ }, { "name": "laminas/laminas-diactoros", - "version": "2.22.0", + "version": "2.24.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "df8c7f9e11d854269f4aa7c06ffa38caa42e4405" + "reference": "6028af6c3b5ced4d063a680d2483cce67578b902" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/df8c7f9e11d854269f4aa7c06ffa38caa42e4405", - "reference": "df8c7f9e11d854269f4aa7c06ffa38caa42e4405", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/6028af6c3b5ced4d063a680d2483cce67578b902", + "reference": "6028af6c3b5ced4d063a680d2483cce67578b902", "shasum": "" }, "require": { @@ -2387,10 +2541,10 @@ "ext-libxml": "*", "http-interop/http-factory-tests": "^0.9.0", "laminas/laminas-coding-standard": "^2.4.0", - "php-http/psr7-integration-tests": "^1.1.1", - "phpunit/phpunit": "^9.5.26", - "psalm/plugin-phpunit": "^0.18.0", - "vimeo/psalm": "^4.29.0" + "php-http/psr7-integration-tests": "^1.2", + "phpunit/phpunit": "^9.5.27", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.4" }, "type": "library", "extra": { @@ -2449,20 +2603,20 @@ "type": "community_bridge" } ], - "time": "2022-11-22T05:54:54+00:00" + "time": "2022-12-20T12:22:40+00:00" }, { "name": "monolog/monolog", - "version": "2.3.5", + "version": "2.9.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" + "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", - "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f259e2b15fb95494c83f52d3caad003bbf5ffaa1", + "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1", "shasum": "" }, "require": { @@ -2475,18 +2629,22 @@ "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7", - "graylog2/gelf-php": "^1.4.2", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.6.1", + "phpspec/prophecy": "^1.15", "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90@dev", - "swiftmailer/swiftmailer": "^5.3|^6.0" + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", @@ -2501,7 +2659,6 @@ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", "rollbar/rollbar": "Allow sending log messages to Rollbar", "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, @@ -2536,7 +2693,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.3.5" + "source": "https://github.com/Seldaek/monolog/tree/2.9.1" }, "funding": [ { @@ -2548,7 +2705,7 @@ "type": "tidelift" } ], - "time": "2021-10-01T21:08:31+00:00" + "time": "2023-02-06T13:44:46+00:00" }, { "name": "mtdowling/jmespath.php", @@ -2613,16 +2770,16 @@ }, { "name": "mustache/mustache", - "version": "v2.13.0", + "version": "v2.14.2", "source": { "type": "git", "url": "https://github.com/bobthecow/mustache.php.git", - "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4" + "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e95c5a008c23d3151d59ea72484d4f72049ab7f4", - "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4", + "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e62b7c3849d22ec55f3ec425507bf7968193a6cb", + "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb", "shasum": "" }, "require": { @@ -2657,31 +2814,35 @@ ], "support": { "issues": "https://github.com/bobthecow/mustache.php/issues", - "source": "https://github.com/bobthecow/mustache.php/tree/master" + "source": "https://github.com/bobthecow/mustache.php/tree/v2.14.2" }, - "time": "2019-11-23T21:40:31+00:00" + "time": "2022-08-23T13:07:01+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.10.2", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", "autoload": { @@ -2706,7 +2867,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" }, "funding": [ { @@ -2714,20 +2875,20 @@ "type": "tidelift" } ], - "time": "2020-11-13T09:40:50+00:00" + "time": "2022-03-03T13:19:32+00:00" }, { "name": "nikic/php-parser", - "version": "v4.13.0", + "version": "v4.15.3", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "50953a2691a922aa1769461637869a0a2faa3f53" + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53", - "reference": "50953a2691a922aa1769461637869a0a2faa3f53", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", "shasum": "" }, "require": { @@ -2768,22 +2929,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" }, - "time": "2021-09-20T12:20:58+00:00" + "time": "2023-01-16T22:05:37+00:00" }, { "name": "paragonie/constant_time_encoding", - "version": "v2.4.0", + "version": "v2.6.3", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c" + "reference": "58c3f47f650c94ec05a151692652a868995d2938" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c", - "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", "shasum": "" }, "require": { @@ -2837,7 +2998,7 @@ "issues": "https://github.com/paragonie/constant_time_encoding/issues", "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2020-12-06T15:14:20+00:00" + "time": "2022-06-14T06:56:20+00:00" }, { "name": "phar-io/manifest", @@ -2901,16 +3062,16 @@ }, { "name": "phar-io/version", - "version": "3.1.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "bae7c545bef187884426f042434e561ab1ddb182" + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", - "reference": "bae7c545bef187884426f042434e561ab1ddb182", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { @@ -2946,22 +3107,22 @@ "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/3.1.0" + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2021-02-23T14:00:09+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { "name": "php-webdriver/webdriver", - "version": "1.12.0", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "99d4856ed7dffcdf6a52eccd6551e83d8d557ceb" + "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/99d4856ed7dffcdf6a52eccd6551e83d8d557ceb", - "reference": "99d4856ed7dffcdf6a52eccd6551e83d8d557ceb", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/6dfe5f814b796c1b5748850aa19f781b9274c36c", + "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c", "shasum": "" }, "require": { @@ -3011,267 +3172,37 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.12.0" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.13.1" }, - "time": "2021-10-14T09:30:02+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "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" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.2.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "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.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" - }, - "time": "2020-09-03T19:13:55+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "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.5.1" - }, - "time": "2021-10-02T14:08:47+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.16.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "be8cac52a0827776ff9ccda8c381ac5b71aeb359" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be8cac52a0827776ff9ccda8c381ac5b71aeb359", - "reference": "be8cac52a0827776ff9ccda8c381ac5b71aeb359", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || 8.0.* || 8.1.* || 8.2.*", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.16.0" - }, - "time": "2022-11-29T15:06:56+00:00" + "time": "2022-10-11T11:49:44+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.2.0", + "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e" + "reference": "57090cfccbfaa639e703c007486d605a6e80f56d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/dbc093d7af60eff5cd575d2ed761b15ed40bd08e", - "reference": "dbc093d7af60eff5cd575d2ed761b15ed40bd08e", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/57090cfccbfaa639e703c007486d605a6e80f56d", + "reference": "57090cfccbfaa639e703c007486d605a6e80f56d", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.2 || ^8.0" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^9.5", "symfony/process": "^5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, "autoload": { "psr-4": { "PHPStan\\PhpDocParser\\": [ @@ -3286,29 +3217,29 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.2.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.16.0" }, - "time": "2021-09-16T20:46:02+00:00" + "time": "2023-01-29T14:41:23+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.7", + "version": "9.2.24", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218" + "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d4c798ed8d51506800b441f7a13ecb0f76f12218", - "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2cf940ebc6355a9d430462811b5aaa308b174bed", + "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.12.0", + "nikic/php-parser": "^4.14", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -3357,7 +3288,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.7" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.24" }, "funding": [ { @@ -3365,20 +3296,20 @@ "type": "github" } ], - "time": "2021-09-17T05:39:03+00:00" + "time": "2023-01-26T08:26:55+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.5", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { @@ -3417,7 +3348,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -3425,7 +3356,7 @@ "type": "github" } ], - "time": "2020-09-28T05:57:25+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { "name": "phpunit/php-invoker", @@ -3610,20 +3541,20 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.10", + "version": "9.6.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" + "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7b1615e3e887d6c719121c6d4a44b0ab9645555", + "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", + "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -3634,28 +3565,23 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.7", + "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", + "sebastian/comparator": "^4.0.8", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", + "sebastian/exporter": "^4.0.5", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^2.3.4", + "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { "ext-soap": "*", "ext-xdebug": "*" @@ -3666,7 +3592,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { @@ -3697,46 +3623,99 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.3" }, "funding": [ { - "url": "https://phpunit.de/donate.html", + "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2021-09-25T07:38:51+00:00" + "time": "2023-02-04T13:37:15+00:00" }, { "name": "psr/cache", - "version": "1.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3746,41 +3725,50 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], - "description": "Common interface for caching libraries", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "cache", - "psr", - "psr-6" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "psr/container", - "version": "1.1.2", + "name": "psr/event-dispatcher", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": ">=7.2.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Psr\\EventDispatcher\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3790,23 +3778,20 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "homepage": "http://www.php-fig.org/" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Standard interfaces for event handling.", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "events", + "psr", + "psr-14" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2019-01-08T18:20:26+00:00" }, { "name": "psr/http-client", @@ -3970,30 +3955,30 @@ }, { "name": "psr/log", - "version": "1.1.4", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -4014,9 +3999,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/2.0.0" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2021-07-14T16:41:46+00:00" }, { "name": "ralouphie/getallheaders", @@ -4064,42 +4049,52 @@ }, { "name": "ramsey/collection", - "version": "1.2.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", "shasum": "" }, "require": { - "php": "^7.3 || ^8", - "symfony/polyfill-php81": "^1.23" + "php": "^8.1" }, "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", + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", "phpspec/prophecy-phpunit": "^2.0", - "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" + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" }, "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, "autoload": { "psr-4": { "Ramsey\\Collection\\": "src/" @@ -4127,7 +4122,7 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.2.2" + "source": "https://github.com/ramsey/collection/tree/2.0.0" }, "funding": [ { @@ -4139,29 +4134,27 @@ "type": "tidelift" } ], - "time": "2021-10-10T03:01:02+00:00" + "time": "2022-12-31T21:50:55+00:00" }, { "name": "ramsey/uuid", - "version": "4.2.3", + "version": "4.7.3", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" + "reference": "433b2014e3979047db08a17a205f410ba3869cf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", - "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/433b2014e3979047db08a17a205f410ba3869cf2", + "reference": "433b2014e3979047db08a17a205f410ba3869cf2", "shasum": "" }, "require": { - "brick/math": "^0.8 || ^0.9", + "brick/math": "^0.8.8 || ^0.9 || ^0.10", "ext-json": "*", - "php": "^7.2 || ^8.0", - "ramsey/collection": "^1.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php80": "^1.14" + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" }, "replace": { "rhumsaa/uuid": "self.version" @@ -4173,24 +4166,23 @@ "doctrine/annotations": "^1.8", "ergebnis/composer-normalize": "^2.15", "mockery/mockery": "^1.3", - "moontoast/math": "^1.1", "paragonie/random-lib": "^2", "php-mock/php-mock": "^2.2", "php-mock/php-mock-mockery": "^1.3", "php-parallel-lint/php-parallel-lint": "^1.1", "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-mockery": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", "phpunit/phpunit": "^8.5 || ^9", - "slevomat/coding-standard": "^7.0", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", "squizlabs/php_codesniffer": "^3.5", "vimeo/psalm": "^4.9" }, "suggest": { "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", @@ -4198,9 +4190,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "4.x-dev" - }, "captainhook": { "force-install": true } @@ -4225,7 +4214,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.2.3" + "source": "https://github.com/ramsey/uuid/tree/4.7.3" }, "funding": [ { @@ -4237,7 +4226,7 @@ "type": "tidelift" } ], - "time": "2021-09-25T23:10:38+00:00" + "time": "2023-01-12T18:13:24+00:00" }, { "name": "react/promise", @@ -4484,16 +4473,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -4546,7 +4535,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -4554,7 +4543,7 @@ "type": "github" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", @@ -4681,16 +4670,16 @@ }, { "name": "sebastian/environment", - "version": "5.1.3", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { @@ -4732,7 +4721,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -4740,20 +4729,20 @@ "type": "github" } ], - "time": "2020-09-28T05:52:38+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.3", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { @@ -4802,14 +4791,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { @@ -4817,20 +4806,20 @@ "type": "github" } ], - "time": "2020-09-28T05:24:23+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.3", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", "shasum": "" }, "require": { @@ -4873,7 +4862,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" }, "funding": [ { @@ -4881,7 +4870,7 @@ "type": "github" } ], - "time": "2021-06-11T13:31:12+00:00" + "time": "2022-02-14T08:28:10+00:00" }, { "name": "sebastian/lines-of-code", @@ -5054,16 +5043,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { @@ -5102,10 +5091,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://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" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { @@ -5113,7 +5102,7 @@ "type": "github" } ], - "time": "2020-10-26T13:17:30+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { "name": "sebastian/resource-operations", @@ -5172,28 +5161,28 @@ }, { "name": "sebastian/type", - "version": "2.3.4", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -5216,7 +5205,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -5224,7 +5213,7 @@ "type": "github" } ], - "time": "2021-06-15T12:49:02+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", @@ -5391,18 +5380,79 @@ }, "time": "2022-08-31T10:31:18+00:00" }, + { + "name": "seld/signal-handler", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], + "support": { + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" + }, + "time": "2022-07-20T18:31:45+00:00" + }, { "name": "spomky-labs/otphp", - "version": "v10.0.1", + "version": "v10.0.3", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "f44cce5a9db4b8da410215d992110482c931232f" + "reference": "9784d9f7c790eed26e102d6c78f12c754036c366" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/f44cce5a9db4b8da410215d992110482c931232f", - "reference": "f44cce5a9db4b8da410215d992110482c931232f", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9784d9f7c790eed26e102d6c78f12c754036c366", + "reference": "9784d9f7c790eed26e102d6c78f12c754036c366", "shasum": "" }, "require": { @@ -5410,7 +5460,7 @@ "ext-mbstring": "*", "paragonie/constant_time_encoding": "^2.0", "php": "^7.2|^8.0", - "thecodingmachine/safe": "^0.1.14|^1.0" + "thecodingmachine/safe": "^0.1.14|^1.0|^2.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.0", @@ -5420,7 +5470,7 @@ "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^8.0", - "thecodingmachine/phpstan-safe-rule": "^1.0" + "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -5462,22 +5512,22 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.1" + "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.3" }, - "time": "2020-01-28T09:24:19+00:00" + "time": "2022-03-17T08:00:35+00:00" }, { "name": "symfony/console", - "version": "v5.4.16", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "8e9b9c8dfb33af6057c94e1b44846bee700dc5ef" + "reference": "dccb8d251a9017d5994c988b034d3e18aaabf740" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8e9b9c8dfb33af6057c94e1b44846bee700dc5ef", - "reference": "8e9b9c8dfb33af6057c94e1b44846bee700dc5ef", + "url": "https://api.github.com/repos/symfony/console/zipball/dccb8d251a9017d5994c988b034d3e18aaabf740", + "reference": "dccb8d251a9017d5994c988b034d3e18aaabf740", "shasum": "" }, "require": { @@ -5547,7 +5597,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.16" + "source": "https://github.com/symfony/console/tree/v5.4.19" }, "funding": [ { @@ -5563,20 +5613,20 @@ "type": "tidelift" } ], - "time": "2022-11-25T14:09:27+00:00" + "time": "2023-01-01T08:32:19+00:00" }, { "name": "symfony/css-selector", - "version": "v5.3.4", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "7fb120adc7f600a59027775b224c13a33530dd90" + "reference": "f4a7d150f5b9e8f974f6f127d8167e420d11fc62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", - "reference": "7fb120adc7f600a59027775b224c13a33530dd90", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/f4a7d150f5b9e8f974f6f127d8167e420d11fc62", + "reference": "f4a7d150f5b9e8f974f6f127d8167e420d11fc62", "shasum": "" }, "require": { @@ -5613,7 +5663,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.3.4" + "source": "https://github.com/symfony/css-selector/tree/v5.4.19" }, "funding": [ { @@ -5629,29 +5679,29 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:38:00+00:00" + "time": "2023-01-01T08:32:19+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3", + "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -5680,7 +5730,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0" }, "funding": [ { @@ -5696,28 +5746,29 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/dotenv", - "version": "v5.3.8", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "12888c9c46ac750ec5c1381db5bf3d534e7d70cb" + "reference": "38190ba62566afa26ca723a795d0a004e061bd2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/12888c9c46ac750ec5c1381db5bf3d534e7d70cb", - "reference": "12888c9c46ac750ec5c1381db5bf3d534e7d70cb", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/38190ba62566afa26ca723a795d0a004e061bd2a", + "reference": "38190ba62566afa26ca723a795d0a004e061bd2a", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1" + "symfony/deprecation-contracts": "^2.1|^3" }, "require-dev": { - "symfony/process": "^4.4|^5.0" + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" }, "type": "library", "autoload": { @@ -5750,7 +5801,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.3.8" + "source": "https://github.com/symfony/dotenv/tree/v5.4.19" }, "funding": [ { @@ -5766,43 +5817,44 @@ "type": "tidelift" } ], - "time": "2021-07-29T06:18:06+00:00" + "time": "2023-01-01T08:32:19+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.30", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "2fe81680070043c4c80e7cedceb797e34f377bac" + "reference": "abf49cc084c087d94b4cb939c3f3672971784e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2fe81680070043c4c80e7cedceb797e34f377bac", - "reference": "2fe81680070043c4c80e7cedceb797e34f377bac", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abf49cc084c087d94b4cb939c3f3672971784e0c", + "reference": "abf49cc084c087d94b4cb939c3f3672971784e0c", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/dependency-injection": "<3.4" + "symfony/dependency-injection": "<4.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" + "symfony/event-dispatcher-implementation": "2.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "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", - "symfony/stopwatch": "^3.4|^4.0|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/dependency-injection": "", @@ -5834,7 +5886,7 @@ "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.30" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.19" }, "funding": [ { @@ -5850,33 +5902,33 @@ "type": "tidelift" } ], - "time": "2021-08-04T20:31:23+00:00" + "time": "2023-01-01T08:32:19+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.9", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" + "reference": "0782b0b52a737a05b4383d0df35a474303cabdae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae", + "reference": "0782b0b52a737a05b4383d0df35a474303cabdae", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": ">=8.1", + "psr/event-dispatcher": "^1" }, "suggest": { - "psr/event-dispatcher": "", "symfony/event-dispatcher-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -5913,7 +5965,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.9" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.0" }, "funding": [ { @@ -5929,20 +5981,20 @@ "type": "tidelift" } ], - "time": "2020-07-06T13:19:58+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.13", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "ac09569844a9109a5966b9438fc29113ce77cf51" + "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/ac09569844a9109a5966b9438fc29113ce77cf51", - "reference": "ac09569844a9109a5966b9438fc29113ce77cf51", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/648bfaca6a494f3e22378123bcee2894045dc9d8", + "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8", "shasum": "" }, "require": { @@ -5977,7 +6029,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.13" + "source": "https://github.com/symfony/filesystem/tree/v5.4.19" }, "funding": [ { @@ -5993,20 +6045,20 @@ "type": "tidelift" } ], - "time": "2022-09-21T19:53:16+00:00" + "time": "2023-01-14T19:14:44+00:00" }, { "name": "symfony/finder", - "version": "v5.4.11", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + "reference": "6071aebf810ad13fe8200c224f36103abb37cf1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "url": "https://api.github.com/repos/symfony/finder/zipball/6071aebf810ad13fe8200c224f36103abb37cf1f", + "reference": "6071aebf810ad13fe8200c224f36103abb37cf1f", "shasum": "" }, "require": { @@ -6040,7 +6092,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.11" + "source": "https://github.com/symfony/finder/tree/v5.4.19" }, "funding": [ { @@ -6056,33 +6108,36 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2023-01-14T19:14:44+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.3.7", + "version": "v5.4.20", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5" + "reference": "d0435363362a47c14e9cf50663cb8ffbf491875a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", - "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0435363362a47c14e9cf50663cb8ffbf491875a", + "reference": "d0435363362a47c14e9cf50663cb8ffbf491875a", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php80": "^1.16" }, "require-dev": { "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0" + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" }, "suggest": { "symfony/mime": "To use the file extension guesser" @@ -6113,7 +6168,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.3.7" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.20" }, "funding": [ { @@ -6129,25 +6184,25 @@ "type": "tidelift" } ], - "time": "2021-08-27T11:20:35+00:00" + "time": "2023-01-29T11:11:52+00:00" }, { "name": "symfony/mime", - "version": "v5.3.8", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "a756033d0a7e53db389618653ae991eba5a19a11" + "reference": "a858429a9c704edc53fe057228cf9ca282ba48eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/a756033d0a7e53db389618653ae991eba5a19a11", - "reference": "a756033d0a7e53db389618653ae991eba5a19a11", + "url": "https://api.github.com/repos/symfony/mime/zipball/a858429a9c704edc53fe057228cf9ca282ba48eb", + "reference": "a858429a9c704edc53fe057228cf9ca282ba48eb", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16" @@ -6156,15 +6211,16 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.14|>=6.0,<6.0.14|>=6.1,<6.1.6" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", + "egulias/email-validator": "^2.1.10|^3.1|^4", "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" + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.4.14|~6.0.14|^6.1.6" }, "type": "library", "autoload": { @@ -6196,7 +6252,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.3.8" + "source": "https://github.com/symfony/mime/tree/v5.4.19" }, "funding": [ { @@ -6212,7 +6268,7 @@ "type": "tidelift" } ], - "time": "2021-09-10T12:30:38+00:00" + "time": "2023-01-09T05:43:46+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6379,16 +6435,16 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.23.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + "reference": "639084e360537a19f9ee352433b84ce831f3d2da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", - "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da", "shasum": "" }, "require": { @@ -6402,7 +6458,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6446,7 +6502,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" }, "funding": [ { @@ -6462,7 +6518,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", @@ -6633,16 +6689,16 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.23.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", "shasum": "" }, "require": { @@ -6651,7 +6707,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6689,7 +6745,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" }, "funding": [ { @@ -6705,7 +6761,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php73", @@ -6871,16 +6927,16 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.23.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "e66119f3de95efc359483f810c4c3e6436279436" + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", - "reference": "e66119f3de95efc359483f810c4c3e6436279436", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", "shasum": "" }, "require": { @@ -6889,7 +6945,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6930,7 +6986,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" }, "funding": [ { @@ -6946,20 +7002,20 @@ "type": "tidelift" } ], - "time": "2021-05-21T13:25:03+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/process", - "version": "v5.4.11", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" + "reference": "c5ba874c9b636dbccf761e22ce750e88ec3f55e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", + "url": "https://api.github.com/repos/symfony/process/zipball/c5ba874c9b636dbccf761e22ce750e88ec3f55e1", + "reference": "c5ba874c9b636dbccf761e22ce750e88ec3f55e1", "shasum": "" }, "require": { @@ -6992,7 +7048,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.11" + "source": "https://github.com/symfony/process/tree/v5.4.19" }, "funding": [ { @@ -7008,26 +7064,25 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2023-01-01T08:32:19+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75", + "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.1", + "psr/container": "^2.0" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -7038,7 +7093,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -7048,7 +7103,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7075,7 +7133,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.2.0" }, "funding": [ { @@ -7091,20 +7149,20 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/string", - "version": "v5.4.15", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed" + "reference": "0a01071610fd861cc160dfb7e2682ceec66064cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", - "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", + "url": "https://api.github.com/repos/symfony/string/zipball/0a01071610fd861cc160dfb7e2682ceec66064cb", + "reference": "0a01071610fd861cc160dfb7e2682ceec66064cb", "shasum": "" }, "require": { @@ -7161,7 +7219,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.15" + "source": "https://github.com/symfony/string/tree/v5.4.19" }, "funding": [ { @@ -7177,32 +7235,32 @@ "type": "tidelift" } ], - "time": "2022-10-05T15:16:54+00:00" + "time": "2023-01-01T08:32:19+00:00" }, { "name": "symfony/yaml", - "version": "v5.3.6", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7" + "reference": "71c05db20cb9b54d381a28255f17580e2b7e36a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", - "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", + "url": "https://api.github.com/repos/symfony/yaml/zipball/71c05db20cb9b54d381a28255f17580e2b7e36a5", + "reference": "71c05db20cb9b54d381a28255f17580e2b7e36a5", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8" + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<4.4" + "symfony/console": "<5.3" }, "require-dev": { - "symfony/console": "^4.4|^5.0" + "symfony/console": "^5.3|^6.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -7236,7 +7294,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.3.6" + "source": "https://github.com/symfony/yaml/tree/v5.4.19" }, "funding": [ { @@ -7252,43 +7310,50 @@ "type": "tidelift" } ], - "time": "2021-07-29T06:20:01+00:00" + "time": "2023-01-10T18:51:14+00:00" }, { "name": "thecodingmachine/safe", - "version": "v1.3.3", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/thecodingmachine/safe.git", - "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc" + "reference": "e788f3d09dcd36f806350aedb77eac348fafadd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/a8ab0876305a4cdaef31b2350fcb9811b5608dbc", - "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/e788f3d09dcd36f806350aedb77eac348fafadd3", + "reference": "e788f3d09dcd36f806350aedb77eac348fafadd3", "shasum": "" }, "require": { - "php": ">=7.2" + "php": "^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12", + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^9.5", "squizlabs/php_codesniffer": "^3.2", - "thecodingmachine/phpstan-strict-rules": "^0.12" + "thecodingmachine/phpstan-strict-rules": "^1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "0.1-dev" + "dev-master": "2.2.x-dev" } }, "autoload": { "files": [ "deprecated/apc.php", + "deprecated/array.php", + "deprecated/datetime.php", "deprecated/libevent.php", + "deprecated/misc.php", + "deprecated/password.php", "deprecated/mssql.php", "deprecated/stats.php", + "deprecated/strings.php", "lib/special_cases.php", + "deprecated/mysqli.php", "generated/apache.php", "generated/apcu.php", "generated/array.php", @@ -7309,6 +7374,7 @@ "generated/fpm.php", "generated/ftp.php", "generated/funchand.php", + "generated/gettext.php", "generated/gmp.php", "generated/gnupg.php", "generated/hash.php", @@ -7318,7 +7384,6 @@ "generated/image.php", "generated/imap.php", "generated/info.php", - "generated/ingres-ii.php", "generated/inotify.php", "generated/json.php", "generated/ldap.php", @@ -7327,20 +7392,14 @@ "generated/mailparse.php", "generated/mbstring.php", "generated/misc.php", - "generated/msql.php", "generated/mysql.php", - "generated/mysqli.php", - "generated/mysqlndMs.php", - "generated/mysqlndQc.php", "generated/network.php", "generated/oci8.php", "generated/opcache.php", "generated/openssl.php", "generated/outcontrol.php", - "generated/password.php", "generated/pcntl.php", "generated/pcre.php", - "generated/pdf.php", "generated/pgsql.php", "generated/posix.php", "generated/ps.php", @@ -7351,7 +7410,6 @@ "generated/sem.php", "generated/session.php", "generated/shmop.php", - "generated/simplexml.php", "generated/sockets.php", "generated/sodium.php", "generated/solr.php", @@ -7374,13 +7432,13 @@ "generated/zip.php", "generated/zlib.php" ], - "psr-4": { - "Safe\\": [ - "lib/", - "deprecated/", - "generated/" - ] - } + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "deprecated/Exceptions/", + "generated/Exceptions/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7389,9 +7447,9 @@ "description": "PHP core functions that throw exceptions instead of returning FALSE on error", "support": { "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v1.3.3" + "source": "https://github.com/thecodingmachine/safe/tree/v2.4.0" }, - "time": "2020-10-28T17:51:34+00:00" + "time": "2022-10-07T14:02:17+00:00" }, { "name": "theseer/tokenizer", @@ -7443,64 +7501,6 @@ ], "time": "2021-07-28T10:34:58+00:00" }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" - }, { "name": "weew/helpers-array", "version": "v1.3.1", @@ -7670,16 +7670,16 @@ }, { "name": "gitonomy/gitlib", - "version": "v1.3.2", + "version": "v1.3.7", "source": { "type": "git", "url": "https://github.com/gitonomy/gitlib.git", - "reference": "e73e439590b194b0b250b516b22a68c7116e2f21" + "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/e73e439590b194b0b250b516b22a68c7116e2f21", - "reference": "e73e439590b194b0b250b516b22a68c7116e2f21", + "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/00b57b79f02396aa4c7c163f76fe2bc48faebbb7", + "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7", "shasum": "" }, "require": { @@ -7690,6 +7690,7 @@ }, "require-dev": { "ext-fileinfo": "*", + "phpspec/prophecy": "^1.10.2", "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.20 || ^9.5.9", "psr/log": "^1.0" }, @@ -7710,25 +7711,29 @@ "authors": [ { "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk" + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { "name": "Julien Didier", - "email": "genzo.wm@gmail.com" + "email": "genzo.wm@gmail.com", + "homepage": "https://github.com/juliendidier" }, { "name": "Grégoire Pineau", - "email": "lyrixx@lyrixx.info" + "email": "lyrixx@lyrixx.info", + "homepage": "https://github.com/lyrixx" }, { "name": "Alexandre Salomé", - "email": "alexandre.salome@gmail.com" + "email": "alexandre.salome@gmail.com", + "homepage": "https://github.com/alexandresalome" } ], "description": "Library for accessing git", "support": { "issues": "https://github.com/gitonomy/gitlib/issues", - "source": "https://github.com/gitonomy/gitlib/tree/v1.3.2" + "source": "https://github.com/gitonomy/gitlib/tree/v1.3.7" }, "funding": [ { @@ -7736,27 +7741,27 @@ "type": "tidelift" } ], - "time": "2021-09-06T20:30:10+00:00" + "time": "2022-10-04T14:20:15+00:00" }, { "name": "pdepend/pdepend", - "version": "2.10.1", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "30452fdabb3dfca89f4bf977abc44adc5391e062" + "reference": "7a892d56ceafd804b4a2ecc85184640937ce9e84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/30452fdabb3dfca89f4bf977abc44adc5391e062", - "reference": "30452fdabb3dfca89f4bf977abc44adc5391e062", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/7a892d56ceafd804b4a2ecc85184640937ce9e84", + "reference": "7a892d56ceafd804b4a2ecc85184640937ce9e84", "shasum": "" }, "require": { "php": ">=5.3.7", - "symfony/config": "^2.3.0|^3|^4|^5", - "symfony/dependency-injection": "^2.3.0|^3|^4|^5", - "symfony/filesystem": "^2.3.0|^3|^4|^5" + "symfony/config": "^2.3.0|^3|^4|^5|^6.0", + "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0", + "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0" }, "require-dev": { "easy-doc/easy-doc": "0.0.0|^1.2.3", @@ -7785,7 +7790,7 @@ "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/2.10.1" + "source": "https://github.com/pdepend/pdepend/tree/2.12.1" }, "funding": [ { @@ -7793,20 +7798,20 @@ "type": "tidelift" } ], - "time": "2021-10-11T12:15:18+00:00" + "time": "2022-09-08T19:30:37+00:00" }, { "name": "php-coveralls/php-coveralls", - "version": "v2.4.3", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "909381bd40a17ae6e9076051f0d73293c1c091af" + "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/909381bd40a17ae6e9076051f0d73293c1c091af", - "reference": "909381bd40a17ae6e9076051f0d73293c1c091af", + "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9d8243bbf0e053333692857c98fab7cfba0d60a9", + "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9", "shasum": "" }, "require": { @@ -7814,14 +7819,14 @@ "ext-simplexml": "*", "guzzlehttp/guzzle": "^6.0 || ^7.0", "php": "^5.5 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0", - "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0", - "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0", - "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0" + "psr/log": "^1.0 || ^2.0", + "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", + "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", + "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0", + "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || ^8.0 || ^9.0", + "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || >=8.0 <8.5.29 || >=9.0 <9.5.23", "sanmai/phpunit-legacy-adapter": "^6.1 || ^8.0" }, "suggest": { @@ -7874,28 +7879,28 @@ ], "support": { "issues": "https://github.com/php-coveralls/php-coveralls/issues", - "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.4.3" + "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.5.3" }, - "time": "2020-12-24T09:17:03+00:00" + "time": "2022-09-12T20:47:09+00:00" }, { "name": "phpmd/phpmd", - "version": "2.10.2", + "version": "2.13.0", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "1bc74db7cf834662d83abebae265be11bb2eec3a" + "reference": "dad0228156856b3ad959992f9748514fa943f3e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/1bc74db7cf834662d83abebae265be11bb2eec3a", - "reference": "1bc74db7cf834662d83abebae265be11bb2eec3a", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/dad0228156856b3ad959992f9748514fa943f3e3", + "reference": "dad0228156856b3ad959992f9748514fa943f3e3", "shasum": "" }, "require": { - "composer/xdebug-handler": "^1.0 || ^2.0", + "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", "ext-xml": "*", - "pdepend/pdepend": "^2.10.0", + "pdepend/pdepend": "^2.12.1", "php": ">=5.3.9" }, "require-dev": { @@ -7951,7 +7956,7 @@ "support": { "irc": "irc://irc.freenode.org/phpmd", "issues": "https://github.com/phpmd/phpmd/issues", - "source": "https://github.com/phpmd/phpmd/tree/2.10.2" + "source": "https://github.com/phpmd/phpmd/tree/2.13.0" }, "funding": [ { @@ -7959,7 +7964,7 @@ "type": "tidelift" } ], - "time": "2021-07-22T09:56:23+00:00" + "time": "2022-09-10T08:44:15+00:00" }, { "name": "sebastian/phpcpd", @@ -8024,16 +8029,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.6.1", + "version": "3.6.2", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e" + "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/f268ca40d54617c6e06757f83f699775c9b3ff2e", - "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", + "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", "shasum": "" }, "require": { @@ -8076,39 +8081,37 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2021-10-11T04:00:11+00:00" + "time": "2021-12-12T21:44:58+00:00" }, { "name": "symfony/config", - "version": "v5.3.4", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "4268f3059c904c61636275182707f81645517a37" + "reference": "f31b3c78a3650157188a240695e688d6a182aa91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/4268f3059c904c61636275182707f81645517a37", - "reference": "4268f3059c904c61636275182707f81645517a37", + "url": "https://api.github.com/repos/symfony/config/zipball/f31b3c78a3650157188a240695e688d6a182aa91", + "reference": "f31b3c78a3650157188a240695e688d6a182aa91", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/filesystem": "^4.4|^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/filesystem": "^5.4|^6.0", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<4.4" + "symfony/finder": "<5.4" }, "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^4.4|^5.0" + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/yaml": "^5.4|^6.0" }, "suggest": { "symfony/yaml": "To use the yaml reference dumper" @@ -8139,7 +8142,7 @@ "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/v5.3.4" + "source": "https://github.com/symfony/config/tree/v6.2.5" }, "funding": [ { @@ -8155,50 +8158,49 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2023-01-09T04:38:22+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.3.8", + "version": "v6.2.6", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "e39c344e06a3ceab531ebeb6c077e6652c4a0829" + "reference": "2a6dd148589b9db59717db8b75f8d9fbb2ae714f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e39c344e06a3ceab531ebeb6c077e6652c4a0829", - "reference": "e39c344e06a3ceab531ebeb6c077e6652c4a0829", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2a6dd148589b9db59717db8b75f8d9fbb2ae714f", + "reference": "2a6dd148589b9db59717db8b75f8d9fbb2ae714f", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1.1", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1.6|^2" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/service-contracts": "^1.1.6|^2.0|^3.0", + "symfony/var-exporter": "^6.2" }, "conflict": { "ext-psr": "<1.1|>=2", - "symfony/config": "<5.3", - "symfony/finder": "<4.4", - "symfony/proxy-manager-bridge": "<4.4", - "symfony/yaml": "<4.4" + "symfony/config": "<6.1", + "symfony/finder": "<5.4", + "symfony/proxy-manager-bridge": "<6.2", + "symfony/yaml": "<5.4" }, "provide": { - "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0|2.0" + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/config": "^5.3", - "symfony/expression-language": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" + "symfony/config": "^6.1", + "symfony/expression-language": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "suggest": { "symfony/config": "", "symfony/expression-language": "For using expressions in service container configuration", "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", "symfony/yaml": "" }, "type": "library", @@ -8227,7 +8229,7 @@ "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/v5.3.8" + "source": "https://github.com/symfony/dependency-injection/tree/v6.2.6" }, "funding": [ { @@ -8243,25 +8245,25 @@ "type": "tidelift" } ], - "time": "2021-09-21T20:52:44+00:00" + "time": "2023-01-30T15:46:28+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.3.4", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "b24c6a92c6db316fee69e38c80591e080e41536c" + "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b24c6a92c6db316fee69e38c80591e080e41536c", - "reference": "b24c6a92c6db316fee69e38c80591e080e41536c", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/00b6ac156aacffc53487c930e0ab14587a6607f6", + "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1.0|^2" + "php": ">=8.1", + "symfony/service-contracts": "^1|^2|^3" }, "type": "library", "autoload": { @@ -8289,7 +8291,81 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.3.4" + "source": "https://github.com/symfony/stopwatch/tree/v6.2.5" + }, + "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": "2023-01-01T08:36:55+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v6.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "108f9c6451eea8e04a7fb83bbacb5b812ef30e35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/108f9c6451eea8e04a7fb83bbacb5b812ef30e35", + "reference": "108f9c6451eea8e04a7fb83bbacb5b812ef30e35", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/var-dumper": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.2.5" }, "funding": [ { @@ -8305,7 +8381,7 @@ "type": "tidelift" } ], - "time": "2021-07-10T08:58:57+00:00" + "time": "2023-01-13T08:35:57+00:00" } ], "aliases": [], From e345da82a04c3bb846aca7fed373b45f2a42cc9b Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 7 Feb 2023 19:35:18 +0530 Subject: [PATCH 390/674] ACQE-4573 : Drop PHP 8.0 --- composer.json | 2 +- composer.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index cc9d03115..3daf04707 100755 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "sort-packages": true }, "require": { - "php": ">=8.0", + "php": ">=8.1", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", diff --git a/composer.lock b/composer.lock index 4eb64838f..3d7ba848d 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": "5d9d79116fc425859ae9db8604899a84", + "content-hash": "6b9b32de62e2dd2784c0c3251e6079e8", "packages": [ { "name": "allure-framework/allure-codeception", @@ -8390,7 +8390,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=8.0", + "php": ">=8.1", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", From 0e954b809808c4961aaf862cc3c32503f41a654e Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Tue, 7 Feb 2023 19:36:11 +0530 Subject: [PATCH 391/674] ACQE-4573 : Drop PHP 8.0 --- .github/workflows/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fb3268b96..0d3f7ab74 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.0', '8.1', '8.2'] + php-versions: ['8.1', '8.2'] steps: - uses: actions/checkout@v2 @@ -54,7 +54,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.0', '8.1', '8.2'] + php-versions: ['8.1', '8.2'] steps: - uses: actions/checkout@v2 @@ -118,7 +118,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.0', '8.1', '8.2'] + php-versions: ['8.1', '8.2'] services: chrome: From d1e6e097d9526eebf3f78ce69b4c4ebce8650bf7 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 7 Feb 2023 20:15:08 +0530 Subject: [PATCH 392/674] Update main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0d3f7ab74..0225f58bc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.0', '8.1', '8.2'] + php-versions: ['8.1', '8.2'] steps: - uses: actions/checkout@v2 From 799ee6992f1cc2cae3b6cc082849404cc1e60863 Mon Sep 17 00:00:00 2001 From: "Manjusha.S" <manjusha.s@BLR1-LMC-N71373.local> Date: Wed, 8 Feb 2023 13:25:02 +0530 Subject: [PATCH 393/674] resolved conflicts --- CHANGELOG.md | 12 ++++++++++++ composer.json | 2 +- composer.lock | 3 ++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 602cd5ada..76b6f4c21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,18 @@ Magento Functional Testing Framework Changelog ================================================ +4.1.0 +--------- +### Enhancements + +* Dropped Support for PHP 8.0 and disabled PR checks for PHP 8.0 +* Allow MFTF generate minimum possible groups runnable by codeception + +### Fixes + +* Fixed Allure report not generating issue +* MFTF displays an appropriate message for unable to connect to Selenium server + 4.0.1 --------- ### Fixes diff --git a/composer.json b/composer.json index 3daf04707..975261039 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": "4.0.1", + "version": "4.1.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 3d7ba848d..4200d3717 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6b9b32de62e2dd2784c0c3251e6079e8", + + "content-hash": "a87d2c2c28b0bac49505f1c4df67b18f", "packages": [ { "name": "allure-framework/allure-codeception", From 1c4f1dd2f7dc7379e322a45f622a268954d4fdcd Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Mon, 13 Feb 2023 21:08:09 +0530 Subject: [PATCH 394/674] ACQE-4318: seprate function --- .../Suite/SuiteGenerator.php | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 7e6b7fa3e..6e7c0612a 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -139,6 +139,28 @@ public function generateSuite($suiteName) $this->generateSuiteFromTest($suiteName, []); } + /** + * Function which generate Testgroupmembership file. + * + * @param array $tests + * @return void + * @throws \Exception + */ + public function generateTestgroupmembership($tests) + { + $memberShipFilePath = FilePathFormatter::format(TESTS_MODULE_PATH).'_generated/testgroupmembership.txt'; + static $suiteCount = 0; + foreach ($tests as $key => $testName) { + try { + $suiteTests = $suiteCount.":".$key.":".$suiteName.':'.$testName."\n"; + file_put_contents($memberShipFilePath, $suiteTests, FILE_APPEND); + } catch (FastFailException $e) { + throw $e; + } + } + $suiteCount++; + } + /** * Function which takes a suite name and a set of test names. The function then generates all relevant supporting * files and classes for the suite. The function takes an optional argument for suites which are split by a parallel @@ -157,17 +179,14 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa $relativePath = TestGenerator::GENERATED_DIR . DIRECTORY_SEPARATOR . $suiteName; $fullPath = FilePathFormatter::format(TESTS_MODULE_PATH) . $relativePath . DIRECTORY_SEPARATOR; DirSetupUtil::createGroupDir($fullPath); - $memberShipFilePath = FilePathFormatter::format(TESTS_MODULE_PATH).'_generated/testgroupmembership.txt'; - static $suiteCount = 0; $exceptionCollector = new ExceptionCollector(); try { $relevantTests = []; if (!empty($tests)) { $this->validateTestsReferencedInSuite($suiteName, $tests, $originalSuiteName); - foreach ($tests as $key => $testName) { + $this->generateTestgroupmembership($tests); + foreach ($tests as $testName) { try { - $suiteTests = $suiteCount.":".$key.":".$suiteName.':'.$testName."\n"; - file_put_contents($memberShipFilePath, $suiteTests, FILE_APPEND); $relevantTests[$testName] = TestObjectHandler::getInstance()->getObject($testName); } catch (FastFailException $e) { throw $e; @@ -181,7 +200,6 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa } else { $relevantTests = SuiteObjectHandler::getInstance()->getObject($suiteName)->getTests(); } - $suiteCount++; if (empty($relevantTests)) { $exceptionCollector->reset(); // There are suites that include no test on purpose for certain Magento edition. From eb05da07825467ac3fc2d492446a9064310a9cfc Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Mon, 13 Feb 2023 21:17:57 +0530 Subject: [PATCH 395/674] ACQE-4318: seprate function --- src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 6e7c0612a..3a3699127 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -178,6 +178,7 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa { $relativePath = TestGenerator::GENERATED_DIR . DIRECTORY_SEPARATOR . $suiteName; $fullPath = FilePathFormatter::format(TESTS_MODULE_PATH) . $relativePath . DIRECTORY_SEPARATOR; + DirSetupUtil::createGroupDir($fullPath); $exceptionCollector = new ExceptionCollector(); try { @@ -200,6 +201,7 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa } else { $relevantTests = SuiteObjectHandler::getInstance()->getObject($suiteName)->getTests(); } + if (empty($relevantTests)) { $exceptionCollector->reset(); // There are suites that include no test on purpose for certain Magento edition. From 22d2831a8cd9acd7ad47398b4a74f88b7a657562 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Mon, 13 Feb 2023 21:18:42 +0530 Subject: [PATCH 396/674] ACQE-4318: seprate function --- src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 3a3699127..c6022acf5 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -178,7 +178,7 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa { $relativePath = TestGenerator::GENERATED_DIR . DIRECTORY_SEPARATOR . $suiteName; $fullPath = FilePathFormatter::format(TESTS_MODULE_PATH) . $relativePath . DIRECTORY_SEPARATOR; - + DirSetupUtil::createGroupDir($fullPath); $exceptionCollector = new ExceptionCollector(); try { From 1aa1a4dce394b43ca289925c40379e669740a425 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk <kolesnyk@adobe.com> Date: Mon, 13 Feb 2023 11:15:15 -0600 Subject: [PATCH 397/674] Testing allure-codeception 1.5 --- composer.json | 2 +- composer.lock | 65 ++++++++++++++++++++++++++------------------------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/composer.json b/composer.json index 975261039..a059fc813 100755 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "ext-intl": "*", "ext-json": "*", "ext-openssl": "*", - "allure-framework/allure-codeception": "^1.4", + "allure-framework/allure-codeception": "^1.5", "allure-framework/allure-phpunit": "^2", "aws/aws-sdk-php": "^3.132", "codeception/codeception": "^4.1", diff --git a/composer.lock b/composer.lock index 4200d3717..c7c1d2460 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - - "content-hash": "a87d2c2c28b0bac49505f1c4df67b18f", + "content-hash": "727da3f5d4a92c7997e8f2293b44cded", "packages": [ { "name": "allure-framework/allure-codeception", @@ -316,16 +315,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.258.4", + "version": "3.258.8", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "c20d674f502ed96ed0de63e9da087eb5f0e95590" + "reference": "3bb42aeb1e11f17b0ca7357385a427a438df35b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c20d674f502ed96ed0de63e9da087eb5f0e95590", - "reference": "c20d674f502ed96ed0de63e9da087eb5f0e95590", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3bb42aeb1e11f17b0ca7357385a427a438df35b1", + "reference": "3bb42aeb1e11f17b0ca7357385a427a438df35b1", "shasum": "" }, "require": { @@ -404,9 +403,9 @@ "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.258.4" + "source": "https://github.com/aws/aws-sdk-php/tree/3.258.8" }, - "time": "2023-02-06T19:28:40+00:00" + "time": "2023-02-10T19:22:52+00:00" }, { "name": "beberlei/assert", @@ -1141,16 +1140,16 @@ }, { "name": "composer/composer", - "version": "2.5.2", + "version": "2.5.3", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "c76c013c555160410af47c03a0e173518e3f5796" + "reference": "607a4c04006ce1d2b6fdfd5467bae3d7ad9ce5ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/c76c013c555160410af47c03a0e173518e3f5796", - "reference": "c76c013c555160410af47c03a0e173518e3f5796", + "url": "https://api.github.com/repos/composer/composer/zipball/607a4c04006ce1d2b6fdfd5467bae3d7ad9ce5ab", + "reference": "607a4c04006ce1d2b6fdfd5467bae3d7ad9ce5ab", "shasum": "" }, "require": { @@ -1234,7 +1233,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.5.2" + "source": "https://github.com/composer/composer/tree/2.5.3" }, "funding": [ { @@ -1250,7 +1249,7 @@ "type": "tidelift" } ], - "time": "2023-02-04T13:33:22+00:00" + "time": "2023-02-10T12:23:52+00:00" }, { "name": "composer/metadata-minifier", @@ -3114,37 +3113,38 @@ }, { "name": "php-webdriver/webdriver", - "version": "1.13.1", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c" + "reference": "3ea4f924afb43056bf9c630509e657d951608563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/6dfe5f814b796c1b5748850aa19f781b9274c36c", - "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/3ea4f924afb43056bf9c630509e657d951608563", + "reference": "3ea4f924afb43056bf9c630509e657d951608563", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "ext-zip": "*", - "php": "^5.6 || ~7.0 || ^8.0", + "php": "^7.3 || ^8.0", "symfony/polyfill-mbstring": "^1.12", - "symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0 || ^6.0" + "symfony/process": "^5.0 || ^6.0" }, "replace": { "facebook/webdriver": "*" }, "require-dev": { - "ondram/ci-detector": "^2.1 || ^3.5 || ^4.0", + "ergebnis/composer-normalize": "^2.20.0", + "ondram/ci-detector": "^4.0", "php-coveralls/php-coveralls": "^2.4", - "php-mock/php-mock-phpunit": "^1.1 || ^2.0", + "php-mock/php-mock-phpunit": "^2.0", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpunit/phpunit": "^5.7 || ^7 || ^8 || ^9", + "phpunit/phpunit": "^9.3", "squizlabs/php_codesniffer": "^3.5", - "symfony/var-dumper": "^3.3 || ^4.0 || ^5.0 || ^6.0" + "symfony/var-dumper": "^5.0 || ^6.0" }, "suggest": { "ext-SimpleXML": "For Firefox profile creation" @@ -3173,22 +3173,22 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.13.1" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.14.0" }, - "time": "2022-10-11T11:49:44+00:00" + "time": "2023-02-09T12:12:19+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.16.0", + "version": "1.16.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "57090cfccbfaa639e703c007486d605a6e80f56d" + "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/57090cfccbfaa639e703c007486d605a6e80f56d", - "reference": "57090cfccbfaa639e703c007486d605a6e80f56d", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/e27e92d939e2e3636f0a1f0afaba59692c0bf571", + "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571", "shasum": "" }, "require": { @@ -3218,9 +3218,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.16.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.16.1" }, - "time": "2023-01-29T14:41:23+00:00" + "time": "2023-02-07T18:11:17+00:00" }, { "name": "phpunit/php-code-coverage", @@ -8026,6 +8026,7 @@ "type": "github" } ], + "abandoned": true, "time": "2020-12-07T05:39:23+00:00" }, { From a68b5a73fe26c1c48ce9a04d66460e4cbc9b38f3 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Mon, 13 Feb 2023 11:35:42 -0600 Subject: [PATCH 398/674] ACQE-4594 --- CHANGELOG.md | 7 +++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76b6f4c21..e55c2dda4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Magento Functional Testing Framework Changelog ================================================ +4.2.0 +--------- +### Fixes + +* Bumped `allure-framework/allure-codeception` dependency to `^1.5` to fix downstream dependency issues in Magento. + + 4.1.0 --------- ### Enhancements diff --git a/composer.json b/composer.json index a059fc813..4209d85b9 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": "4.1.0", + "version": "4.2.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index c7c1d2460..7d6319b22 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": "727da3f5d4a92c7997e8f2293b44cded", + "content-hash": "25d61754287efaedebc2056fe65f051e", "packages": [ { "name": "allure-framework/allure-codeception", From 5412e326dd6b23434888b4a853340b7c3d417d6e Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk <kolesnyk@adobe.com> Date: Wed, 22 Feb 2023 11:07:00 -0600 Subject: [PATCH 399/674] Update MFTF to solve the issue with php-webdriver --- CHANGELOG.md | 6 ++++ composer.json | 4 +-- composer.lock | 79 +++++++++++++++++++++++++-------------------------- 3 files changed, 47 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e55c2dda4..4098fa410 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Magento Functional Testing Framework Changelog ================================================ +4.2.1 +--------- +### Fixes + +* Updated constraint for php-webdriver to restrict pulling versions above 1.14.0 + 4.2.0 --------- ### Fixes diff --git a/composer.json b/composer.json index 4209d85b9..f580ebfa6 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": "4.2.0", + "version": "4.2.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { @@ -30,7 +30,7 @@ "monolog/monolog": "^2.3", "mustache/mustache": "~2.5", "nikic/php-parser": "^4.4", - "php-webdriver/webdriver": "^1.9.0", + "php-webdriver/webdriver": "^1.9.0 <1.14.0", "spomky-labs/otphp": "^10.0", "symfony/console": "^4.4||^5.4", "symfony/string": "^5.4", diff --git a/composer.lock b/composer.lock index 7d6319b22..a67fbffe8 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": "25d61754287efaedebc2056fe65f051e", + "content-hash": "94ccb9217137f49890557810720f193e", "packages": [ { "name": "allure-framework/allure-codeception", @@ -315,16 +315,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.258.8", + "version": "3.260.0", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "3bb42aeb1e11f17b0ca7357385a427a438df35b1" + "reference": "25a14f63cc927d72adad3cc24d6bcdadfe6e0fc7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3bb42aeb1e11f17b0ca7357385a427a438df35b1", - "reference": "3bb42aeb1e11f17b0ca7357385a427a438df35b1", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/25a14f63cc927d72adad3cc24d6bcdadfe6e0fc7", + "reference": "25a14f63cc927d72adad3cc24d6bcdadfe6e0fc7", "shasum": "" }, "require": { @@ -403,9 +403,9 @@ "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.258.8" + "source": "https://github.com/aws/aws-sdk-php/tree/3.260.0" }, - "time": "2023-02-10T19:22:52+00:00" + "time": "2023-02-21T20:26:17+00:00" }, { "name": "beberlei/assert", @@ -1140,16 +1140,16 @@ }, { "name": "composer/composer", - "version": "2.5.3", + "version": "2.5.4", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "607a4c04006ce1d2b6fdfd5467bae3d7ad9ce5ab" + "reference": "6b67eeea4d72051c369ccdbfb2423a56e2ab51a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/607a4c04006ce1d2b6fdfd5467bae3d7ad9ce5ab", - "reference": "607a4c04006ce1d2b6fdfd5467bae3d7ad9ce5ab", + "url": "https://api.github.com/repos/composer/composer/zipball/6b67eeea4d72051c369ccdbfb2423a56e2ab51a9", + "reference": "6b67eeea4d72051c369ccdbfb2423a56e2ab51a9", "shasum": "" }, "require": { @@ -1233,7 +1233,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.5.3" + "source": "https://github.com/composer/composer/tree/2.5.4" }, "funding": [ { @@ -1249,7 +1249,7 @@ "type": "tidelift" } ], - "time": "2023-02-10T12:23:52+00:00" + "time": "2023-02-15T12:10:06+00:00" }, { "name": "composer/metadata-minifier", @@ -2280,16 +2280,16 @@ }, { "name": "jms/metadata", - "version": "2.7.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/metadata.git", - "reference": "283c714831d272d78ddd6e52e08ac16d76be30fd" + "reference": "7ca240dcac0c655eb15933ee55736ccd2ea0d7a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/283c714831d272d78ddd6e52e08ac16d76be30fd", - "reference": "283c714831d272d78ddd6e52e08ac16d76be30fd", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/7ca240dcac0c655eb15933ee55736ccd2ea0d7a6", + "reference": "7ca240dcac0c655eb15933ee55736ccd2ea0d7a6", "shasum": "" }, "require": { @@ -2300,7 +2300,7 @@ "doctrine/coding-standard": "^8.0", "mikey179/vfsstream": "^1.6.7", "phpunit/phpunit": "^8.5|^9.0", - "psr/container": "^1.0", + "psr/container": "^1.0|^2.0", "symfony/cache": "^3.1|^4.0|^5.0", "symfony/dependency-injection": "^3.1|^4.0|^5.0" }, @@ -2338,22 +2338,22 @@ ], "support": { "issues": "https://github.com/schmittjoh/metadata/issues", - "source": "https://github.com/schmittjoh/metadata/tree/2.7.0" + "source": "https://github.com/schmittjoh/metadata/tree/2.8.0" }, - "time": "2022-09-13T19:18:27+00:00" + "time": "2023-02-15T13:44:18+00:00" }, { "name": "jms/serializer", - "version": "3.22.0", + "version": "3.23.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "576d226178697534e214531dbf80058637a10ebc" + "reference": "ac0b16ee5317d1aacc41deb91c6c325eae97c176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/576d226178697534e214531dbf80058637a10ebc", - "reference": "576d226178697534e214531dbf80058637a10ebc", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/ac0b16ee5317d1aacc41deb91c6c325eae97c176", + "reference": "ac0b16ee5317d1aacc41deb91c6c325eae97c176", "shasum": "" }, "require": { @@ -2375,7 +2375,7 @@ "phpbench/phpbench": "^1.0", "phpstan/phpstan": "^1.0.2", "phpunit/phpunit": "^8.5.21||^9.0", - "psr/container": "^1.0", + "psr/container": "^1.0|^2.0", "symfony/dependency-injection": "^3.0|^4.0|^5.0|^6.0", "symfony/expression-language": "^3.2|^4.0|^5.0|^6.0", "symfony/filesystem": "^3.0|^4.0|^5.0|^6.0", @@ -2428,7 +2428,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/3.22.0" + "source": "https://github.com/schmittjoh/serializer/tree/3.23.0" }, "funding": [ { @@ -2436,7 +2436,7 @@ "type": "github" } ], - "time": "2023-02-03T04:58:11+00:00" + "time": "2023-02-17T17:40:48+00:00" }, { "name": "justinrainbow/json-schema", @@ -3113,38 +3113,37 @@ }, { "name": "php-webdriver/webdriver", - "version": "1.14.0", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "3ea4f924afb43056bf9c630509e657d951608563" + "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/3ea4f924afb43056bf9c630509e657d951608563", - "reference": "3ea4f924afb43056bf9c630509e657d951608563", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/6dfe5f814b796c1b5748850aa19f781b9274c36c", + "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "ext-zip": "*", - "php": "^7.3 || ^8.0", + "php": "^5.6 || ~7.0 || ^8.0", "symfony/polyfill-mbstring": "^1.12", - "symfony/process": "^5.0 || ^6.0" + "symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0 || ^6.0" }, "replace": { "facebook/webdriver": "*" }, "require-dev": { - "ergebnis/composer-normalize": "^2.20.0", - "ondram/ci-detector": "^4.0", + "ondram/ci-detector": "^2.1 || ^3.5 || ^4.0", "php-coveralls/php-coveralls": "^2.4", - "php-mock/php-mock-phpunit": "^2.0", + "php-mock/php-mock-phpunit": "^1.1 || ^2.0", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpunit/phpunit": "^9.3", + "phpunit/phpunit": "^5.7 || ^7 || ^8 || ^9", "squizlabs/php_codesniffer": "^3.5", - "symfony/var-dumper": "^5.0 || ^6.0" + "symfony/var-dumper": "^3.3 || ^4.0 || ^5.0 || ^6.0" }, "suggest": { "ext-SimpleXML": "For Firefox profile creation" @@ -3173,9 +3172,9 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.14.0" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.13.1" }, - "time": "2023-02-09T12:12:19+00:00" + "time": "2022-10-11T11:49:44+00:00" }, { "name": "phpstan/phpdoc-parser", From 3541230a3a41ffe68271b90aec7531058f3e613a Mon Sep 17 00:00:00 2001 From: GL-Ashish <92850316+GL-Ashish@users.noreply.github.com> Date: Wed, 1 Mar 2023 21:23:37 +0530 Subject: [PATCH 400/674] Update TestGenerator.php --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 20d764189..1a954426b 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -269,10 +269,6 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; throw new TestFrameworkException(implode(PHP_EOL, $err)); } - if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } } } From 9afa1ab3cf9a947ed6ab6f63ee98c6ee7c4fff29 Mon Sep 17 00:00:00 2001 From: GL-Ashish <92850316+GL-Ashish@users.noreply.github.com> Date: Thu, 2 Mar 2023 18:37:01 +0530 Subject: [PATCH 401/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 1a954426b..b8f601b58 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -264,12 +264,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) $argArr[$key] = explode(" ", trim($fileVal))[1]; } } - foreach ($argArr as $key => $arrVal) { - if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } - } + } /** From eda4d0c6fdd8422e32b784e816ba84c274bb34d0 Mon Sep 17 00:00:00 2001 From: GL-Ashish <92850316+GL-Ashish@users.noreply.github.com> Date: Thu, 2 Mar 2023 19:19:27 +0530 Subject: [PATCH 402/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index b8f601b58..20d764189 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -264,7 +264,16 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) $argArr[$key] = explode(" ", trim($fileVal))[1]; } } - + foreach ($argArr as $key => $arrVal) { + if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + } } /** From 3edaddbc0722866dcde70fffe0c44150464faaee Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Thu, 2 Mar 2023 21:22:41 +0530 Subject: [PATCH 403/674] unit test done --- .../Suite/SuiteGeneratorTest.php | 54 +++++++++++++++++++ .../Suite/SuiteGenerator.php | 3 +- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php index f6e215a5b..13c797509 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php @@ -40,6 +40,60 @@ protected function setUp(): void TestLoggingUtil::getInstance()->setMockLoggingUtil(); } + /** + * Tests generating a suite given a set of parsed test data. + * + * @return void + * @throws Exception + */ + public function testGenerateTestgroupmembership(): void + { + $suiteDataArrayBuilder = new SuiteDataArrayBuilder(); + $mockSuiteData = $suiteDataArrayBuilder + ->withName('mockSuite') + ->includeGroups(['group1']) + ->build(); + $testDataArrayBuilder = new TestDataArrayBuilder(); + $mockSimpleTest1 = $testDataArrayBuilder + ->withName('simpleTest1') + ->withAnnotations(['group' => [['value' => 'group1']]]) + ->withTestReference("NonExistantTest") + ->withTestActions() + ->build(); + $mockSimpleTest2 = $testDataArrayBuilder + ->withName('simpleTest2') + ->withAnnotations(['group' => [['value' => 'group1']]]) + ->withTestActions() + ->build(); + $mockSimpleTest3 = $testDataArrayBuilder + ->withName('simpleTest3') + ->withAnnotations(['group' => [['value' => 'group1']]]) + ->withTestActions() + ->build(); + $mockTestData = array_merge($mockSimpleTest1, $mockSimpleTest2, $mockSimpleTest3); + $this->setMockTestAndSuiteParserOutput($mockTestData, $mockSuiteData); + + // Make manifest for split suites + $suiteConfig = [ + 'mockSuite' => [ + 'mockSuite_0_G' => ['simpleTest1', 'simpleTest2'], + 'mockSuite_1_G' => ['simpleTest3'], + ], + ]; + $manifest = TestManifestFactory::makeManifest('default', $suiteConfig); + + // parse and generate suite object with mocked data and manifest + $mockSuiteGenerator = SuiteGenerator::getInstance(); + $mockSuiteGenerator->generateAllSuites($manifest); + + // assert last split suite group generated + TestLoggingUtil::getInstance()->validateMockLogStatement( + 'info', + 'suite generated', + ['suite' => 'mockSuite_1_G', 'relative_path' => '_generated' . DIRECTORY_SEPARATOR . 'mockSuite_1_G'] + ); + } + /** * Tests generating a single suite given a set of parsed test data. * diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index c6022acf5..ebd5f182e 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -143,10 +143,11 @@ public function generateSuite($suiteName) * Function which generate Testgroupmembership file. * * @param array $tests + * @param string $suiteName * @return void * @throws \Exception */ - public function generateTestgroupmembership($tests) + public function generateTestgroupmembership($suiteName, $tests) { $memberShipFilePath = FilePathFormatter::format(TESTS_MODULE_PATH).'_generated/testgroupmembership.txt'; static $suiteCount = 0; From e3247dede08d87993661106ead755151bad5db93 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Thu, 2 Mar 2023 21:24:24 +0530 Subject: [PATCH 404/674] unit test done --- src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index ebd5f182e..5676ab1e4 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -186,7 +186,7 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa $relevantTests = []; if (!empty($tests)) { $this->validateTestsReferencedInSuite($suiteName, $tests, $originalSuiteName); - $this->generateTestgroupmembership($tests); + $this->generateTestgroupmembership($suiteName, $tests); foreach ($tests as $testName) { try { $relevantTests[$testName] = TestObjectHandler::getInstance()->getObject($testName); From d88fbac80af25df99f9fad0be6b74fc6de072c05 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Thu, 2 Mar 2023 21:29:05 +0530 Subject: [PATCH 405/674] unit test done --- src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 5676ab1e4..f84ef6cbe 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -142,8 +142,8 @@ public function generateSuite($suiteName) /** * Function which generate Testgroupmembership file. * - * @param array $tests * @param string $suiteName + * @param array $tests * @return void * @throws \Exception */ From b5c36276d448f2a5a353a975566ad1cc1bba3bf9 Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Thu, 2 Mar 2023 21:29:45 +0530 Subject: [PATCH 406/674] unit test done --- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index f84ef6cbe..b766e84c4 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -142,8 +142,8 @@ public function generateSuite($suiteName) /** * Function which generate Testgroupmembership file. * - * @param string $suiteName - * @param array $tests + * @param string $suiteName + * @param array $tests * @return void * @throws \Exception */ From 79cfbd7b00adc3b6e9b5e7fff25fa4bc4187f1df Mon Sep 17 00:00:00 2001 From: "Ashish.Kumar18" <ashish.kumar18@BLR1-LMC-N71378.local> Date: Thu, 2 Mar 2023 21:32:36 +0530 Subject: [PATCH 407/674] unit test done --- src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index b766e84c4..1ba590b1a 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -143,7 +143,7 @@ public function generateSuite($suiteName) * Function which generate Testgroupmembership file. * * @param string $suiteName - * @param array $tests + * @param array $tests * @return void * @throws \Exception */ From 016a0bc3e52edb95f5c8d605945d5613886f2ab7 Mon Sep 17 00:00:00 2001 From: GL-Ashish <92850316+GL-Ashish@users.noreply.github.com> Date: Wed, 15 Mar 2023 22:20:04 +0530 Subject: [PATCH 408/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 20d764189..b22f1eb82 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -265,14 +265,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) } } foreach ($argArr as $key => $arrVal) { - if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } - if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } + } } From cbbbba3e69c25d4f89bee566166941b0a522a45b Mon Sep 17 00:00:00 2001 From: GL-Ashish <92850316+GL-Ashish@users.noreply.github.com> Date: Wed, 15 Mar 2023 22:23:37 +0530 Subject: [PATCH 409/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index b22f1eb82..20d764189 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -265,7 +265,14 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) } } foreach ($argArr as $key => $arrVal) { - + if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } } } From e404eac05defc463b8fbea3e86c2ccf73ad2d0dd Mon Sep 17 00:00:00 2001 From: GL-Ashish <92850316+GL-Ashish@users.noreply.github.com> Date: Thu, 16 Mar 2023 17:46:32 +0530 Subject: [PATCH 410/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 20d764189..b22f1eb82 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -265,14 +265,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) } } foreach ($argArr as $key => $arrVal) { - if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } - if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } + } } From c8ebed67d5f7ff00d91b69694825cd5e76b218b5 Mon Sep 17 00:00:00 2001 From: GL-Ashish <92850316+GL-Ashish@users.noreply.github.com> Date: Thu, 16 Mar 2023 20:55:18 +0530 Subject: [PATCH 411/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index b22f1eb82..20d764189 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -265,7 +265,14 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) } } foreach ($argArr as $key => $arrVal) { - + if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } } } From 2547fb37e6061c1cfe4ac1a70cd39132b794b69c Mon Sep 17 00:00:00 2001 From: GL-Ashish <92850316+GL-Ashish@users.noreply.github.com> Date: Mon, 20 Mar 2023 20:10:08 +0530 Subject: [PATCH 412/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 20d764189..b22f1eb82 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -265,14 +265,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) } } foreach ($argArr as $key => $arrVal) { - if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } - if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } + } } From 14318ac0a75e046871270005993fb5f5fad4bda5 Mon Sep 17 00:00:00 2001 From: GL-Ashish <92850316+GL-Ashish@users.noreply.github.com> Date: Mon, 20 Mar 2023 21:52:31 +0530 Subject: [PATCH 413/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index b22f1eb82..20d764189 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -265,7 +265,14 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) } } foreach ($argArr as $key => $arrVal) { - + if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } } } From f348e32ed0f0b09b238d7175ccef347c8d79fdc1 Mon Sep 17 00:00:00 2001 From: GL-Ashish <92850316+GL-Ashish@users.noreply.github.com> Date: Mon, 20 Mar 2023 22:28:12 +0530 Subject: [PATCH 414/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 20d764189..b22f1eb82 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -265,14 +265,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) } } foreach ($argArr as $key => $arrVal) { - if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } - if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } + } } From 228e02cab998c369ff308b6bd1528772730662c2 Mon Sep 17 00:00:00 2001 From: GL-Ashish <92850316+GL-Ashish@users.noreply.github.com> Date: Mon, 20 Mar 2023 22:45:30 +0530 Subject: [PATCH 415/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index b22f1eb82..20d764189 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -265,7 +265,14 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) } } foreach ($argArr as $key => $arrVal) { - + if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { + $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } } } From 2b19f3e0f1766c936ad3d61c3ca524e1b3cdf3ff Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Wed, 12 Apr 2023 09:32:47 +0530 Subject: [PATCH 416/674] Update TestGenerator.php --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 20d764189..fdd5ef674 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -265,6 +265,9 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) } } foreach ($argArr as $key => $arrVal) { + if (!str_contains('=', $arrVal)) { + continue; + } if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; throw new TestFrameworkException(implode(PHP_EOL, $err)); From c5751c6a9e564d3a982665ee655ddaefdf7a93a0 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Wed, 26 Apr 2023 10:32:17 +0530 Subject: [PATCH 417/674] Update TestGenerator.php --- .../Util/TestGenerator.php | 54 +++++++++++-------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index fdd5ef674..ce81230d1 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -250,33 +250,43 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) /** * Throw exception if duplicate arguments found * - * @param string $fileContents + * @param string $fileName * @return void * @throws TestFrameworkException */ - public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) + public function throwExceptionIfDuplicateArgumentsFound(string $fileName): void { - // Throw exception if duplicate arguments found in helper or actionGroup + $fileContents = file_get_contents($fileName); $fileToArr = explode("\n", $fileContents); - $argArr = []; - foreach ($fileToArr as $key => $fileVal) { - if (!empty(strpos($fileVal, "<argument name"))) { - $argArr[$key] = explode(" ", trim($fileVal))[1]; - } - } - foreach ($argArr as $key => $arrVal) { - if (!str_contains('=', $arrVal)) { - continue; - } - if (!empty($argArr[$key + 1]) && $argArr[$key + 1] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; + $argumentArray = []; + $actionGroupStart = false; + foreach ($fileToArr as $fileVal) { + $fileVal = trim($fileVal); + if (str_starts_with($fileVal, '<actionGroup') && !str_ends_with($fileVal, '/>')) { + $actionGroupStart = true; + continue; + } + if ($fileVal === '</actionGroup>') { + $argumentNameArray = []; + foreach ($argumentArray as $argument) { + $subtringStart = strpos($argument, 'name='); + $subtringStart += strlen('name='); + $size = strpos($argument, ' ', $subtringStart) - $subtringStart; + $argumentName = substr($argument, $subtringStart, $size); + if (in_array($argumentName, $argumentNameArray)) { + $err[] = sprintf('Duplicate argument name: %s in test file: %s', $argumentName, $fileName); throw new TestFrameworkException(implode(PHP_EOL, $err)); - } - if (!empty($argArr[$key + 2]) && $argArr[$key + 2] === $arrVal) { - $err[] = 'Duplicate argument name '.$arrVal.' not allowed in helper or actionGroup'; - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } - } + } + $argumentNameArray[] = $argumentName; + } + $argumentArray = []; + $actionGroupStart = false; + continue; + } + if ($actionGroupStart) { + $argumentArray[] = $fileVal; + } + } } /** @@ -291,7 +301,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents) public function assembleTestPhp($testObject) { if (!empty($testObject->getFilename()) && file_exists($testObject->getFilename())) { - $this->throwExceptionIfDuplicateArgumentsFound(file_get_contents($testObject->getFilename())); + $this->throwExceptionIfDuplicateArgumentsFound($testObject->getFilename()); } $this->customHelpers = []; $usePhp = $this->generateUseStatementsPhp(); From ed0679724e01cc44fa01af8ddc535b77ea5736d8 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Wed, 26 Apr 2023 18:04:00 +0530 Subject: [PATCH 418/674] Update TestGenerator.php --- .../Util/TestGenerator.php | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index ce81230d1..a884ca5e0 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -261,32 +261,32 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileName): void $argumentArray = []; $actionGroupStart = false; foreach ($fileToArr as $fileVal) { - $fileVal = trim($fileVal); - if (str_starts_with($fileVal, '<actionGroup') && !str_ends_with($fileVal, '/>')) { - $actionGroupStart = true; - continue; - } - if ($fileVal === '</actionGroup>') { - $argumentNameArray = []; - foreach ($argumentArray as $argument) { - $subtringStart = strpos($argument, 'name='); - $subtringStart += strlen('name='); - $size = strpos($argument, ' ', $subtringStart) - $subtringStart; - $argumentName = substr($argument, $subtringStart, $size); - if (in_array($argumentName, $argumentNameArray)) { - $err[] = sprintf('Duplicate argument name: %s in test file: %s', $argumentName, $fileName); - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } - $argumentNameArray[] = $argumentName; - } - $argumentArray = []; - $actionGroupStart = false; - continue; - } - if ($actionGroupStart) { - $argumentArray[] = $fileVal; - } - } + $fileVal = trim($fileVal); + if ((str_starts_with($fileVal, '<actionGroup') || str_starts_with($fileVal, '<helper')) && !str_ends_with($fileVal, '/>')) { + $actionGroupStart = true; + continue; + } + if ($fileVal === '</actionGroup>' || $fileVal === '</helper>') { + $argumentNameArray = []; + foreach ($argumentArray as $argument) { + $subtringStart = strpos($argument, 'name='); + $subtringStart += strlen('name='); + $size = strpos($argument, ' ', $subtringStart) - $subtringStart; + $argumentName = substr($argument, $subtringStart, $size); + if (in_array($argumentName, $argumentNameArray)) { + $err[] = sprintf('Duplicate argument for actiongroup or helper with name: %s in test file: %s', $argumentName, $fileName); + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + $argumentNameArray[] = $argumentName; + } + $argumentArray = []; + $actionGroupStart = false; + continue; + } + if ($actionGroupStart) { + $argumentArray[] = $fileVal; + } + } } /** From 32615bc36c2c39608b7e57fcbdb5cd7187c5a8de Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Wed, 15 Mar 2023 14:26:40 +0530 Subject: [PATCH 419/674] ACQE-4694 : Allure-Codeception Replacement Extension --- composer.json | 12 +- composer.lock | 1633 ++++++++++------- .../Allure/AllureHelperTest.php | 227 +-- .../ActionsInDifferentModulesSuite.txt | 4 +- .../Resources/functionalSuiteHooks.txt | 4 +- .../Resources/functionalSuiteWithComments.txt | 4 +- etc/config/codeception.dist.yml | 7 +- etc/config/functional.suite.dist.yml | 8 +- .../Allure/AllureHelper.php | 67 +- .../Codeception/Subscriber/Console.php | 17 +- .../Console/CodeceptRunCommand.php | 2 +- .../Objects/OperationDefinitionObject.php | 2 +- .../Extension/TestContextExtension.php | 238 ++- .../Module/MagentoSequence.php | 2 +- .../Module/MagentoWebDriver.php | 163 +- .../Suite/views/SuiteClass.mustache | 4 +- .../Test/Util/TestObjectExtractor.php | 2 +- 17 files changed, 1457 insertions(+), 939 deletions(-) diff --git a/composer.json b/composer.json index f580ebfa6..20cb61e92 100755 --- a/composer.json +++ b/composer.json @@ -16,13 +16,13 @@ "ext-intl": "*", "ext-json": "*", "ext-openssl": "*", - "allure-framework/allure-codeception": "^1.5", + "allure-framework/allure-codeception": "^2.1", "allure-framework/allure-phpunit": "^2", "aws/aws-sdk-php": "^3.132", - "codeception/codeception": "^4.1", - "codeception/module-asserts": "^1.1", - "codeception/module-sequence": "^1.0", - "codeception/module-webdriver": "^1.0", + "codeception/codeception": "^5.0", + "codeception/module-asserts": "^3.0", + "codeception/module-sequence": "^3.0", + "codeception/module-webdriver": "^3.0", "composer/composer": "^1.9 || ^2.0, !=2.2.16", "csharpru/vault-php": "^4.2.1", "guzzlehttp/guzzle": "^7.3.0", @@ -47,7 +47,7 @@ "codacy/coverage": "^1.4", "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", - "phpunit/phpunit": "^9.0", + "phpunit/phpunit": "<=9.5.20", "sebastian/phpcpd": "~6.0.0", "squizlabs/php_codesniffer": "~3.6.0" }, diff --git a/composer.lock b/composer.lock index a67fbffe8..e72b798d3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,38 +4,40 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "94ccb9217137f49890557810720f193e", + "content-hash": "8d813e4caf60bf7520e4781d804977cc", "packages": [ { "name": "allure-framework/allure-codeception", - "version": "1.5.2", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-codeception.git", - "reference": "a6156aef942a4e4de0add34a73d066a9458cefc6" + "reference": "1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/a6156aef942a4e4de0add34a73d066a9458cefc6", - "reference": "a6156aef942a4e4de0add34a73d066a9458cefc6", + "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8", + "reference": "1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8", "shasum": "" }, "require": { - "allure-framework/allure-php-api": "^1.3", - "codeception/codeception": "^2.5 | ^3 | ^4", + "allure-framework/allure-php-commons": "^2", + "codeception/codeception": "^5", "ext-json": "*", - "php": ">=7.1.3", - "symfony/filesystem": "^2.7 | ^3 | ^4 | ^5", - "symfony/finder": "^2.7 | ^3 | ^4 | ^5" + "php": "^8" }, "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^7.2 | ^8 | ^9" + "phpunit/phpunit": "^9", + "psalm/plugin-phpunit": "^0.18.4", + "remorhaz/php-json-data": "^0.5.3", + "remorhaz/php-json-path": "^0.7.7", + "squizlabs/php_codesniffer": "^3.7.1", + "vimeo/psalm": "^5.2" }, "type": "library", "autoload": { - "psr-0": { - "Yandex": "src/" + "psr-4": { + "Qameta\\Allure\\Codeception\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -47,6 +49,11 @@ "name": "Ivan Krutov", "email": "vania-pooh@aerokube.com", "role": "Developer" + }, + { + "name": "Edward Surov", + "email": "zoohie@gmail.com", + "role": "Developer" } ], "description": "Allure Codeception integration", @@ -65,65 +72,7 @@ "issues": "https://github.com/allure-framework/allure-codeception/issues", "source": "https://github.com/allure-framework/allure-codeception" }, - "time": "2021-06-04T13:24:36+00:00" - }, - { - "name": "allure-framework/allure-php-api", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/allure-framework/allure-php-api.git", - "reference": "50507f482d490f114054f2281cca487db47fa2bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-api/zipball/50507f482d490f114054f2281cca487db47fa2bd", - "reference": "50507f482d490f114054f2281cca487db47fa2bd", - "shasum": "" - }, - "require": { - "jms/serializer": "^1 | ^2 | ^3", - "php": ">=7.1.3", - "ramsey/uuid": "^3 | ^4", - "symfony/mime": "^4.3 | ^5" - }, - "require-dev": { - "phpunit/phpunit": "^7 | ^8 | ^9" - }, - "type": "library", - "autoload": { - "psr-0": { - "Yandex": [ - "src/", - "test/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Ivan Krutov", - "email": "vania-pooh@yandex-team.ru", - "role": "Developer" - } - ], - "description": "Allure PHP commons", - "homepage": "http://allure.qatools.ru/", - "keywords": [ - "allure", - "api", - "php", - "report" - ], - "support": { - "email": "allure@qameta.io", - "issues": "https://github.com/allure-framework/allure-php-api/issues", - "source": "https://github.com/allure-framework/allure-php-api" - }, - "time": "2021-11-15T13:15:20+00:00" + "time": "2023-01-09T08:09:01+00:00" }, { "name": "allure-framework/allure-php-commons", @@ -265,23 +214,27 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.0.4", + "version": "v1.2.1", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "f5c64ee7c5fce196e2519b3d9b7138649efe032d" + "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/f5c64ee7c5fce196e2519b3d9b7138649efe032d", - "reference": "f5c64ee7c5fce196e2519b3d9b7138649efe032d", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/1926277fc71d253dfa820271ac5987bdb193ccf5", + "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5", "shasum": "" }, "require": { "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "^4.8.35|^5.6.3" + "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." }, "type": "library", "autoload": { @@ -300,7 +253,7 @@ } ], "description": "AWS Common Runtime for PHP", - "homepage": "http://aws.amazon.com/sdkforphp", + "homepage": "https://github.com/awslabs/aws-crt-php", "keywords": [ "amazon", "aws", @@ -309,22 +262,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.0.4" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.1" }, - "time": "2023-01-31T23:08:25+00:00" + "time": "2023-03-24T20:22:19+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.260.0", + "version": "3.268.16", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "25a14f63cc927d72adad3cc24d6bcdadfe6e0fc7" + "reference": "b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/25a14f63cc927d72adad3cc24d6bcdadfe6e0fc7", - "reference": "25a14f63cc927d72adad3cc24d6bcdadfe6e0fc7", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98", + "reference": "b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98", "shasum": "" }, "require": { @@ -334,7 +287,7 @@ "ext-simplexml": "*", "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", "guzzlehttp/promises": "^1.4.0", - "guzzlehttp/psr7": "^1.8.5 || ^2.3", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "mtdowling/jmespath.php": "^2.6", "php": ">=5.5" }, @@ -353,6 +306,7 @@ "paragonie/random_compat": ">= 2", "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", "psr/cache": "^1.0", + "psr/http-message": "^1.0", "psr/simple-cache": "^1.0", "sebastian/comparator": "^1.2.3 || ^4.0", "yoast/phpunit-polyfills": "^1.0" @@ -403,9 +357,9 @@ "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.260.0" + "source": "https://github.com/aws/aws-sdk-php/tree/3.268.16" }, - "time": "2023-02-21T20:26:17+00:00" + "time": "2023-04-21T21:37:05+00:00" }, { "name": "beberlei/assert", @@ -539,26 +493,25 @@ }, { "name": "brick/math", - "version": "0.10.2", + "version": "0.11.0", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f" + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f", - "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f", + "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^7.4 || ^8.0" + "php": "^8.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^9.0", - "vimeo/psalm": "4.25.0" + "vimeo/psalm": "5.0.0" }, "type": "library", "autoload": { @@ -583,7 +536,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.10.2" + "source": "https://github.com/brick/math/tree/0.11.0" }, "funding": [ { @@ -591,65 +544,80 @@ "type": "github" } ], - "time": "2022-08-10T22:54:19+00:00" + "time": "2023-01-15T23:15:59+00:00" }, { "name": "codeception/codeception", - "version": "4.2.2", + "version": "5.0.10", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "b88014f3348c93f3df99dc6d0967b0dbfa804474" + "reference": "ed4af7fd4103cdd035916fbb8f35124edd2d018b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/b88014f3348c93f3df99dc6d0967b0dbfa804474", - "reference": "b88014f3348c93f3df99dc6d0967b0dbfa804474", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/ed4af7fd4103cdd035916fbb8f35124edd2d018b", + "reference": "ed4af7fd4103cdd035916fbb8f35124edd2d018b", "shasum": "" }, "require": { - "behat/gherkin": "^4.4.0", - "codeception/lib-asserts": "^1.0 | 2.0.*@dev", - "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 | ^4.0", + "behat/gherkin": "^4.6.2", + "codeception/lib-asserts": "^2.0", + "codeception/stub": "^4.1", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "guzzlehttp/psr7": "^1.4 | ^2.0", - "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" + "php": "^8.0", + "phpunit/php-code-coverage": "^9.2 || ^10.0", + "phpunit/php-text-template": "^2.0 || ^3.0", + "phpunit/php-timer": "^5.0.3 || ^6.0", + "phpunit/phpunit": "^9.5.20 || ^10.0", + "psy/psysh": "^0.11.2", + "sebastian/comparator": "^4.0.5 || ^5.0", + "sebastian/diff": "^4.0.3 || ^5.0", + "symfony/console": ">=4.4.24 <7.0", + "symfony/css-selector": ">=4.4.24 <7.0", + "symfony/event-dispatcher": ">=4.4.24 <7.0", + "symfony/finder": ">=4.4.24 <7.0", + "symfony/var-dumper": ">=4.4.24 < 7.0", + "symfony/yaml": ">=4.4.24 <7.0" + }, + "conflict": { + "codeception/lib-innerbrowser": "<3.1.3", + "codeception/module-filesystem": "<3.0", + "codeception/module-phpbrowser": "<2.5" + }, + "replace": { + "codeception/phpunit-wrapper": "*" }, "require-dev": { - "codeception/module-asserts": "^1.0 | 2.0.*@dev", - "codeception/module-cli": "^1.0 | 2.0.*@dev", - "codeception/module-db": "^1.0 | 2.0.*@dev", - "codeception/module-filesystem": "^1.0 | 2.0.*@dev", - "codeception/module-phpbrowser": "^1.0 | 2.0.*@dev", - "codeception/specify": "~0.3", + "codeception/lib-innerbrowser": "*@dev", + "codeception/lib-web": "^1.0", + "codeception/module-asserts": "*@dev", + "codeception/module-cli": "*@dev", + "codeception/module-db": "*@dev", + "codeception/module-filesystem": "*@dev", + "codeception/module-phpbrowser": "*@dev", "codeception/util-universalframework": "*@dev", - "monolog/monolog": "~1.8", - "squizlabs/php_codesniffer": "~2.0", - "symfony/process": ">=2.7 <6.0", - "vlucas/phpdotenv": "^2.0 | ^3.0 | ^4.0 | ^5.0" + "ext-simplexml": "*", + "jetbrains/phpstorm-attributes": "^1.0", + "symfony/dotenv": ">=4.4.24 <7.0", + "symfony/process": ">=4.4.24 <7.0", + "vlucas/phpdotenv": "^5.1" }, "suggest": { "codeception/specify": "BDD-style code blocks", "codeception/verify": "BDD-style assertions", - "hoa/console": "For interactive console functionality", + "ext-simplexml": "For loading params from XML files", "stecman/symfony-console-completion": "For BASH autocompletion", - "symfony/phpunit-bridge": "For phpunit-bridge support" + "symfony/dotenv": "For loading params from .env files", + "symfony/phpunit-bridge": "For phpunit-bridge support", + "vlucas/phpdotenv": "For loading params from .env files" }, "bin": [ "codecept" ], "type": "library", - "extra": { - "branch-alias": [] - }, "autoload": { "files": [ "functions.php" @@ -657,7 +625,10 @@ "psr-4": { "Codeception\\": "src/Codeception", "Codeception\\Extension\\": "ext" - } + }, + "classmap": [ + "src/PHPUnit/TestCase.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -666,8 +637,8 @@ "authors": [ { "name": "Michael Bodnarchuk", - "email": "davert@mail.ua", - "homepage": "https://codegyre.com" + "email": "davert.ua@gmail.com", + "homepage": "https://codeception.com" } ], "description": "BDD-style testing framework", @@ -681,7 +652,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/4.2.2" + "source": "https://github.com/Codeception/Codeception/tree/5.0.10" }, "funding": [ { @@ -689,26 +660,26 @@ "type": "open_collective" } ], - "time": "2022-08-13T13:28:25+00:00" + "time": "2023-03-14T07:21:10+00:00" }, { "name": "codeception/lib-asserts", - "version": "1.13.2", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/Codeception/lib-asserts.git", - "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6" + "reference": "b8c7dff552249e560879c682ba44a4b963af91bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/184231d5eab66bc69afd6b9429344d80c67a33b6", - "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/b8c7dff552249e560879c682ba44a4b963af91bc", + "reference": "b8c7dff552249e560879c682ba44a4b963af91bc", "shasum": "" }, "require": { - "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.0.3 | ^9.0", + "codeception/phpunit-wrapper": "^7.7.1 | ^8.0.3 | ^9.0", "ext-dom": "*", - "php": ">=5.6.0 <9.0" + "php": "^7.4 | ^8.0" }, "type": "library", "autoload": { @@ -741,31 +712,84 @@ ], "support": { "issues": "https://github.com/Codeception/lib-asserts/issues", - "source": "https://github.com/Codeception/lib-asserts/tree/1.13.2" + "source": "https://github.com/Codeception/lib-asserts/tree/2.1.0" + }, + "time": "2023-02-10T18:36:23+00:00" + }, + { + "name": "codeception/lib-web", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-web.git", + "reference": "f488ff9bc08c8985d43796db28da0bd18813bcae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-web/zipball/f488ff9bc08c8985d43796db28da0bd18813bcae", + "reference": "f488ff9bc08c8985d43796db28da0bd18813bcae", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "guzzlehttp/psr7": "^2.0", + "php": "^8.0", + "symfony/css-selector": ">=4.4.24 <7.0" + }, + "conflict": { + "codeception/codeception": "<5.0.0-alpha3" + }, + "require-dev": { + "php-webdriver/webdriver": "^1.12", + "phpunit/phpunit": "^9.5 | ^10.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gintautas Miselis" + } + ], + "description": "Library containing files used by module-webdriver and lib-innerbrowser or module-phpbrowser", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-web/issues", + "source": "https://github.com/Codeception/lib-web/tree/1.0.2" }, - "time": "2020-10-21T16:26:20+00:00" + "time": "2023-04-18T20:32:51+00:00" }, { "name": "codeception/module-asserts", - "version": "1.3.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/Codeception/module-asserts.git", - "reference": "59374f2fef0cabb9e8ddb53277e85cdca74328de" + "reference": "1b6b150b30586c3614e7e5761b31834ed7968603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/59374f2fef0cabb9e8ddb53277e85cdca74328de", - "reference": "59374f2fef0cabb9e8ddb53277e85cdca74328de", + "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/1b6b150b30586c3614e7e5761b31834ed7968603", + "reference": "1b6b150b30586c3614e7e5761b31834ed7968603", "shasum": "" }, "require": { "codeception/codeception": "*@dev", - "codeception/lib-asserts": "^1.13.1", - "php": ">=5.6.0 <9.0" + "codeception/lib-asserts": "^2.0", + "php": "^8.0" }, "conflict": { - "codeception/codeception": "<4.0" + "codeception/codeception": "<5.0" }, "type": "library", "autoload": { @@ -798,30 +822,33 @@ ], "support": { "issues": "https://github.com/Codeception/module-asserts/issues", - "source": "https://github.com/Codeception/module-asserts/tree/1.3.1" + "source": "https://github.com/Codeception/module-asserts/tree/3.0.0" }, - "time": "2020-10-21T16:48:15+00:00" + "time": "2022-02-16T19:48:08+00:00" }, { "name": "codeception/module-sequence", - "version": "1.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/Codeception/module-sequence.git", - "reference": "b75be26681ae90824cde8f8df785981f293667e1" + "reference": "9738e2eb06035a0975171a0aa3fce00d284b4dfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-sequence/zipball/b75be26681ae90824cde8f8df785981f293667e1", - "reference": "b75be26681ae90824cde8f8df785981f293667e1", + "url": "https://api.github.com/repos/Codeception/module-sequence/zipball/9738e2eb06035a0975171a0aa3fce00d284b4dfb", + "reference": "9738e2eb06035a0975171a0aa3fce00d284b4dfb", "shasum": "" }, "require": { - "codeception/codeception": "^4.0", - "php": ">=5.6.0 <9.0" + "codeception/codeception": "^5.0", + "php": "^8.0" }, "type": "library", "autoload": { + "files": [ + "src/Codeception/Util/sq.php" + ], "classmap": [ "src/" ] @@ -836,34 +863,39 @@ } ], "description": "Sequence module for Codeception", - "homepage": "http://codeception.com/", + "homepage": "https://codeception.com/", "keywords": [ "codeception" ], "support": { "issues": "https://github.com/Codeception/module-sequence/issues", - "source": "https://github.com/Codeception/module-sequence/tree/1.0.1" + "source": "https://github.com/Codeception/module-sequence/tree/3.0.0" }, - "time": "2020-10-31T18:36:26+00:00" + "time": "2022-05-31T05:45:36+00:00" }, { "name": "codeception/module-webdriver", - "version": "1.4.1", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/Codeception/module-webdriver.git", - "reference": "e22ac7da756df659df6dd4fac2dff9c859e30131" + "reference": "59b6fe426dddbe889c23593f8698c52e08bba6e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/e22ac7da756df659df6dd4fac2dff9c859e30131", - "reference": "e22ac7da756df659df6dd4fac2dff9c859e30131", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/59b6fe426dddbe889c23593f8698c52e08bba6e9", + "reference": "59b6fe426dddbe889c23593f8698c52e08bba6e9", "shasum": "" }, "require": { - "codeception/codeception": "^4.0", - "php": ">=5.6.0 <9.0", - "php-webdriver/webdriver": "^1.8.0" + "codeception/codeception": "^5.0.0-RC2", + "codeception/lib-web": "^1.0.1", + "codeception/stub": "^4.0", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "php-webdriver/webdriver": "^1.8.0", + "phpunit/phpunit": "^9.5" }, "suggest": { "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" @@ -890,7 +922,7 @@ } ], "description": "WebDriver module for Codeception", - "homepage": "http://codeception.com/", + "homepage": "https://codeception.com/", "keywords": [ "acceptance-testing", "browser-testing", @@ -898,77 +930,31 @@ ], "support": { "issues": "https://github.com/Codeception/module-webdriver/issues", - "source": "https://github.com/Codeception/module-webdriver/tree/1.4.1" + "source": "https://github.com/Codeception/module-webdriver/tree/3.2.1" }, - "time": "2022-09-12T05:09:51+00:00" - }, - { - "name": "codeception/phpunit-wrapper", - "version": "9.0.9", - "source": { - "type": "git", - "url": "https://github.com/Codeception/phpunit-wrapper.git", - "reference": "7439a53ae367986e9c22b2ac00f9d7376bb2f8cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/7439a53ae367986e9c22b2ac00f9d7376bb2f8cf", - "reference": "7439a53ae367986e9c22b2ac00f9d7376bb2f8cf", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "phpunit/phpunit": "^9.0" - }, - "require-dev": { - "codeception/specify": "*", - "consolidation/robo": "^3.0.0-alpha3", - "vlucas/phpdotenv": "^3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Codeception\\PHPUnit\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Davert", - "email": "davert.php@resend.cc" - }, - { - "name": "Naktibalda" - } - ], - "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.9" - }, - "time": "2022-05-23T06:24:11+00:00" + "time": "2023-02-03T21:46:32+00:00" }, { "name": "codeception/stub", - "version": "4.0.2", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d" + "reference": "58751aed08a68ae960a952fd3fe74ee9a56cdb1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/18a148dacd293fc7b044042f5aa63a82b08bff5d", - "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/58751aed08a68ae960a952fd3fe74ee9a56cdb1b", + "reference": "58751aed08a68ae960a952fd3fe74ee9a56cdb1b", "shasum": "" }, "require": { "php": "^7.4 | ^8.0", "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | 10.0.x-dev" }, + "conflict": { + "codeception/codeception": "<5.0.6" + }, "require-dev": { "consolidation/robo": "^3.0" }, @@ -985,9 +971,9 @@ "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", "support": { "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/4.0.2" + "source": "https://github.com/Codeception/Stub/tree/4.1.0" }, - "time": "2022-01-31T19:25:15+00:00" + "time": "2022-12-27T18:41:43+00:00" }, { "name": "composer/ca-bundle", @@ -1140,16 +1126,16 @@ }, { "name": "composer/composer", - "version": "2.5.4", + "version": "2.5.5", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "6b67eeea4d72051c369ccdbfb2423a56e2ab51a9" + "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/6b67eeea4d72051c369ccdbfb2423a56e2ab51a9", - "reference": "6b67eeea4d72051c369ccdbfb2423a56e2ab51a9", + "url": "https://api.github.com/repos/composer/composer/zipball/c7cffaad16a60636a776017eac5bd8cd0095c32f", + "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f", "shasum": "" }, "require": { @@ -1233,7 +1219,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.5.4" + "source": "https://github.com/composer/composer/tree/2.5.5" }, "funding": [ { @@ -1249,7 +1235,7 @@ "type": "tidelift" } ], - "time": "2023-02-15T12:10:06+00:00" + "time": "2023-03-21T10:50:05+00:00" }, { "name": "composer/metadata-minifier", @@ -1949,22 +1935,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.5.0", + "version": "7.5.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" + "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", - "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b964ca597e86b752cd994f27293e9fa6b6a95ed9", + "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.9 || ^2.4", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -2057,7 +2043,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.5.0" + "source": "https://github.com/guzzle/guzzle/tree/7.5.1" }, "funding": [ { @@ -2073,7 +2059,7 @@ "type": "tidelift" } ], - "time": "2022-08-28T15:39:27+00:00" + "time": "2023-04-17T16:30:08+00:00" }, { "name": "guzzlehttp/promises", @@ -2161,22 +2147,22 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.4.3", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "67c26b443f348a51926030c83481b85718457d3d" + "reference": "b635f279edd83fc275f822a1188157ffea568ff6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", - "reference": "67c26b443f348a51926030c83481b85718457d3d", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0" }, "provide": { @@ -2196,9 +2182,6 @@ "bamarni-bin": { "bin-links": true, "forward-command": false - }, - "branch-alias": { - "dev-master": "2.4-dev" } }, "autoload": { @@ -2260,7 +2243,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.4.3" + "source": "https://github.com/guzzle/psr7/tree/2.5.0" }, "funding": [ { @@ -2276,167 +2259,7 @@ "type": "tidelift" } ], - "time": "2022-10-26T14:07:24+00:00" - }, - { - "name": "jms/metadata", - "version": "2.8.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/metadata.git", - "reference": "7ca240dcac0c655eb15933ee55736ccd2ea0d7a6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/7ca240dcac0c655eb15933ee55736ccd2ea0d7a6", - "reference": "7ca240dcac0c655eb15933ee55736ccd2ea0d7a6", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "require-dev": { - "doctrine/cache": "^1.0", - "doctrine/coding-standard": "^8.0", - "mikey179/vfsstream": "^1.6.7", - "phpunit/phpunit": "^8.5|^9.0", - "psr/container": "^1.0|^2.0", - "symfony/cache": "^3.1|^4.0|^5.0", - "symfony/dependency-injection": "^3.1|^4.0|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Metadata\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "Class/method/property metadata management in PHP", - "keywords": [ - "annotations", - "metadata", - "xml", - "yaml" - ], - "support": { - "issues": "https://github.com/schmittjoh/metadata/issues", - "source": "https://github.com/schmittjoh/metadata/tree/2.8.0" - }, - "time": "2023-02-15T13:44:18+00:00" - }, - { - "name": "jms/serializer", - "version": "3.23.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/serializer.git", - "reference": "ac0b16ee5317d1aacc41deb91c6c325eae97c176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/ac0b16ee5317d1aacc41deb91c6c325eae97c176", - "reference": "ac0b16ee5317d1aacc41deb91c6c325eae97c176", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.13 || ^2.0", - "doctrine/instantiator": "^1.0.3", - "doctrine/lexer": "^1.1 || ^2", - "jms/metadata": "^2.6", - "php": "^7.2||^8.0", - "phpstan/phpdoc-parser": "^0.4 || ^0.5 || ^1.0" - }, - "require-dev": { - "doctrine/coding-standard": "^8.1", - "doctrine/orm": "~2.1", - "doctrine/persistence": "^1.3.3|^2.0|^3.0", - "doctrine/phpcr-odm": "^1.3|^2.0", - "ext-pdo_sqlite": "*", - "jackalope/jackalope-doctrine-dbal": "^1.1.5", - "ocramius/proxy-manager": "^1.0|^2.0", - "phpbench/phpbench": "^1.0", - "phpstan/phpstan": "^1.0.2", - "phpunit/phpunit": "^8.5.21||^9.0", - "psr/container": "^1.0|^2.0", - "symfony/dependency-injection": "^3.0|^4.0|^5.0|^6.0", - "symfony/expression-language": "^3.2|^4.0|^5.0|^6.0", - "symfony/filesystem": "^3.0|^4.0|^5.0|^6.0", - "symfony/form": "^3.0|^4.0|^5.0|^6.0", - "symfony/translation": "^3.0|^4.0|^5.0|^6.0", - "symfony/uid": "^5.1|^6.0", - "symfony/validator": "^3.1.9|^4.0|^5.0|^6.0", - "symfony/yaml": "^3.3|^4.0|^5.0|^6.0", - "twig/twig": "~1.34|~2.4|^3.0" - }, - "suggest": { - "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", - "symfony/cache": "Required if you like to use cache functionality.", - "symfony/uid": "Required if you'd like to serialize UID objects.", - "symfony/yaml": "Required if you'd like to use the YAML metadata format." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "JMS\\Serializer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "Library for (de-)serializing data of any complexity; supports XML, and JSON.", - "homepage": "http://jmsyst.com/libs/serializer", - "keywords": [ - "deserialization", - "jaxb", - "json", - "serialization", - "xml" - ], - "support": { - "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/3.23.0" - }, - "funding": [ - { - "url": "https://github.com/goetas", - "type": "github" - } - ], - "time": "2023-02-17T17:40:48+00:00" + "time": "2023-04-17T16:11:26+00:00" }, { "name": "justinrainbow/json-schema", @@ -2510,22 +2333,22 @@ }, { "name": "laminas/laminas-diactoros", - "version": "2.24.0", + "version": "2.25.2", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "6028af6c3b5ced4d063a680d2483cce67578b902" + "reference": "9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/6028af6c3b5ced4d063a680d2483cce67578b902", - "reference": "6028af6c3b5ced4d063a680d2483cce67578b902", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e", + "reference": "9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e", "shasum": "" }, "require": { "php": "~8.0.0 || ~8.1.0 || ~8.2.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.1" }, "conflict": { "zendframework/zend-diactoros": "*" @@ -2540,11 +2363,11 @@ "ext-gd": "*", "ext-libxml": "*", "http-interop/http-factory-tests": "^0.9.0", - "laminas/laminas-coding-standard": "^2.4.0", + "laminas/laminas-coding-standard": "^2.5", "php-http/psr7-integration-tests": "^1.2", - "phpunit/phpunit": "^9.5.27", + "phpunit/phpunit": "^9.5.28", "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.4" + "vimeo/psalm": "^5.6" }, "type": "library", "extra": { @@ -2603,7 +2426,7 @@ "type": "community_bridge" } ], - "time": "2022-12-20T12:22:40+00:00" + "time": "2023-04-17T15:44:17+00:00" }, { "name": "monolog/monolog", @@ -2820,16 +2643,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { @@ -2867,7 +2690,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { @@ -2875,20 +2698,20 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" + "time": "2023-03-08T13:26:56+00:00" }, { "name": "nikic/php-parser", - "version": "v4.15.3", + "version": "v4.15.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", "shasum": "" }, "require": { @@ -2929,9 +2752,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" }, - "time": "2023-01-16T22:05:37+00:00" + "time": "2023-03-05T19:49:14+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -3099,95 +2922,331 @@ "role": "Developer" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "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/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "php-webdriver/webdriver", + "version": "1.13.1", + "source": { + "type": "git", + "url": "https://github.com/php-webdriver/php-webdriver.git", + "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/6dfe5f814b796c1b5748850aa19f781b9274c36c", + "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-zip": "*", + "php": "^5.6 || ~7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.12", + "symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0 || ^6.0" + }, + "replace": { + "facebook/webdriver": "*" + }, + "require-dev": { + "ondram/ci-detector": "^2.1 || ^3.5 || ^4.0", + "php-coveralls/php-coveralls": "^2.4", + "php-mock/php-mock-phpunit": "^1.1 || ^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpunit/phpunit": "^5.7 || ^7 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3.5", + "symfony/var-dumper": "^3.3 || ^4.0 || ^5.0 || ^6.0" + }, + "suggest": { + "ext-SimpleXML": "For Firefox profile creation" + }, + "type": "library", + "autoload": { + "files": [ + "lib/Exception/TimeoutException.php" + ], + "psr-4": { + "Facebook\\WebDriver\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.", + "homepage": "https://github.com/php-webdriver/php-webdriver", + "keywords": [ + "Chromedriver", + "geckodriver", + "php", + "selenium", + "webdriver" + ], + "support": { + "issues": "https://github.com/php-webdriver/php-webdriver/issues", + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.13.1" + }, + "time": "2022-10-11T11:49:44+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "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" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "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.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.7.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "dfc078e8af9c99210337325ff5aa152872c98714" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/dfc078e8af9c99210337325ff5aa152872c98714", + "reference": "dfc078e8af9c99210337325ff5aa152872c98714", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" } ], - "description": "Library for handling version information and constraints", + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.1" }, - "time": "2022-02-21T01:04:05+00:00" + "time": "2023-03-27T19:02:04+00:00" }, { - "name": "php-webdriver/webdriver", - "version": "1.13.1", + "name": "phpspec/prophecy", + "version": "v1.17.0", "source": { "type": "git", - "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c" + "url": "https://github.com/phpspec/prophecy.git", + "reference": "15873c65b207b07765dbc3c95d20fdf4a320cbe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/6dfe5f814b796c1b5748850aa19f781b9274c36c", - "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/15873c65b207b07765dbc3c95d20fdf4a320cbe2", + "reference": "15873c65b207b07765dbc3c95d20fdf4a320cbe2", "shasum": "" }, "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-zip": "*", - "php": "^5.6 || ~7.0 || ^8.0", - "symfony/polyfill-mbstring": "^1.12", - "symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0 || ^6.0" - }, - "replace": { - "facebook/webdriver": "*" + "doctrine/instantiator": "^1.2 || ^2.0", + "php": "^7.2 || 8.0.* || 8.1.* || 8.2.*", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { - "ondram/ci-detector": "^2.1 || ^3.5 || ^4.0", - "php-coveralls/php-coveralls": "^2.4", - "php-mock/php-mock-phpunit": "^1.1 || ^2.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpunit/phpunit": "^5.7 || ^7 || ^8 || ^9", - "squizlabs/php_codesniffer": "^3.5", - "symfony/var-dumper": "^3.3 || ^4.0 || ^5.0 || ^6.0" - }, - "suggest": { - "ext-SimpleXML": "For Firefox profile creation" + "phpspec/phpspec": "^6.0 || ^7.0", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, "autoload": { - "files": [ - "lib/Exception/TimeoutException.php" - ], "psr-4": { - "Facebook\\WebDriver\\": "lib/" + "Prophecy\\": "src/Prophecy" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.", - "homepage": "https://github.com/php-webdriver/php-webdriver", + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", "keywords": [ - "Chromedriver", - "geckodriver", - "php", - "selenium", - "webdriver" + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" ], "support": { - "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.13.1" + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/v1.17.0" }, - "time": "2022-10-11T11:49:44+00:00" + "time": "2023-02-02T15:41:36+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.16.1", + "version": "1.20.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571" + "reference": "57f6787f0bb6431905a18aa7caea25dcd2bd59e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/e27e92d939e2e3636f0a1f0afaba59692c0bf571", - "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/57f6787f0bb6431905a18aa7caea25dcd2bd59e0", + "reference": "57f6787f0bb6431905a18aa7caea25dcd2bd59e0", "shasum": "" }, "require": { @@ -3217,29 +3276,29 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.16.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.20.1" }, - "time": "2023-02-07T18:11:17+00:00" + "time": "2023-04-22T09:05:52+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.24", + "version": "9.2.26", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed" + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2cf940ebc6355a9d430462811b5aaa308b174bed", - "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.14", + "nikic/php-parser": "^4.15", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -3254,8 +3313,8 @@ "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { @@ -3288,7 +3347,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.24" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" }, "funding": [ { @@ -3296,7 +3355,7 @@ "type": "github" } ], - "time": "2023-01-26T08:26:55+00:00" + "time": "2023-03-06T12:58:08+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3541,20 +3600,20 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.3", + "version": "9.5.20", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555" + "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7b1615e3e887d6c719121c6d4a44b0ab9645555", - "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba", + "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", + "doctrine/instantiator": "^1.3.1", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -3565,6 +3624,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", + "phpspec/prophecy": "^1.12.1", "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", @@ -3572,16 +3632,20 @@ "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", + "sebastian/comparator": "^4.0.5", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", + "sebastian/exporter": "^4.0.3", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", + "sebastian/type": "^3.0", "sebastian/version": "^3.0.2" }, + "require-dev": { + "ext-pdo": "*", + "phpspec/prophecy-phpunit": "^2.0.1" + }, "suggest": { "ext-soap": "*", "ext-xdebug": "*" @@ -3592,7 +3656,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.6-dev" + "dev-master": "9.5-dev" } }, "autoload": { @@ -3623,7 +3687,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20" }, "funding": [ { @@ -3633,13 +3697,9 @@ { "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" } ], - "time": "2023-02-04T13:37:15+00:00" + "time": "2022-04-01T12:37:26+00:00" }, { "name": "psr/cache", @@ -3795,21 +3855,21 @@ }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -3829,7 +3889,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -3841,27 +3901,27 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client/tree/1.0.2" }, - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-04-10T20:12:12+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "e616d01114759c4c489f93b099585439f795fe35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", "shasum": "" }, "require": { "php": ">=7.0.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -3881,7 +3941,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", @@ -3896,31 +3956,31 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" }, - "time": "2019-04-30T12:38:16+00:00" + "time": "2023-04-10T20:10:41+00:00" }, { "name": "psr/http-message", - "version": "1.0.1", + "version": "1.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -3949,9 +4009,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "source": "https://github.com/php-fig/http-message/tree/1.1" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-04-04T09:50:52+00:00" }, { "name": "psr/log", @@ -4003,6 +4063,82 @@ }, "time": "2021-07-14T16:41:46+00:00" }, + { + "name": "psy/psysh", + "version": "v0.11.15", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "5350ce0ec8ecf2c5b5cf554cd2496f97b444af85" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/5350ce0ec8ecf2c5b5cf554cd2496f97b444af85", + "reference": "5350ce0ec8ecf2c5b5cf554cd2496f97b444af85", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^4.0 || ^3.1", + "php": "^8.0 || ^7.0.8", + "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.11.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.11.15" + }, + "time": "2023-04-07T21:57:09+00:00" + }, { "name": "ralouphie/getallheaders", "version": "3.0.3", @@ -4138,20 +4274,20 @@ }, { "name": "ramsey/uuid", - "version": "4.7.3", + "version": "4.7.4", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "433b2014e3979047db08a17a205f410ba3869cf2" + "reference": "60a4c63ab724854332900504274f6150ff26d286" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/433b2014e3979047db08a17a205f410ba3869cf2", - "reference": "433b2014e3979047db08a17a205f410ba3869cf2", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", + "reference": "60a4c63ab724854332900504274f6150ff26d286", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" @@ -4214,7 +4350,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.3" + "source": "https://github.com/ramsey/uuid/tree/4.7.4" }, "funding": [ { @@ -4226,7 +4362,7 @@ "type": "tidelift" } ], - "time": "2023-01-12T18:13:24+00:00" + "time": "2023-04-15T23:01:58+00:00" }, { "name": "react/promise", @@ -5518,16 +5654,16 @@ }, { "name": "symfony/console", - "version": "v5.4.19", + "version": "v5.4.22", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "dccb8d251a9017d5994c988b034d3e18aaabf740" + "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/dccb8d251a9017d5994c988b034d3e18aaabf740", - "reference": "dccb8d251a9017d5994c988b034d3e18aaabf740", + "url": "https://api.github.com/repos/symfony/console/zipball/3cd51fd2e6c461ca678f84d419461281bd87a0a8", + "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8", "shasum": "" }, "require": { @@ -5592,12 +5728,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.19" + "source": "https://github.com/symfony/console/tree/v5.4.22" }, "funding": [ { @@ -5613,25 +5749,24 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-03-25T09:27:28+00:00" }, { "name": "symfony/css-selector", - "version": "v5.4.19", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "f4a7d150f5b9e8f974f6f127d8167e420d11fc62" + "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/f4a7d150f5b9e8f974f6f127d8167e420d11fc62", - "reference": "f4a7d150f5b9e8f974f6f127d8167e420d11fc62", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/aedf3cb0f5b929ec255d96bbb4909e9932c769e0", + "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -5663,7 +5798,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.4.19" + "source": "https://github.com/symfony/css-selector/tree/v6.2.7" }, "funding": [ { @@ -5679,20 +5814,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-02-14T08:44:56+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.2.0", + "version": "v3.2.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3" + "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3", - "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", "shasum": "" }, "require": { @@ -5730,7 +5865,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1" }, "funding": [ { @@ -5746,20 +5881,20 @@ "type": "tidelift" } ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-03-01T10:25:55+00:00" }, { "name": "symfony/dotenv", - "version": "v5.4.19", + "version": "v5.4.22", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "38190ba62566afa26ca723a795d0a004e061bd2a" + "reference": "77b7660bfcb85e8f28287d557d7af0046bcd2ca3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/38190ba62566afa26ca723a795d0a004e061bd2a", - "reference": "38190ba62566afa26ca723a795d0a004e061bd2a", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/77b7660bfcb85e8f28287d557d7af0046bcd2ca3", + "reference": "77b7660bfcb85e8f28287d557d7af0046bcd2ca3", "shasum": "" }, "require": { @@ -5801,7 +5936,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.4.19" + "source": "https://github.com/symfony/dotenv/tree/v5.4.22" }, "funding": [ { @@ -5817,44 +5952,42 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-03-09T20:36:58+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.19", + "version": "v6.2.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "abf49cc084c087d94b4cb939c3f3672971784e0c" + "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abf49cc084c087d94b4cb939c3f3672971784e0c", - "reference": "abf49cc084c087d94b4cb939c3f3672971784e0c", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/04046f35fd7d72f9646e721fc2ecb8f9c67d3339", + "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher-contracts": "^2|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2|^3" }, "conflict": { - "symfony/dependency-injection": "<4.4" + "symfony/dependency-injection": "<5.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^4.4|^5.0|^6.0" + "symfony/stopwatch": "^5.4|^6.0" }, "suggest": { "symfony/dependency-injection": "", @@ -5886,7 +6019,7 @@ "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/v5.4.19" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.8" }, "funding": [ { @@ -5902,20 +6035,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-03-20T16:06:02+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.2.0", + "version": "v3.2.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0782b0b52a737a05b4383d0df35a474303cabdae" + "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae", - "reference": "0782b0b52a737a05b4383d0df35a474303cabdae", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", "shasum": "" }, "require": { @@ -5965,7 +6098,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.1" }, "funding": [ { @@ -5981,27 +6114,26 @@ "type": "tidelift" } ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-03-01T10:32:47+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.19", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8" + "reference": "82b6c62b959f642d000456f08c6d219d749215b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/648bfaca6a494f3e22378123bcee2894045dc9d8", - "reference": "648bfaca6a494f3e22378123bcee2894045dc9d8", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/82b6c62b959f642d000456f08c6d219d749215b3", + "reference": "82b6c62b959f642d000456f08c6d219d749215b3", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "~1.8" }, "type": "library", "autoload": { @@ -6029,7 +6161,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.19" + "source": "https://github.com/symfony/filesystem/tree/v6.2.7" }, "funding": [ { @@ -6045,20 +6177,20 @@ "type": "tidelift" } ], - "time": "2023-01-14T19:14:44+00:00" + "time": "2023-02-14T08:44:56+00:00" }, { "name": "symfony/finder", - "version": "v5.4.19", + "version": "v5.4.21", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "6071aebf810ad13fe8200c224f36103abb37cf1f" + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/6071aebf810ad13fe8200c224f36103abb37cf1f", - "reference": "6071aebf810ad13fe8200c224f36103abb37cf1f", + "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19", + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19", "shasum": "" }, "require": { @@ -6092,7 +6224,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.19" + "source": "https://github.com/symfony/finder/tree/v5.4.21" }, "funding": [ { @@ -6108,20 +6240,20 @@ "type": "tidelift" } ], - "time": "2023-01-14T19:14:44+00:00" + "time": "2023-02-16T09:33:00+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.20", + "version": "v5.4.22", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "d0435363362a47c14e9cf50663cb8ffbf491875a" + "reference": "05cd1acdd0e3ce8473aaba1d86c188321d85f313" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0435363362a47c14e9cf50663cb8ffbf491875a", - "reference": "d0435363362a47c14e9cf50663cb8ffbf491875a", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/05cd1acdd0e3ce8473aaba1d86c188321d85f313", + "reference": "05cd1acdd0e3ce8473aaba1d86c188321d85f313", "shasum": "" }, "require": { @@ -6168,7 +6300,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.20" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.22" }, "funding": [ { @@ -6184,20 +6316,20 @@ "type": "tidelift" } ], - "time": "2023-01-29T11:11:52+00:00" + "time": "2023-03-28T07:28:17+00:00" }, { "name": "symfony/mime", - "version": "v5.4.19", + "version": "v5.4.21", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "a858429a9c704edc53fe057228cf9ca282ba48eb" + "reference": "ef57d9fb9cdd5e6b2ffc567d109865d10b6920cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/a858429a9c704edc53fe057228cf9ca282ba48eb", - "reference": "a858429a9c704edc53fe057228cf9ca282ba48eb", + "url": "https://api.github.com/repos/symfony/mime/zipball/ef57d9fb9cdd5e6b2ffc567d109865d10b6920cd", + "reference": "ef57d9fb9cdd5e6b2ffc567d109865d10b6920cd", "shasum": "" }, "require": { @@ -6252,7 +6384,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.19" + "source": "https://github.com/symfony/mime/tree/v5.4.21" }, "funding": [ { @@ -6268,7 +6400,7 @@ "type": "tidelift" } ], - "time": "2023-01-09T05:43:46+00:00" + "time": "2023-02-21T19:46:44+00:00" }, { "name": "symfony/polyfill-ctype", @@ -7006,16 +7138,16 @@ }, { "name": "symfony/process", - "version": "v5.4.19", + "version": "v5.4.22", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "c5ba874c9b636dbccf761e22ce750e88ec3f55e1" + "reference": "4b850da0cc3a2a9181c1ed407adbca4733dc839b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c5ba874c9b636dbccf761e22ce750e88ec3f55e1", - "reference": "c5ba874c9b636dbccf761e22ce750e88ec3f55e1", + "url": "https://api.github.com/repos/symfony/process/zipball/4b850da0cc3a2a9181c1ed407adbca4733dc839b", + "reference": "4b850da0cc3a2a9181c1ed407adbca4733dc839b", "shasum": "" }, "require": { @@ -7048,7 +7180,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.19" + "source": "https://github.com/symfony/process/tree/v5.4.22" }, "funding": [ { @@ -7064,20 +7196,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-03-06T21:29:33+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.2.0", + "version": "v3.2.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75" + "reference": "a8c9cedf55f314f3a186041d19537303766df09a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75", - "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", + "reference": "a8c9cedf55f314f3a186041d19537303766df09a", "shasum": "" }, "require": { @@ -7133,7 +7265,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" }, "funding": [ { @@ -7149,20 +7281,20 @@ "type": "tidelift" } ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-03-01T10:32:47+00:00" }, { "name": "symfony/string", - "version": "v5.4.19", + "version": "v5.4.22", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "0a01071610fd861cc160dfb7e2682ceec66064cb" + "reference": "8036a4c76c0dd29e60b6a7cafcacc50cf088ea62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/0a01071610fd861cc160dfb7e2682ceec66064cb", - "reference": "0a01071610fd861cc160dfb7e2682ceec66064cb", + "url": "https://api.github.com/repos/symfony/string/zipball/8036a4c76c0dd29e60b6a7cafcacc50cf088ea62", + "reference": "8036a4c76c0dd29e60b6a7cafcacc50cf088ea62", "shasum": "" }, "require": { @@ -7219,7 +7351,95 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.19" + "source": "https://github.com/symfony/string/tree/v5.4.22" + }, + "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": "2023-03-14T06:11:53+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.2.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d37ab6787be2db993747b6218fcc96e8e3bb4bd0", + "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.2.8" }, "funding": [ { @@ -7235,32 +7455,31 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-03-29T21:42:15+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.19", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "71c05db20cb9b54d381a28255f17580e2b7e36a5" + "reference": "e8e6a1d59e050525f27a1f530aa9703423cb7f57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/71c05db20cb9b54d381a28255f17580e2b7e36a5", - "reference": "71c05db20cb9b54d381a28255f17580e2b7e36a5", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e8e6a1d59e050525f27a1f530aa9703423cb7f57", + "reference": "e8e6a1d59e050525f27a1f530aa9703423cb7f57", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.1", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<5.3" + "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^5.3|^6.0" + "symfony/console": "^5.4|^6.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -7294,7 +7513,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.19" + "source": "https://github.com/symfony/yaml/tree/v6.2.7" }, "funding": [ { @@ -7310,20 +7529,20 @@ "type": "tidelift" } ], - "time": "2023-01-10T18:51:14+00:00" + "time": "2023-02-16T09:57:23+00:00" }, { "name": "thecodingmachine/safe", - "version": "v2.4.0", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/thecodingmachine/safe.git", - "reference": "e788f3d09dcd36f806350aedb77eac348fafadd3" + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/e788f3d09dcd36f806350aedb77eac348fafadd3", - "reference": "e788f3d09dcd36f806350aedb77eac348fafadd3", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", "shasum": "" }, "require": { @@ -7447,9 +7666,9 @@ "description": "PHP core functions that throw exceptions instead of returning FALSE on error", "support": { "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v2.4.0" + "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" }, - "time": "2022-10-07T14:02:17+00:00" + "time": "2023-04-05T11:54:14+00:00" }, { "name": "theseer/tokenizer", @@ -7501,6 +7720,64 @@ ], "time": "2021-07-28T10:34:58+00:00" }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, { "name": "weew/helpers-array", "version": "v1.3.1", @@ -7745,16 +8022,16 @@ }, { "name": "pdepend/pdepend", - "version": "2.12.1", + "version": "2.13.0", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "7a892d56ceafd804b4a2ecc85184640937ce9e84" + "reference": "31be7cd4f305f3f7b52af99c1cb13fc938d1cfad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/7a892d56ceafd804b4a2ecc85184640937ce9e84", - "reference": "7a892d56ceafd804b4a2ecc85184640937ce9e84", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/31be7cd4f305f3f7b52af99c1cb13fc938d1cfad", + "reference": "31be7cd4f305f3f7b52af99c1cb13fc938d1cfad", "shasum": "" }, "require": { @@ -7790,7 +8067,7 @@ "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/2.12.1" + "source": "https://github.com/pdepend/pdepend/tree/2.13.0" }, "funding": [ { @@ -7798,7 +8075,7 @@ "type": "tidelift" } ], - "time": "2022-09-08T19:30:37+00:00" + "time": "2023-02-28T20:56:15+00:00" }, { "name": "php-coveralls/php-coveralls", @@ -8086,16 +8363,16 @@ }, { "name": "symfony/config", - "version": "v6.2.5", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "f31b3c78a3650157188a240695e688d6a182aa91" + "reference": "249271da6f545d6579e0663374f8249a80be2893" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/f31b3c78a3650157188a240695e688d6a182aa91", - "reference": "f31b3c78a3650157188a240695e688d6a182aa91", + "url": "https://api.github.com/repos/symfony/config/zipball/249271da6f545d6579e0663374f8249a80be2893", + "reference": "249271da6f545d6579e0663374f8249a80be2893", "shasum": "" }, "require": { @@ -8143,7 +8420,7 @@ "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/v6.2.5" + "source": "https://github.com/symfony/config/tree/v6.2.7" }, "funding": [ { @@ -8159,20 +8436,20 @@ "type": "tidelift" } ], - "time": "2023-01-09T04:38:22+00:00" + "time": "2023-02-14T08:44:56+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.2.6", + "version": "v6.2.8", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "2a6dd148589b9db59717db8b75f8d9fbb2ae714f" + "reference": "b6195feacceb88fc58a02b69522b569e4c6188ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2a6dd148589b9db59717db8b75f8d9fbb2ae714f", - "reference": "2a6dd148589b9db59717db8b75f8d9fbb2ae714f", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b6195feacceb88fc58a02b69522b569e4c6188ac", + "reference": "b6195feacceb88fc58a02b69522b569e4c6188ac", "shasum": "" }, "require": { @@ -8180,7 +8457,7 @@ "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.1|^3", "symfony/service-contracts": "^1.1.6|^2.0|^3.0", - "symfony/var-exporter": "^6.2" + "symfony/var-exporter": "^6.2.7" }, "conflict": { "ext-psr": "<1.1|>=2", @@ -8230,7 +8507,7 @@ "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/v6.2.6" + "source": "https://github.com/symfony/dependency-injection/tree/v6.2.8" }, "funding": [ { @@ -8246,20 +8523,20 @@ "type": "tidelift" } ], - "time": "2023-01-30T15:46:28+00:00" + "time": "2023-03-30T13:35:57+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.2.5", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6" + "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/00b6ac156aacffc53487c930e0ab14587a6607f6", - "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", + "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", "shasum": "" }, "require": { @@ -8292,7 +8569,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.2.5" + "source": "https://github.com/symfony/stopwatch/tree/v6.2.7" }, "funding": [ { @@ -8308,20 +8585,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:36:55+00:00" + "time": "2023-02-14T08:44:56+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.2.5", + "version": "v6.2.8", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "108f9c6451eea8e04a7fb83bbacb5b812ef30e35" + "reference": "8302bb670204500d492c6b8c595ee9a27da62cd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/108f9c6451eea8e04a7fb83bbacb5b812ef30e35", - "reference": "108f9c6451eea8e04a7fb83bbacb5b812ef30e35", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8302bb670204500d492c6b8c595ee9a27da62cd6", + "reference": "8302bb670204500d492c6b8c595ee9a27da62cd6", "shasum": "" }, "require": { @@ -8361,12 +8638,12 @@ "export", "hydrate", "instantiate", - "lazy loading", + "lazy-loading", "proxy", "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.2.5" + "source": "https://github.com/symfony/var-exporter/tree/v6.2.8" }, "funding": [ { @@ -8382,7 +8659,7 @@ "type": "tidelift" } ], - "time": "2023-01-13T08:35:57+00:00" + "time": "2023-03-14T15:48:45+00:00" } ], "aliases": [], diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php index 832a43978..1e5abfc80 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php @@ -8,158 +8,129 @@ namespace tests\unit\Magento\FunctionalTestFramework\Allure; use Magento\FunctionalTestingFramework\Allure\AllureHelper; -use Magento\FunctionalTestingFramework\Allure\Event\AddUniqueAttachmentEvent; -use Magento\FunctionalTestingFramework\ObjectManager; use PHPUnit\Framework\TestCase; -use ReflectionProperty; -use Yandex\Allure\Adapter\Allure; -use Yandex\Allure\Adapter\AllureException; -use Yandex\Allure\Adapter\Event\StepFinishedEvent; -use Yandex\Allure\Adapter\Event\StepStartedEvent; -use Yandex\Allure\Adapter\Model\Attachment; +use Qameta\Allure\Allure; +use Qameta\Allure\Io\DataSourceFactory; +use Qameta\Allure\Model\AttachmentResult; +use Qameta\Allure\Model\ResultFactoryInterface; +use Qameta\Allure\Setup\LifecycleBuilderInterface; +use const STDOUT; +/** + * @covers \Qameta\Allure\Allure + */ class AllureHelperTest extends TestCase { - private const MOCK_FILENAME = 'filename'; - - /** - * The AddAttachmentToStep should add an attachment to the current step. - * - * @return void - * @throws AllureException - */ - public function testAddAttachmentToStep(): void + public function setUp(): void { - $expectedData = 'string'; - $expectedCaption = 'caption'; - $this->mockAttachmentWriteEvent($expectedData, $expectedCaption); - - //Prepare Allure lifecycle - Allure::lifecycle()->fire(new StepStartedEvent('firstStep')); - - //Call function - AllureHelper::addAttachmentToCurrentStep($expectedData, $expectedCaption); - - // Assert Attachment is created as expected - $step = Allure::lifecycle()->getStepStorage()->pollLast(); - $expectedAttachment = new Attachment($expectedCaption, self::MOCK_FILENAME, null); - $this->assertEquals($step->getAttachments()[0], $expectedAttachment); + Allure::reset(); } /** - * The AddAttachmentToLastStep should add an attachment only to the last step. - * - * @return void - * @throws AllureException + * @dataProvider providerAttachmentProperties */ - public function testAddAttachmentToLastStep(): void - { - $expectedData = 'string'; - $expectedCaption = 'caption'; - $this->mockAttachmentWriteEvent($expectedData, $expectedCaption); - - //Prepare Allure lifecycle - Allure::lifecycle()->fire(new StepStartedEvent('firstStep')); - Allure::lifecycle()->fire(new StepFinishedEvent('firstStep')); - Allure::lifecycle()->fire(new StepStartedEvent('secondStep')); - Allure::lifecycle()->fire(new StepFinishedEvent('secondStep')); - - //Call function - AllureHelper::addAttachmentToLastStep($expectedData, $expectedCaption); - - //Continue Allure lifecycle - Allure::lifecycle()->fire(new StepStartedEvent('thirdStep')); - Allure::lifecycle()->fire(new StepFinishedEvent('thirdStep')); - - // Assert Attachment is created as expected on the right step - $rootStep = Allure::lifecycle()->getStepStorage()->pollLast(); - - $firstStep = $rootStep->getSteps()[0]; - $secondStep = $rootStep->getSteps()[1]; - $thirdStep = $rootStep->getSteps()[2]; - - $expectedAttachment = new Attachment($expectedCaption, self::MOCK_FILENAME, null); - $this->assertEmpty($firstStep->getAttachments()); - $this->assertEquals($secondStep->getAttachments()[0], $expectedAttachment); - $this->assertEmpty($thirdStep->getAttachments()); + public function testDoAddAttachmentMethod( + string $name, + $type, + ?string $fileExtension, + ): void { + $attachment = new AttachmentResult('a'); + Allure::setLifecycleBuilder( + $this->createLifecycleBuilder($this->createResultFactoryWithAttachment($attachment)), + ); + + AllureHelper::doAddAttachment( + DataSourceFactory::fromFile('test'), + 'nameOfTheFile', + 'typeOfTheFile', + $fileExtension + ); + self::assertSame('nameOfTheFile', $attachment->getName()); + self::assertSame('typeOfTheFile', $attachment->getType()); } /** - * The AddAttachment actions should have files with different attachment names. - * - * @return void - * @throws AllureException + * @dataProvider providerAttachmentProperties */ - public function testAddAttachmentUniqueName(): void - { - $expectedData = 'string'; - $expectedCaption = 'caption'; - - //Prepare Allure lifecycle - Allure::lifecycle()->fire(new StepStartedEvent('firstStep')); - - //Call function twice - AllureHelper::addAttachmentToCurrentStep($expectedData, $expectedCaption); - AllureHelper::addAttachmentToCurrentStep($expectedData, $expectedCaption); - - // Assert file names for both attachments are not the same. - $step = Allure::lifecycle()->getStepStorage()->pollLast(); - $attachmentOne = $step->getAttachments()[0]->getSource(); - $attachmentTwo = $step->getAttachments()[1]->getSource(); - $this->assertNotEquals($attachmentOne, $attachmentTwo); + public function testAddAttachmentToStep( + string $name, + ?string $type, + ?string $fileExtension, + ): void { + $attachment = new AttachmentResult('a'); + Allure::setLifecycleBuilder( + $this->createLifecycleBuilder($this->createResultFactoryWithAttachment($attachment)), + ); + + Allure::attachment($name, 'nameOfTheFile', $type, $fileExtension); + self::assertSame($name, $attachment->getName()); + self::assertSame($type, $attachment->getType()); + self::assertSame($fileExtension, $attachment->getFileExtension()); } /** - * Clear Allure Lifecycle. - * - * @return void + * @dataProvider providerAttachmentProperties */ - protected function tearDown(): void - { - Allure::setDefaultLifecycle(); - - $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); - $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue(null); + public function testAddAttachmentFileToStep( + string $name, + ?string $type, + ?string $fileExtension, + ): void { + $attachment = new AttachmentResult('a'); + Allure::setLifecycleBuilder( + $this->createLifecycleBuilder($this->createResultFactoryWithAttachment($attachment)), + ); + + Allure::attachmentFile($name, 'b', $type, '.html'); + self::assertSame('c', $attachment->getName()); + self::assertSame('.html', $attachment->getFileExtension()); } /** - * Mock entire attachment writing mechanisms. - * - * @param string $filePathOrContents - * @param string $caption - * - * @return void + * @return iterable<string, array{string, string|null, string|null}> */ - private function mockAttachmentWriteEvent(string $filePathOrContents, string $caption): void + public static function providerAttachmentProperties(): iterable { - $mockInstance = $this->getMockBuilder(AddUniqueAttachmentEvent::class) - ->setConstructorArgs([$filePathOrContents, $caption]) - ->disallowMockingUnknownTypes() - ->onlyMethods(['getAttachmentFileName']) - ->getMock(); - - $mockInstance - ->method('getAttachmentFileName') - ->willReturn(self::MOCK_FILENAME); + return [ + 'Only name' => ['c', null, null], + 'Name and type' => ['c', 'd', null], + 'Name and file extension' => ['c', null, 'd'], + 'Name, type and file extension' => ['c', 'd', 'e'], + ]; + } - $objectManagerMockInstance = $this->createMock(ObjectManager::class); - $objectManagerMockInstance - ->method('create') - ->will( - $this->returnCallback( - function (string $class) use ($mockInstance) { - if ($class === AddUniqueAttachmentEvent::class) { - return $mockInstance; - } + private function createResultFactoryWithAttachment(AttachmentResult $attachment): ResultFactoryInterface + { + $resultFactory = $this->createStub(ResultFactoryInterface::class); + $resultFactory + ->method('createAttachment') + ->willReturn($attachment); - return null; - } - ) - ); + return $resultFactory; + } - $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); - $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue($objectManagerMockInstance, $objectManagerMockInstance); + private function createLifecycleBuilder( + ?ResultFactoryInterface $resultFactory = null, + ?AllureLifecycleInterface $lifecycle = null, + ?StatusDetectorInterface $statusDetector = null, + ): LifecycleBuilderInterface { + $builder = $this->createStub(LifecycleBuilderInterface::class); + if (isset($resultFactory)) { + $builder + ->method('getResultFactory') + ->willReturn($resultFactory); + } + if (isset($lifecycle)) { + $builder + ->method('createLifecycle') + ->willReturn($lifecycle); + } + if (isset($statusDetector)) { + $builder + ->method('getStatusDetector') + ->willReturn($statusDetector); + } + + return $builder; } } diff --git a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt index 116eff358..19829daa2 100644 --- a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt +++ b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt @@ -120,7 +120,7 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject //Access private TestResultObject to find stack and if there are any errors (as opposed to failures) $testResultObject = call_user_func(\Closure::bind( function () use ($cest) { - return $cest->getTestResultObject(); + return $cest->getResultAggregator(); }, $cest )); @@ -128,7 +128,7 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject if (!empty($errors)) { foreach ($errors as $error) { - if ($error->failedTest()->getTestMethod() == $cest->getName()) { + if ($error->getTest()->getTestMethod() == $cest->getName()) { // Do not attempt to run _after if failure was in the _after block // Try to run _after but catch exceptions to prevent them from overwriting original failure. print("LAST TEST IN SUITE FAILED, TEST AFTER MAY NOT BE SUCCESSFUL\n"); diff --git a/dev/tests/verification/Resources/functionalSuiteHooks.txt b/dev/tests/verification/Resources/functionalSuiteHooks.txt index 243b7fecf..5c4a8f594 100644 --- a/dev/tests/verification/Resources/functionalSuiteHooks.txt +++ b/dev/tests/verification/Resources/functionalSuiteHooks.txt @@ -122,7 +122,7 @@ class functionalSuiteHooks extends \Codeception\GroupObject //Access private TestResultObject to find stack and if there are any errors (as opposed to failures) $testResultObject = call_user_func(\Closure::bind( function () use ($cest) { - return $cest->getTestResultObject(); + return $cest->getResultAggregator(); }, $cest )); @@ -130,7 +130,7 @@ class functionalSuiteHooks extends \Codeception\GroupObject if (!empty($errors)) { foreach ($errors as $error) { - if ($error->failedTest()->getTestMethod() == $cest->getName()) { + if ($error->getTest()->getTestMethod() == $cest->getName()) { // Do not attempt to run _after if failure was in the _after block // Try to run _after but catch exceptions to prevent them from overwriting original failure. print("LAST TEST IN SUITE FAILED, TEST AFTER MAY NOT BE SUCCESSFUL\n"); diff --git a/dev/tests/verification/Resources/functionalSuiteWithComments.txt b/dev/tests/verification/Resources/functionalSuiteWithComments.txt index 186a2ae63..7e9bd6ba1 100644 --- a/dev/tests/verification/Resources/functionalSuiteWithComments.txt +++ b/dev/tests/verification/Resources/functionalSuiteWithComments.txt @@ -106,7 +106,7 @@ class functionalSuiteWithComments extends \Codeception\GroupObject //Access private TestResultObject to find stack and if there are any errors (as opposed to failures) $testResultObject = call_user_func(\Closure::bind( function () use ($cest) { - return $cest->getTestResultObject(); + return $cest->getResultAggregator(); }, $cest )); @@ -114,7 +114,7 @@ class functionalSuiteWithComments extends \Codeception\GroupObject if (!empty($errors)) { foreach ($errors as $error) { - if ($error->failedTest()->getTestMethod() == $cest->getName()) { + if ($error->getTest()->getTestMethod() == $cest->getName()) { // Do not attempt to run _after if failure was in the _after block // Try to run _after but catch exceptions to prevent them from overwriting original failure. print("LAST TEST IN SUITE FAILED, TEST AFTER MAY NOT BE SUCCESSFUL\n"); diff --git a/etc/config/codeception.dist.yml b/etc/config/codeception.dist.yml index 30697dc8f..54858dd6a 100755 --- a/etc/config/codeception.dist.yml +++ b/etc/config/codeception.dist.yml @@ -7,6 +7,7 @@ paths: data: tests/_data support: src/Magento/FunctionalTestingFramework envs: etc/_envs + output: tests/_output settings: silent: true colors: true @@ -15,9 +16,9 @@ extensions: enabled: - Magento\FunctionalTestingFramework\Codeception\Subscriber\Console - Magento\FunctionalTestingFramework\Extension\TestContextExtension - - Magento\FunctionalTestingFramework\Allure\Adapter\MagentoAllureAdapter + - Qameta\Allure\Codeception\AllureCodeception config: - Magento\FunctionalTestingFramework\Allure\Adapter\MagentoAllureAdapter: + Qameta\Allure\Codeception\AllureCodeception: deletePreviousResults: false outputDirectory: allure-results ignoredAnnotations: @@ -27,4 +28,4 @@ extensions: Magento\FunctionalTestingFramework\Extension\TestContextExtension: driver: \Magento\FunctionalTestingFramework\Module\MagentoWebDriver params: - - .env \ No newline at end of file + - .env diff --git a/etc/config/functional.suite.dist.yml b/etc/config/functional.suite.dist.yml index d7809bfcb..da6d45411 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -7,7 +7,7 @@ # Perform tests in browser using the WebDriver or PhpBrowser. # If you need both WebDriver and PHPBrowser tests - create a separate suite. -class_name: AcceptanceTester +actor: AcceptanceTester namespace: Magento\FunctionalTestingFramework modules: enabled: @@ -27,9 +27,9 @@ modules: window_size: 1280x1024 username: "%MAGENTO_ADMIN_USERNAME%" password: "%MAGENTO_ADMIN_PASSWORD%" - pageload_timeout: "%WAIT_TIMEOUT%" - request_timeout: "%WAIT_TIMEOUT%" - connection_timeout: "%WAIT_TIMEOUT%" + pageload_timeout: "30" + request_timeout: "30" + connection_timeout: "30" host: "%SELENIUM_HOST%" port: "%SELENIUM_PORT%" protocol: "%SELENIUM_PROTOCOL%" diff --git a/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php b/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php index cc0251a48..8f7699ed0 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php +++ b/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php @@ -7,10 +7,8 @@ namespace Magento\FunctionalTestingFramework\Allure; -use Magento\FunctionalTestingFramework\Allure\Event\AddUniqueAttachmentEvent; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; -use Yandex\Allure\Adapter\Allure; -use Yandex\Allure\Adapter\AllureException; +use Qameta\Allure\Allure; +use Qameta\Allure\Io\DataSourceInterface; class AllureHelper { @@ -21,19 +19,17 @@ class AllureHelper * @param string $caption * * @return void - * @throws AllureException */ public static function addAttachmentToCurrentStep($data, $caption): void { - /** @var AddUniqueAttachmentEvent $event */ - $event = ObjectManagerFactory::getObjectManager()->create( - AddUniqueAttachmentEvent::class, - [ - 'filePathOrContents' => $data, - 'caption' => $caption - ] - ); - Allure::lifecycle()->fire($event); + if (!is_string($data)) { + $data = serialize($data); + } + if (@file_exists($data) && is_file($data)) { + Allure::attachmentFile($caption, $data); + } else { + Allure::attachment($caption, $data); + } } /** @@ -47,22 +43,35 @@ public static function addAttachmentToCurrentStep($data, $caption): void */ public static function addAttachmentToLastStep($data, $caption): void { - $rootStep = Allure::lifecycle()->getStepStorage()->getLast(); - $trueLastStep = array_last($rootStep->getSteps()); - - if ($trueLastStep === null) { - // Nothing to attach to; do not fire off allure event - return; + if (!is_string($data)) { + $data = serialize($data); + } + if (@file_exists($data) && is_file($data)) { + Allure::attachmentFile($caption, $data); + } else { + Allure::attachment($caption, $data); } + } - /** @var AddUniqueAttachmentEvent $attachmentEvent */ - $attachmentEvent = ObjectManagerFactory::getObjectManager()->create( - AddUniqueAttachmentEvent::class, - [ - 'filePathOrContents' => $data, - 'caption' => $caption - ] - ); - $attachmentEvent->process($trueLastStep); + /** + * @param DataSourceInterface $dataSource + * @param string $name + * @param string|null $type + * @param string|null $fileExtension + * @return void + */ + public static function doAddAttachment( + DataSourceInterface $dataSource, + string $name, + ?string $type = null, + ?string $fileExtension = null, + ): void { + $attachment = Allure::getConfig() + ->getResultFactory() + ->createAttachment() + ->setName($name) + ->setType($type) + ->setFileExtension($fileExtension); + Allure::getLifecycle()->addAttachment($attachment, $dataSource); } } diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php b/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php index 961f68440..fc80483ec 100644 --- a/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php +++ b/src/Magento/FunctionalTestingFramework/Codeception/Subscriber/Console.php @@ -70,9 +70,11 @@ public function __construct($extensionOptions = [], $options = []) * @return void * @throws \Exception */ - public function startTest(TestEvent $e) + public function startTest(TestEvent $e): void { - $test = $e->getTest()->getTestClass(); + $test = $e->getTest(); + $testReflection = new \ReflectionClass($test); + try { $testReflection = new \ReflectionClass($test); $isDeprecated = preg_match_all(self::DEPRECATED_NOTICE, $testReflection->getDocComment(), $match); @@ -99,7 +101,7 @@ public function startTest(TestEvent $e) * @param StepEvent $e * @return void */ - public function beforeStep(StepEvent $e) + public function beforeStep(StepEvent $e): void { if ($this->silent or !$this->steps or !$e->getTest() instanceof ScenarioDriven) { return; @@ -162,7 +164,7 @@ private function printStepKeys(Step $step) return; // don't print empty comments } - $stepKey = $this->retrieveStepKey($step->getLine()); + $stepKey = $this->retrieveStepKey($step); $isActionGroup = (strpos($step->__toString(), ActionGroupObject::ACTION_GROUP_CONTEXT_START) !== false); if ($isActionGroup) { @@ -220,13 +222,14 @@ private function message($string = '') /** * Reading stepKey from file. * - * @param string $stepLine + * @param Step $step * @return string|null */ - private function retrieveStepKey($stepLine) + private function retrieveStepKey(Step $step) { $stepKey = null; - list($filePath, $stepLine) = explode(":", $stepLine); + $stepLine = $step->getLineNumber(); + $filePath = $step->getFilePath(); $stepLine = $stepLine - 1; if (!array_key_exists($filePath, $this->testFiles)) { diff --git a/src/Magento/FunctionalTestingFramework/Console/CodeceptRunCommand.php b/src/Magento/FunctionalTestingFramework/Console/CodeceptRunCommand.php index de16bad84..35e5ddc36 100644 --- a/src/Magento/FunctionalTestingFramework/Console/CodeceptRunCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/CodeceptRunCommand.php @@ -20,7 +20,7 @@ class CodeceptRunCommand extends Run * * @return void */ - protected function configure() + protected function configure():void { $this->setName('codecept:run') ->setDescription( diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/OperationDefinitionObject.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/OperationDefinitionObject.php index ff84c0959..ab5879301 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/OperationDefinitionObject.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/OperationDefinitionObject.php @@ -167,7 +167,7 @@ public function __construct( $this->operation = $operation; $this->dataType = $dataType; $this->apiMethod = $apiMethod; - $this->apiUri = trim($apiUri, '/'); + $this->apiUri = trim($apiUri ?? '', '/'); $this->auth = $auth; $this->headers = $headers; $this->params = $params; diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index 19e1edc29..dfccad88a 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -7,8 +7,18 @@ namespace Magento\FunctionalTestingFramework\Extension; use Codeception\Events; +use Codeception\Step; use Magento\FunctionalTestingFramework\Allure\AllureHelper; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; +use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; +use Qameta\Allure\Allure; +use Qameta\Allure\Model\StepResult; +use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; +use Magento\FunctionalTestingFramework\Test\Objects\ActionGroupObject; +use Magento\FunctionalTestingFramework\Util\TestGenerator; +use Qameta\Allure\Model\TestResult; +use Qameta\Allure\Model\Status; +use Magento\FunctionalTestingFramework\Codeception\Subscriber\Console; /** * Class TestContextExtension @@ -17,6 +27,28 @@ */ class TestContextExtension extends BaseExtension { + private const STEP_PASSED = "passed"; + + /** + * Test files cache. + * + * @var array + */ + private $testFiles = []; + + /** + * Action group step key. + * + * @var null|string + */ + private $actionGroupStepKey = null; + + /** + * Boolean value to indicate if steps are invisible steps + * + * @var boolean + */ + private $atInvisibleSteps = false; const TEST_PHASE_AFTER = "_after"; const TEST_PHASE_BEFORE = "_before"; @@ -44,7 +76,7 @@ class TestContextExtension extends BaseExtension * @return void * @throws \Exception */ - public function _initialize() + public function _initialize(): void { $events = [ Events::TEST_START => 'testStart', @@ -95,7 +127,7 @@ public function testEnd(\Codeception\Event\TestEvent $e) //Access private TestResultObject to find stack and if there are any errors/failures $testResultObject = call_user_func(\Closure::bind( function () use ($cest) { - return $cest->getTestResultObject(); + return $cest->getResultAggregator(); }, $cest )); @@ -103,8 +135,8 @@ function () use ($cest) { // check for errors in all test hooks and attach in allure if (!empty($testResultObject->errors())) { foreach ($testResultObject->errors() as $error) { - if ($error->failedTest()->getTestMethod() === $cest->getTestMethod()) { - $this->attachExceptionToAllure($error->thrownException(), $cest->getTestMethod()); + if ($error->getTest()->getTestMethod() === $cest->getTestMethod()) { + $this->attachExceptionToAllure($error->getFail(), $cest->getTestMethod()); } } } @@ -112,13 +144,86 @@ function () use ($cest) { // check for failures in all test hooks and attach in allure if (!empty($testResultObject->failures())) { foreach ($testResultObject->failures() as $failure) { - if ($failure->failedTest()->getTestMethod() === $cest->getTestMethod()) { - $this->attachExceptionToAllure($failure->thrownException(), $cest->getTestMethod()); + if ($failure->getTest()->getTestMethod() === $cest->getTestMethod()) { + $this->attachExceptionToAllure($failure->getFail(), $cest->getTestMethod()); } } } // Reset Session and Cookies after all Test Runs, workaround due to functional.suite.yml restart: true $this->getDriver()->_runAfter($e->getTest()); + + $lifecycle = Allure::getLifecycle(); + $lifecycle->updateTest( + function (TestResult $testResult) { + $this->getFormattedSteps($testResult); + } + ); + } + + /** + * @param TestResult $testResult + * @return void + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) + * Revisited to reduce cyclomatic complexity, left unrefactored for readability + */ + private function getFormattedSteps(TestResult $testResult): void + { + $steps = $testResult->getSteps(); + $formattedSteps = []; + $actionGroupKey = null; + foreach ($steps as $key => $step) { + if (str_contains($step->getName(), 'start before hook') + || str_contains($step->getName(), 'end before hook') + || str_contains($step->getName(), 'start after hook') + || str_contains($step->getName(), 'end after hook') + ) { + $step->setName(strtoupper($step->getName())); + } + // Remove all parameters from step because parameters already added in formatted step + call_user_func(\Closure::bind( + function () use ($step) { + $step->parameters = []; + }, + null, + $step + )); + if (strpos($step->getName(), ActionGroupObject::ACTION_GROUP_CONTEXT_START) !== false) { + $step->setName(str_replace(ActionGroupObject::ACTION_GROUP_CONTEXT_START, '', $step->getName())); + $actionGroupKey = $key; + $formattedSteps[$actionGroupKey] = $step; + continue; + } + if (stripos($step->getName(), ActionGroupObject::ACTION_GROUP_CONTEXT_END) !== false) { + $actionGroupKey = null; + continue; + } + if ($actionGroupKey !== null) { + if ($step->getName() !== null) { + $formattedSteps[$actionGroupKey]->addSteps($step); + if ($step->getStatus()->jsonSerialize() !== self::STEP_PASSED) { + $formattedSteps[$actionGroupKey]->setStatus($step->getStatus()); + $actionGroupKey = null; + } + } + } else { + if ($step->getName() !== null) { + $formattedSteps[$key] = $step; + } + } + } + /** @var StepResult[] $formattedSteps*/ + $formattedSteps = array_values($formattedSteps); + + // No public function for setting the testResult steps + call_user_func(\Closure::bind( + function () use ($testResult, $formattedSteps) { + $testResult->steps = $formattedSteps; + }, + null, + $testResult + )); } /** @@ -170,7 +275,6 @@ public function attachExceptionToAllure($exception, $testMethod) return $this->getPrevious(); } }; - $previousException = $change->call($exception); if ($previousException !== null) { @@ -188,11 +292,87 @@ public function attachExceptionToAllure($exception, $testMethod) */ public function beforeStep(\Codeception\Event\StepEvent $e) { + if ($this->pageChanged($e->getStep())) { $this->getDriver()->cleanJsError(); } } + /** + * @param \Codeception\Event\StepEvent $e + * @return string|void + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) + * Revisited to reduce cyclomatic complexity, left unrefactored for readability + */ + public function stepName(\Codeception\Event\StepEvent $e) + { + $stepAction = $e->getStep()->getAction(); + if (in_array($stepAction, ActionObject::INVISIBLE_STEP_ACTIONS)) { + $this->atInvisibleSteps = true; + return; + } + // Set back atInvisibleSteps flag + if ($this->atInvisibleSteps && !in_array($stepAction, ActionObject::INVISIBLE_STEP_ACTIONS)) { + $this->atInvisibleSteps = false; + } + + //Hard set to 200; we don't expose this config in MFTF + $argumentsLength = 200; + $stepKey = null; + + if (!($e->getStep() instanceof Comment)) { + $stepKey = $this->retrieveStepKeyForAllure($e->getStep()); + $isActionGroup = ( + strpos( + $e->getStep()->__toString(), + ActionGroupObject::ACTION_GROUP_CONTEXT_START + ) !== false + ); + if ($isActionGroup) { + preg_match(TestGenerator::ACTION_GROUP_STEP_KEY_REGEX, $e->getStep()->__toString(), $matches); + if (!empty($matches['actionGroupStepKey'])) { + $this->actionGroupStepKey = ucfirst($matches['actionGroupStepKey']); + } + } + } + // DO NOT alter action if actionGroup is starting, need the exact actionGroup name for good logging + if (strpos($stepAction, ActionGroupObject::ACTION_GROUP_CONTEXT_START) === false + && !($e->getStep() instanceof Comment) + ) { + $stepAction = $e->getStep()->getHumanizedActionWithoutArguments(); + } + $stepArgs = $e->getStep()->getArgumentsAsString($argumentsLength); + if (!trim($stepAction)) { + $stepAction = $e->getStep()->getMetaStep()->getHumanizedActionWithoutArguments(); + $stepArgs = $e->getStep()->getMetaStep()->getArgumentsAsString($argumentsLength); + } + $stepName = ''; + + if (isset($stepName)) { + $stepName .= '[' . $stepKey . '] '; + if (empty($stepKey)) { + $stepName = ""; + } + } + $stepName .= $stepAction . ' ' . $stepArgs; + // Strip control characters so that report generation does not fail + $stepName = preg_replace('/[[:cntrl:]]/', '', $stepName); + if (stripos($stepName, "\mftf\helper")) { + preg_match("/\[(.*?)\]/", $stepName, $matches); + $stepKeyData = preg_split('/\s+/', ucwords($matches[1])); + if (count($stepKeyData) > 0) { + $this->actionGroupStepKey = (isset($this->actionGroupStepKey)) + ?$this->actionGroupStepKey + : ""; + $stepKeyHelper = str_replace($this->actionGroupStepKey, '', lcfirst(implode("", $stepKeyData))); + $stepName= '['.$stepKeyHelper.'] '.preg_replace('#\[.*\]#', '', $stepName); + } + } + return ucfirst($stepName); + } + /** * Codeception event listener function, triggered after step. * Calls ErrorLogger to log JS errors encountered. @@ -202,6 +382,13 @@ public function beforeStep(\Codeception\Event\StepEvent $e) */ public function afterStep(\Codeception\Event\StepEvent $e) { + $lifecycle = Allure::getLifecycle(); + $stepName = $this->stepName($e); + $lifecycle->updateStep( + function (StepResult $step) use ($stepName) { + $step->setName($stepName); + } + ); $browserLog = []; try { $browserLog = $this->getDriver()->webDriver->manage()->getLog("browser"); @@ -236,13 +423,13 @@ public function saveFailed(\Codeception\Event\PrintResultEvent $e) } foreach ($result->failures() as $fail) { - $output[] = $this->localizePath(\Codeception\Test\Descriptor::getTestFullName($fail->failedTest())); + $output[] = $this->localizePath(\Codeception\Test\Descriptor::getTestFullName($fail->getTest())); } foreach ($result->errors() as $fail) { - $output[] = $this->localizePath(\Codeception\Test\Descriptor::getTestFullName($fail->failedTest())); + $output[] = $this->localizePath(\Codeception\Test\Descriptor::getTestFullName($fail->getTest())); } - foreach ($result->notImplemented() as $fail) { - $output[] = $this->localizePath(\Codeception\Test\Descriptor::getTestFullName($fail->failedTest())); + foreach ($result->incomplete() as $fail) { + $output[] = $this->localizePath(\Codeception\Test\Descriptor::getTestFullName($fail->getTest())); } if (empty($output)) { @@ -265,4 +452,33 @@ protected function localizePath($path) } return $path; } + + /** + * Reading stepKey from file. + * + * @param Step $step + * @return string|null + */ + private function retrieveStepKeyForAllure(Step $step) + { + $stepKey = null; + $stepLine = $step->getLineNumber(); + $filePath = $step->getFilePath(); + $stepLine = $stepLine - 1; + + if (!array_key_exists($filePath, $this->testFiles)) { + $this->testFiles[$filePath] = explode(PHP_EOL, file_get_contents($filePath)); + } + + preg_match(TestGenerator::ACTION_STEP_KEY_REGEX, $this->testFiles[$filePath][$stepLine], $matches); + if (!empty($matches['stepKey'])) { + $stepKey = $matches['stepKey']; + } + if ($this->actionGroupStepKey !== null) { + $stepKey = str_replace($this->actionGroupStepKey, '', $stepKey); + } + + $stepKey = $stepKey === '[]' ? null : $stepKey; + return $stepKey; + } } diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoSequence.php b/src/Magento/FunctionalTestingFramework/Module/MagentoSequence.php index 6273965dd..36c76ab27 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoSequence.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoSequence.php @@ -16,7 +16,7 @@ */ class MagentoSequence extends Sequence { - protected $config = ['prefix' => '']; + protected array $config = ['prefix' => '']; } if (!function_exists('msq') && !function_exists('msqs')) { require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'Util' . DIRECTORY_SEPARATOR . 'msq.php'; diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 68e8d5064..54fecf7de 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -25,13 +25,9 @@ use Magento\FunctionalTestingFramework\Util\Path\UrlFormatter; use Magento\FunctionalTestingFramework\Util\ConfigSanitizerUtil; use Qameta\Allure\Allure; -use Yandex\Allure\Adapter\AllureException; use Magento\FunctionalTestingFramework\DataTransport\Protocol\CurlTransport; -use Yandex\Allure\Adapter\Support\AttachmentSupport; +use Qameta\Allure\Io\DataSourceFactory; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; -use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; -use Yandex\Allure\Adapter\Allure as YandexAllure; -use Yandex\Allure\Adapter\Event\AddAttachmentEvent; /** * MagentoWebDriver module provides common Magento web actions through Selenium WebDriver. @@ -57,7 +53,6 @@ */ class MagentoWebDriver extends WebDriver { - use AttachmentSupport; use Pause { pause as codeceptPause; } @@ -81,19 +76,6 @@ class MagentoWebDriver extends WebDriver '//div[contains(@class,"uploader")]//div[@class="file-row"]', ]; - /** - * The module required fields, to be set in the suite .yml configuration file. - * - * @var array - */ - protected $requiredFields = [ - 'url', - 'backend_name', - 'username', - 'password', - 'browser', - ]; - /** * Set all Locale variables to NULL. * @@ -151,9 +133,7 @@ class MagentoWebDriver extends WebDriver public function _initialize() { $this->config = ConfigSanitizerUtil::sanitizeWebDriverConfig($this->config); - Allure::getLifecycleConfigurator()->setOutputDirectory( - realpath(PROJECT_ROOT . '/dev/tests/acceptance/tests/_output/allure-results') - ); + parent::_initialize(); $this->cleanJsError(); } @@ -163,7 +143,7 @@ public function _initialize() * * @return void */ - public function _resetConfig() + public function _resetConfig():void { parent::_resetConfig(); $this->config = ConfigSanitizerUtil::sanitizeWebDriverConfig($this->config); @@ -229,14 +209,14 @@ public function _getUrl() * @throws ModuleException * @api */ - public function _getCurrentUri() + public function _getCurrentUri():string { $url = $this->webDriver->getCurrentURL(); if ($url === 'about:blank') { throw new ModuleException($this, 'Current url is blank, no page was opened'); } - return Uri::retrieveUri($url); + return Uri::retrieveUri((string)$url); } /** @@ -244,9 +224,8 @@ public function _getCurrentUri() * * @param string $url * @return void - * @throws AllureException */ - public function dontSeeCurrentUrlEquals($url) + public function dontSeeCurrentUrlEquals($url):void { $actualUrl = $this->webDriver->getCurrentURL(); $comparison = "Expected: $url\nActual: $actualUrl"; @@ -259,9 +238,8 @@ public function dontSeeCurrentUrlEquals($url) * * @param string $regex * @return void - * @throws AllureException */ - public function dontSeeCurrentUrlMatches($regex) + public function dontSeeCurrentUrlMatches($regex):void { $actualUrl = $this->webDriver->getCurrentURL(); $comparison = "Expected: $regex\nActual: $actualUrl"; @@ -274,9 +252,8 @@ public function dontSeeCurrentUrlMatches($regex) * * @param string $needle * @return void - * @throws AllureException */ - public function dontSeeInCurrentUrl($needle) + public function dontSeeInCurrentUrl($needle):void { $actualUrl = $this->webDriver->getCurrentURL(); $comparison = "Expected: $needle\nActual: $actualUrl"; @@ -290,7 +267,7 @@ public function dontSeeInCurrentUrl($needle) * @param string|null $regex * @return string */ - public function grabFromCurrentUrl($regex = null) + public function grabFromCurrentUrl($regex = null):string { $fullUrl = $this->webDriver->getCurrentURL(); if (!$regex) { @@ -313,9 +290,8 @@ public function grabFromCurrentUrl($regex = null) * * @param string $url * @return void - * @throws AllureException */ - public function seeCurrentUrlEquals($url) + public function seeCurrentUrlEquals($url):void { $actualUrl = $this->webDriver->getCurrentURL(); $comparison = "Expected: $url\nActual: $actualUrl"; @@ -328,9 +304,8 @@ public function seeCurrentUrlEquals($url) * * @param string $regex * @return void - * @throws AllureException */ - public function seeCurrentUrlMatches($regex) + public function seeCurrentUrlMatches($regex):void { $actualUrl = $this->webDriver->getCurrentURL(); $comparison = "Expected: $regex\nActual: $actualUrl"; @@ -343,9 +318,8 @@ public function seeCurrentUrlMatches($regex) * * @param string $needle * @return void - * @throws AllureException */ - public function seeInCurrentUrl($needle) + public function seeInCurrentUrl($needle):void { $actualUrl = $this->webDriver->getCurrentURL(); $comparison = "Expected: $needle\nActual: $actualUrl"; @@ -463,7 +437,7 @@ public function waitForPageLoad($timeout = null) public function waitForLoadingMaskToDisappear($timeout = null) { $timeout = $timeout ?? $this->_getConfig()['pageload_timeout']; - + foreach ($this->loadingMasksLocators as $maskLocator) { // Get count of elements found for looping. // Elements are NOT useful for interaction, as they cannot be fed to codeception actions. @@ -720,7 +694,7 @@ public function conditionalClick($selector, $dependentSelector, $visible) * @param string $selector * @return void */ - public function clearField($selector) + public function clearField($selector):void { $this->fillField($selector, ""); } @@ -770,7 +744,7 @@ public function _before(TestInterface $test) * @param integer $yOffset * @return void */ - public function dragAndDrop($source, $target, $xOffset = null, $yOffset = null) + public function dragAndDrop($source, $target, $xOffset = null, $yOffset = null):void { $snodes = $this->matchFirstOrFail($this->baseElement, $source); $tnodes = $this->matchFirstOrFail($this->baseElement, $target); @@ -798,7 +772,7 @@ public function dragAndDrop($source, $target, $xOffset = null, $yOffset = null) $action->release($tnodes)->perform(); } } - + /** * Simple rapid click as per given count number. * @@ -814,15 +788,15 @@ public function rapidClick($selector, $count) } } - /** - * Grabs a cookie attributes value. - * You can set additional cookie params like `domain`, `path` in array passed as last argument. - * If the cookie is set by an ajax request (XMLHttpRequest), - * there might be some delay caused by the browser, so try `$I->wait(0.1)`. - * @param string $cookie - * @param array $params - * @return mixed - */ + /** + * Grabs a cookie attributes value. + * You can set additional cookie params like `domain`, `path` in array passed as last argument. + * If the cookie is set by an ajax request (XMLHttpRequest), + * there might be some delay caused by the browser, so try `$I->wait(0.1)`. + * @param string $cookie + * @param array $params + * @return mixed + */ public function grabCookieAttributes(string $cookie, array $params = []): array { $params['name'] = $cookie; @@ -910,14 +884,20 @@ public function _failed(TestInterface $test, $fail) } if ($this->current_test === null) { - throw new \RuntimeException("Suite condition failure: \n" + throw new \RuntimeException("Suite condition failure: \n" . " Something went wrong with selenium server/chrome driver : \n . {$fail->getMessage()}\n{$fail->getTraceAsString()}"); } - YandexAllure::lifecycle() - ->fire(new AddAttachmentEvent($this->pngReport, $test->getMetadata()->getName() . '.png', 'image/png')); - YandexAllure::lifecycle() - ->fire(new AddAttachmentEvent($this->htmlReport, $test->getMetadata()->getName() . '.html', 'text/html')); + AllureHelper::doAddAttachment( + DataSourceFactory::fromFile($this->pngReport), + $test->getMetadata()->getName() . '.png', + 'image/png' + ); + AllureHelper::doAddAttachment( + DataSourceFactory::fromFile($this->htmlReport), + $test->getMetadata()->getName() . '.html', + 'text/html' + ); $this->debug("Failure due to : {$fail->getMessage()}"); $this->debug("Screenshot saved to {$this->pngReport}"); $this->debug("Html saved to {$this->htmlReport}"); @@ -948,7 +928,7 @@ public function saveScreenshot() * @return void * @throws \Exception */ - public function amOnPage($page) + public function amOnPage($page):void { (0 === strpos($page, 'http')) ? parent::amOnUrl($page) : parent::amOnPage($page); $this->waitForPageLoad(); @@ -1012,9 +992,8 @@ public function dontSeeJsError() * * @param string $name * @return void - * @throws AllureException */ - public function makeScreenshot($name = null) + public function makeScreenshot($name = null):void { if (empty($name)) { $name = uniqid(date("Y-m-d_H-i-s_")); @@ -1080,7 +1059,7 @@ private function executeCronjobs($cronGroups, $timeout, $arguments): string * @return void * @throws \Exception */ - public function switchToIFrame($locator = null) + public function switchToIFrame($locator = null):void { try { parent::switchToIFrame($locator); @@ -1100,7 +1079,7 @@ public function switchToIFrame($locator = null) * @param boolean $pauseOnFail * @return void */ - public function pause($pauseOnFail = false) + public function pause($pauseOnFail = false):void { if (\Composer\InstalledVersions::isInstalled('hoa/console') === false) { $message = "<pause /> action is unavailable." . PHP_EOL; @@ -1118,4 +1097,66 @@ public function pause($pauseOnFail = false) $this->codeceptPause(); } + + /** + * @param string $selector + * @param string $expected + * @return void + */ + public function seeNumberOfElements($selector, $expected): void + { + $counted = count($this->matchVisible($selector)); + if (is_array($expected)) { + [$floor, $ceil] = $expected; + $this->assertTrue( + $floor <= $counted && $ceil >= $counted, + 'Number of elements counted differs from expected range' + ); + } else { + $this->assertSame( + (int)$expected, + (int)$counted, + 'Number of elements counted differs from expected number' + ); + } + } + + /** + * @param string $text + * @param string $selector + * @return void + */ + public function see($text, $selector = null): void + { + $text = (isset($text)) + ? (string)$text + : ""; + if (!$selector) { + $this->assertPageContains($text); + return; + } + + $this->enableImplicitWait(); + $nodes = $this->matchVisible($selector); + $this->disableImplicitWait(); + $this->assertNodesContain($text, $nodes, $selector); + } + + /** + * @param string $text + * @param string $selector + * @return void + */ + public function dontSee($text, $selector = null): void + { + $text = (isset($text)) + ? (string)$text + : ""; + if (!$selector) { + $this->assertPageNotContains($text); + } else { + $nodes = $this->matchVisible($selector); + $this->assertNodesNotContain($text, $nodes, $selector); + } + } } diff --git a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache index cf8fdd917..ec8a23448 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache +++ b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache @@ -103,7 +103,7 @@ class {{suiteName}} extends \Codeception\GroupObject //Access private TestResultObject to find stack and if there are any errors (as opposed to failures) $testResultObject = call_user_func(\Closure::bind( function () use ($cest) { - return $cest->getTestResultObject(); + return $cest->getResultAggregator(); }, $cest )); @@ -111,7 +111,7 @@ class {{suiteName}} extends \Codeception\GroupObject if (!empty($errors)) { foreach ($errors as $error) { - if ($error->failedTest()->getTestMethod() == $cest->getName()) { + if ($error->getTest()->getTestMethod() == $cest->getName()) { // Do not attempt to run _after if failure was in the _after block // Try to run _after but catch exceptions to prevent them from overwriting original failure. print("LAST TEST IN SUITE FAILED, TEST AFTER MAY NOT BE SUCCESSFUL\n"); diff --git a/src/Magento/FunctionalTestingFramework/Test/Util/TestObjectExtractor.php b/src/Magento/FunctionalTestingFramework/Test/Util/TestObjectExtractor.php index daee2ada2..510898c6c 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Util/TestObjectExtractor.php +++ b/src/Magento/FunctionalTestingFramework/Test/Util/TestObjectExtractor.php @@ -99,7 +99,7 @@ public function extractTestData($testData, $validateAnnotations = true) $testAnnotations = []; $testHooks = []; $filename = $testData['filename'] ?? null; - $fileNames = explode(",", $filename); + $fileNames = explode(",", $filename ?? ''); $baseFileName = $fileNames[0]; $module = $this->modulePathExtractor->extractModuleName($baseFileName); $testReference = $testData['extends'] ?? null; From 62deaf947449803b58ec4192db13986ce5592c92 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Thu, 27 Apr 2023 12:04:11 -0500 Subject: [PATCH 420/674] Fix ActionGroups --- .../Extension/TestContextExtension.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index dfccad88a..af7c102fe 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -323,7 +323,7 @@ public function stepName(\Codeception\Event\StepEvent $e) $stepKey = null; if (!($e->getStep() instanceof Comment)) { - $stepKey = $this->retrieveStepKeyForAllure($e->getStep()); + $stepKey = $this->retrieveStepKeyForAllure($e->getStep(), $e->getTest()->getMetadata()->getFilename()); $isActionGroup = ( strpos( $e->getStep()->__toString(), @@ -457,15 +457,20 @@ protected function localizePath($path) * Reading stepKey from file. * * @param Step $step + * @param String $filePath * @return string|null */ - private function retrieveStepKeyForAllure(Step $step) + private function retrieveStepKeyForAllure(Step $step, string $filePath) { $stepKey = null; $stepLine = $step->getLineNumber(); - $filePath = $step->getFilePath(); $stepLine = $stepLine - 1; + //If the step's filepath is different from the test, it's a comment action. + if ($this->getRootDir() . $step->getFilePath() != $filePath) { + return ""; + } + if (!array_key_exists($filePath, $this->testFiles)) { $this->testFiles[$filePath] = explode(PHP_EOL, file_get_contents($filePath)); } From 4cc11fa1190069dd24b3c5c9354d33487fd03ea6 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Thu, 27 Apr 2023 12:07:23 -0500 Subject: [PATCH 421/674] Fix Static Checks --- .../Extension/TestContextExtension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index af7c102fe..f2e475a82 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -456,8 +456,8 @@ protected function localizePath($path) /** * Reading stepKey from file. * - * @param Step $step - * @param String $filePath + * @param Step $step + * @param string $filePath * @return string|null */ private function retrieveStepKeyForAllure(Step $step, string $filePath) From eb189a9b84af953cd2546cea5199b31ad5be0638 Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Fri, 28 Apr 2023 11:35:36 +0530 Subject: [PATCH 422/674] ACQE-4694 : 4.3.0 MFTF Release Checklist --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4098fa410..3f4d0466d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ Magento Functional Testing Framework Changelog ================================================ +4.3.0 +--------- +### Enhancements +* Bumped `allure-framework/allure-codeception` dependency to `^2.1`. +* Bumped `codeception/codeception` to `^5.0` and upgraded its dependent packages. +* Replaced Yandex methods with Qameta related methods. +* Created methods for modifying step name and for formatting allure. + +### Fixes +* Fixed all issues and exceptions thrown after codeception upgrade. +* Removed dependency of MagentoAllureAdapter in codeception.yml file. 4.2.1 --------- From 99d78dc7d3ff0b7cdf6c588c6de2fa3394b708ac Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Fri, 28 Apr 2023 12:06:15 +0530 Subject: [PATCH 423/674] ACQE-4694 : MFTF Release --- composer.json | 2 +- composer.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 20cb61e92..d6651abc9 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": "4.2.1", + "version": "4.3.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index e72b798d3..68bee06e7 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": "8d813e4caf60bf7520e4781d804977cc", + "content-hash": "723f5ee4d66a45e6312b9b33b0490ba2", "packages": [ { "name": "allure-framework/allure-codeception", From ec11476fe52f60eaf5dd77290f6d7cd9c3a27761 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Fri, 28 Apr 2023 11:21:59 -0500 Subject: [PATCH 424/674] ACQE-4890: Fix WAIT_TIMEOUT Hardcoding - Defining WAIT_TIMEOUT in the .env solves issues. --- etc/config/.env.example | 2 +- etc/config/functional.suite.dist.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/etc/config/.env.example b/etc/config/.env.example index 5596217e9..d1acde342 100644 --- a/etc/config/.env.example +++ b/etc/config/.env.example @@ -57,7 +57,7 @@ MODULE_ALLOWLIST=Magento_Framework,ConfigurableProductWishlist,ConfigurableProdu #ALLOW_SKIPPED=true #*** Default timeout for wait actions -#WAIT_TIMEOUT=30 +WAIT_TIMEOUT=60 #*** Uncomment and set to enable all tests, regardless of passing status, to have all their Allure artifacts. #VERBOSE_ARTIFACTS=true diff --git a/etc/config/functional.suite.dist.yml b/etc/config/functional.suite.dist.yml index da6d45411..161ddeee6 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -27,9 +27,9 @@ modules: window_size: 1280x1024 username: "%MAGENTO_ADMIN_USERNAME%" password: "%MAGENTO_ADMIN_PASSWORD%" - pageload_timeout: "30" - request_timeout: "30" - connection_timeout: "30" + pageload_timeout: "%WAIT_TIMEOUT%" + request_timeout: "%WAIT_TIMEOUT%" + connection_timeout: "%WAIT_TIMEOUT%" host: "%SELENIUM_HOST%" port: "%SELENIUM_PORT%" protocol: "%SELENIUM_PROTOCOL%" From aee41a825154afaa169a13d70a18f30359ce4381 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Thu, 4 May 2023 08:56:50 +0530 Subject: [PATCH 425/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index a884ca5e0..f6bf0eb17 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -250,13 +250,13 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) /** * Throw exception if duplicate arguments found * + * @param string $fileContents * @param string $fileName * @return void * @throws TestFrameworkException */ - public function throwExceptionIfDuplicateArgumentsFound(string $fileName): void - { - $fileContents = file_get_contents($fileName); + public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, string $fileName = ''): void + { $fileToArr = explode("\n", $fileContents); $argumentArray = []; $actionGroupStart = false; @@ -301,7 +301,8 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileName): void public function assembleTestPhp($testObject) { if (!empty($testObject->getFilename()) && file_exists($testObject->getFilename())) { - $this->throwExceptionIfDuplicateArgumentsFound($testObject->getFilename()); + $fileContents = file_get_contents($testObject->getFilename()); + $this->throwExceptionIfDuplicateArgumentsFound($fileContents, $testObject->getFilename()); } $this->customHelpers = []; $usePhp = $this->generateUseStatementsPhp(); From f34117cfd3ae52be9fa4ab697f05c55b4929b9d2 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Thu, 4 May 2023 09:02:33 +0530 Subject: [PATCH 426/674] Update TestGenerator.php --- .../Util/TestGenerator.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index f6bf0eb17..95cf754d9 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -256,13 +256,16 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) * @throws TestFrameworkException */ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, string $fileName = ''): void - { + { $fileToArr = explode("\n", $fileContents); $argumentArray = []; $actionGroupStart = false; foreach ($fileToArr as $fileVal) { $fileVal = trim($fileVal); - if ((str_starts_with($fileVal, '<actionGroup') || str_starts_with($fileVal, '<helper')) && !str_ends_with($fileVal, '/>')) { + if ( + (str_starts_with($fileVal, '<actionGroup') || str_starts_with($fileVal, '<helper')) && + !str_ends_with($fileVal, '/>') + ) { $actionGroupStart = true; continue; } @@ -274,7 +277,11 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, st $size = strpos($argument, ' ', $subtringStart) - $subtringStart; $argumentName = substr($argument, $subtringStart, $size); if (in_array($argumentName, $argumentNameArray)) { - $err[] = sprintf('Duplicate argument for actiongroup or helper with name: %s in test file: %s', $argumentName, $fileName); + $err[] = sprintf( + 'Duplicate argument for actiongroup or helper with name: %s in test file: %s', + $argumentName, + $fileName + ); throw new TestFrameworkException(implode(PHP_EOL, $err)); } $argumentNameArray[] = $argumentName; From f401b15609f29f6771f978b70466f81480463a2f Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Thu, 4 May 2023 09:05:46 +0530 Subject: [PATCH 427/674] ACQE-2580 | Fix static checks --- .../FunctionalTestingFramework/Util/TestGenerator.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 95cf754d9..3474d12aa 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -262,8 +262,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, st $actionGroupStart = false; foreach ($fileToArr as $fileVal) { $fileVal = trim($fileVal); - if ( - (str_starts_with($fileVal, '<actionGroup') || str_starts_with($fileVal, '<helper')) && + if ((str_starts_with($fileVal, '<actionGroup') || str_starts_with($fileVal, '<helper')) && !str_ends_with($fileVal, '/>') ) { $actionGroupStart = true; @@ -278,8 +277,8 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, st $argumentName = substr($argument, $subtringStart, $size); if (in_array($argumentName, $argumentNameArray)) { $err[] = sprintf( - 'Duplicate argument for actiongroup or helper with name: %s in test file: %s', - $argumentName, + 'Duplicate argument for actiongroup or helper with name: %s in test file: %s', + $argumentName, $fileName ); throw new TestFrameworkException(implode(PHP_EOL, $err)); From 99b1cb845f4ba3e05d73f9dbe026d572eb7aa359 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 15 May 2023 09:33:16 +0530 Subject: [PATCH 428/674] ACQE-4968 | Add empty options in suite manager --- .../FunctionalTestingFramework/Console/DoctorCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/DoctorCommand.php b/src/Magento/FunctionalTestingFramework/Console/DoctorCommand.php index f48da60d3..d55aedd25 100644 --- a/src/Magento/FunctionalTestingFramework/Console/DoctorCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/DoctorCommand.php @@ -198,7 +198,7 @@ private function runMagentoWebDriverDoctor() unset($settings['modules']['config'][$magentoWebDriver]); $dispatcher = new EventDispatcher(); - $suiteManager = new SuiteManager($dispatcher, self::SUITE, $settings); + $suiteManager = new SuiteManager($dispatcher, self::SUITE, $settings, []); try { $suiteManager->initialize(); $this->context = ['Successful']; From dfd99b207b46c959cbe5849e7260a03f4f853a73 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 15 May 2023 09:34:36 +0530 Subject: [PATCH 429/674] ACQE-4968 | Replace proxy keys with config array --- .../Module/MagentoWebDriverDoctor.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriverDoctor.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriverDoctor.php index 1407c957b..05332aac4 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriverDoctor.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriverDoctor.php @@ -91,8 +91,8 @@ private function connectToSeleniumServer() $this->capabilities, $this->connectionTimeoutInMs, $this->requestTimeoutInMs, - $this->httpProxy, - $this->httpProxyPort + $this->config['http_proxy'], + $this->config['http_proxy_port'] ); if (null !== $this->remoteWebDriver) { return; From 4c6c9bc7ece70c26c390d5468b4bd3758b7d099b Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Tue, 16 May 2023 09:47:27 +0530 Subject: [PATCH 430/674] ACQE-4318 | Add default test in membership.text file --- .../Suite/SuiteGenerator.php | 44 ++++++++++++++----- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 1ba590b1a..d3fccb0b6 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -95,6 +95,7 @@ public static function getInstance(): SuiteGenerator */ public function generateAllSuites($testManifest) { + $this->generateTestgroupmembership($testManifest); $suites = $testManifest->getSuiteConfig(); foreach ($suites as $suiteName => $suiteContent) { @@ -142,24 +143,44 @@ public function generateSuite($suiteName) /** * Function which generate Testgroupmembership file. * - * @param string $suiteName - * @param array $tests + * @param $testManifest * @return void * @throws \Exception */ - public function generateTestgroupmembership($suiteName, $tests) + public function generateTestgroupmembership($testManifest) { $memberShipFilePath = FilePathFormatter::format(TESTS_MODULE_PATH).'_generated/testgroupmembership.txt'; - static $suiteCount = 0; - foreach ($tests as $key => $testName) { - try { - $suiteTests = $suiteCount.":".$key.":".$suiteName.':'.$testName."\n"; - file_put_contents($memberShipFilePath, $suiteTests, FILE_APPEND); - } catch (FastFailException $e) { - throw $e; - } + + $testManifestArray = (array) $testManifest; + $prefix = chr(0).'*'.chr(0); + $defaultSuiteTests = $testManifestArray[$prefix.'testNameToSize']; + + $suiteCount = 0; + $testCount = 0; + foreach ($defaultSuiteTests as $defaultSuiteTestName => $defaultTestValue) { + $defaultSuiteTestName = rtrim($defaultSuiteTestName, 'Cest'); + $defaultSuiteTest = sprintf('%s:%s:%s\n', $suiteCount, 0, $defaultSuiteTestName); + file_put_contents($memberShipFilePath, $defaultSuiteTest, FILE_APPEND); + $testCount++; } + $suiteCount++; + $suites = $testManifest->getSuiteConfig(); + foreach ($suites as $suite => $tests) { + foreach ($tests as $key => $test) { + if(!is_numeric($key)) { + foreach ($test as $testKey => $testName) { + $suiteTest = sprintf('%s:%s:%s:%s\n', $suiteCount, $testKey, $key, $testName); + file_put_contents($memberShipFilePath, $suiteTest, FILE_APPEND); + $suiteCount++; + } + } else { + $suiteTest = sprintf('%s:%s:%s:%s\n', $suiteCount, $key, $suite, $test); + file_put_contents($memberShipFilePath, $suiteTest, FILE_APPEND); + } + } + $suiteCount++; + } } /** @@ -186,7 +207,6 @@ private function generateSuiteFromTest($suiteName, $tests = [], $originalSuiteNa $relevantTests = []; if (!empty($tests)) { $this->validateTestsReferencedInSuite($suiteName, $tests, $originalSuiteName); - $this->generateTestgroupmembership($suiteName, $tests); foreach ($tests as $testName) { try { $relevantTests[$testName] = TestObjectHandler::getInstance()->getObject($testName); From adfdd7e26eeceb282623efe905003e45de2a9e67 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Tue, 16 May 2023 09:58:30 +0530 Subject: [PATCH 431/674] ACQE-4318 | Fix static checks --- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index d3fccb0b6..18e4ef5ce 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -143,7 +143,7 @@ public function generateSuite($suiteName) /** * Function which generate Testgroupmembership file. * - * @param $testManifest + * @param object $testManifest * @return void * @throws \Exception */ @@ -168,7 +168,7 @@ public function generateTestgroupmembership($testManifest) $suites = $testManifest->getSuiteConfig(); foreach ($suites as $suite => $tests) { foreach ($tests as $key => $test) { - if(!is_numeric($key)) { + if (!is_numeric($key)) { foreach ($test as $testKey => $testName) { $suiteTest = sprintf('%s:%s:%s:%s\n', $suiteCount, $testKey, $key, $testName); file_put_contents($memberShipFilePath, $suiteTest, FILE_APPEND); From ee2816577cc751ea9f42b2c73455fb8d96678668 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Tue, 16 May 2023 10:07:44 +0530 Subject: [PATCH 432/674] ACQE-4318 | Fix formatting of membership.txt file --- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 18e4ef5ce..b87db092e 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -158,9 +158,8 @@ public function generateTestgroupmembership($testManifest) $suiteCount = 0; $testCount = 0; foreach ($defaultSuiteTests as $defaultSuiteTestName => $defaultTestValue) { - $defaultSuiteTestName = rtrim($defaultSuiteTestName, 'Cest'); - $defaultSuiteTest = sprintf('%s:%s:%s\n', $suiteCount, 0, $defaultSuiteTestName); - file_put_contents($memberShipFilePath, $defaultSuiteTest, FILE_APPEND); + $defaultSuiteTest = sprintf('%s:%s:%s', $suiteCount, $testCount, $defaultSuiteTestName); + file_put_contents($memberShipFilePath, $defaultSuiteTest.PHP_EOL, FILE_APPEND); $testCount++; } @@ -171,12 +170,12 @@ public function generateTestgroupmembership($testManifest) if (!is_numeric($key)) { foreach ($test as $testKey => $testName) { $suiteTest = sprintf('%s:%s:%s:%s\n', $suiteCount, $testKey, $key, $testName); - file_put_contents($memberShipFilePath, $suiteTest, FILE_APPEND); + file_put_contents($memberShipFilePath, $suiteTest.PHP_EOL, FILE_APPEND); $suiteCount++; } } else { $suiteTest = sprintf('%s:%s:%s:%s\n', $suiteCount, $key, $suite, $test); - file_put_contents($memberShipFilePath, $suiteTest, FILE_APPEND); + file_put_contents($memberShipFilePath, $suiteTest.PHP_EOL, FILE_APPEND); } } $suiteCount++; From 93630f304ffc431bd1c260a58e932d838a3c01e8 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Tue, 16 May 2023 10:55:01 +0530 Subject: [PATCH 433/674] ACQE-4318 | Fix verification test --- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index b87db092e..0561a4714 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -150,6 +150,9 @@ public function generateSuite($suiteName) public function generateTestgroupmembership($testManifest) { $memberShipFilePath = FilePathFormatter::format(TESTS_MODULE_PATH).'_generated/testgroupmembership.txt'; + if (!is_file($memberShipFilePath)) { + return; + } $testManifestArray = (array) $testManifest; $prefix = chr(0).'*'.chr(0); From 3731107b1875c3740e18fcf9f4baf402a4c970e5 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Tue, 16 May 2023 11:05:53 +0530 Subject: [PATCH 434/674] ACQE-4318 | Fix formatting of membership.txt file --- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 0561a4714..cf2603d43 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -172,12 +172,12 @@ public function generateTestgroupmembership($testManifest) foreach ($tests as $key => $test) { if (!is_numeric($key)) { foreach ($test as $testKey => $testName) { - $suiteTest = sprintf('%s:%s:%s:%s\n', $suiteCount, $testKey, $key, $testName); + $suiteTest = sprintf('%s:%s:%s:%s', $suiteCount, $testKey, $key, $testName); file_put_contents($memberShipFilePath, $suiteTest.PHP_EOL, FILE_APPEND); $suiteCount++; } } else { - $suiteTest = sprintf('%s:%s:%s:%s\n', $suiteCount, $key, $suite, $test); + $suiteTest = sprintf('%s:%s:%s:%s', $suiteCount, $key, $suite, $test); file_put_contents($memberShipFilePath, $suiteTest.PHP_EOL, FILE_APPEND); } } From b7c418658c277ccc53e540371377b33ef5d46dec Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Fri, 19 May 2023 09:45:26 +0530 Subject: [PATCH 435/674] Update SuiteGenerator.php --- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index cf2603d43..f03bf6dbd 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -150,9 +150,7 @@ public function generateSuite($suiteName) public function generateTestgroupmembership($testManifest) { $memberShipFilePath = FilePathFormatter::format(TESTS_MODULE_PATH).'_generated/testgroupmembership.txt'; - if (!is_file($memberShipFilePath)) { - return; - } + $testManifestArray = (array) $testManifest; $prefix = chr(0).'*'.chr(0); From fbd24f4d5f1e51db362c9b01022f12285fff4e25 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 22 May 2023 10:01:04 +0530 Subject: [PATCH 436/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 3474d12aa..a64d3137c 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -262,13 +262,11 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, st $actionGroupStart = false; foreach ($fileToArr as $fileVal) { $fileVal = trim($fileVal); - if ((str_starts_with($fileVal, '<actionGroup') || str_starts_with($fileVal, '<helper')) && - !str_ends_with($fileVal, '/>') - ) { + if (str_starts_with($fileVal, '<actionGroup') && !str_ends_with($fileVal, '/>')) { $actionGroupStart = true; continue; } - if ($fileVal === '</actionGroup>' || $fileVal === '</helper>') { + if ($fileVal === '</actionGroup>') { $argumentNameArray = []; foreach ($argumentArray as $argument) { $subtringStart = strpos($argument, 'name='); @@ -277,7 +275,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, st $argumentName = substr($argument, $subtringStart, $size); if (in_array($argumentName, $argumentNameArray)) { $err[] = sprintf( - 'Duplicate argument for actiongroup or helper with name: %s in test file: %s', + 'Duplicate argument for actiongroup with name: %s in test file: %s', $argumentName, $fileName ); From 1433e80319b7e5defc50ac68aaa495bf3f8b6447 Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 15:14:01 +0530 Subject: [PATCH 437/674] ACQE-4973 | Group test under suites --- dev/.credentials | 1 + .../Extension/TestContextExtension.php | 48 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 dev/.credentials diff --git a/dev/.credentials b/dev/.credentials new file mode 100644 index 000000000..50c0c05bf --- /dev/null +++ b/dev/.credentials @@ -0,0 +1 @@ +magento/MAGENTO_ADMIN_PASSWORD=Admin@123456 diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index f2e475a82..f9752df02 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -10,6 +10,7 @@ use Codeception\Step; use Magento\FunctionalTestingFramework\Allure\AllureHelper; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; +use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler; use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; use Qameta\Allure\Allure; use Qameta\Allure\Model\StepResult; @@ -158,6 +159,53 @@ function (TestResult $testResult) { $this->getFormattedSteps($testResult); } ); + + $group = null; + if ($this->options['groups'] !== null) { + $group = $this->options['groups'][0]; + } + if ($group !== null) { + $groupName = $this->sanitizeGroupName($group); + $lifecycle->updateTest( + function (TestResult $testResult) use ($groupName) { + $labels = $testResult->getLabels(); + foreach ($labels as $label) { + if ($label->getName() == "parentSuite") { + $label->setValue(sprintf('%s\%s', $label->getValue(), $groupName)); + break; + } + } + } + ); + } + } + + /** + * Function which santizes any group names changed by the framework for execution in order to consolidate reporting. + * + * @param string $group + * @return string + */ + private function sanitizeGroupName($group): string + { + $suiteNames = array_keys(SuiteObjectHandler::getInstance()->getAllObjects()); + $exactMatch = in_array($group, $suiteNames); + + // if this is an existing suite name we dont' need to worry about changing it + if ($exactMatch || strpos($group, "_") === false) { + return $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 + $originalName = in_array($originalName, $suiteNames) ? $originalName : $group; + + return $originalName; } /** From 7e96e5ca7c2ab19d4f7770e1703b668af87fe0cb Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 15:15:09 +0530 Subject: [PATCH 438/674] ACQE-4973 | Group test under suites --- dev/.credentials | 1 - 1 file changed, 1 deletion(-) delete mode 100644 dev/.credentials diff --git a/dev/.credentials b/dev/.credentials deleted file mode 100644 index 50c0c05bf..000000000 --- a/dev/.credentials +++ /dev/null @@ -1 +0,0 @@ -magento/MAGENTO_ADMIN_PASSWORD=Admin@123456 From ae2fc5e042031fc20f38b5ae66bd041fd321ef5a Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 16:04:54 +0530 Subject: [PATCH 439/674] ACQE-4973 | Group test under packages --- .../Extension/TestContextExtension.php | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index f9752df02..bf8b49f2d 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -160,24 +160,24 @@ function (TestResult $testResult) { } ); - $group = null; + $groupName = null; if ($this->options['groups'] !== null) { $group = $this->options['groups'][0]; - } - if ($group !== null) { $groupName = $this->sanitizeGroupName($group); - $lifecycle->updateTest( - function (TestResult $testResult) use ($groupName) { - $labels = $testResult->getLabels(); - foreach ($labels as $label) { - if ($label->getName() == "parentSuite") { - $label->setValue(sprintf('%s\%s', $label->getValue(), $groupName)); - break; - } + } + $lifecycle->updateTest( + function (TestResult $testResult) use ($groupName, $cest) { + $labels = $testResult->getLabels(); + foreach ($labels as $label) { + if ($groupName !== null && $label->getName() === "parentSuite") { + $label->setValue(sprintf('%s\%s', $label->getValue(), $groupName)); + } + if ($label->getName() === "package") { + $label->setValue($cest->getReportFields()['class']); } } - ); - } + } + ); } /** From 7161244226a463eaed4655eaf347f31b584a7775 Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 16:08:19 +0530 Subject: [PATCH 440/674] ACQE-4973 | Fix static checks --- .../Extension/TestContextExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index bf8b49f2d..bc7245150 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -193,7 +193,7 @@ private function sanitizeGroupName($group): string // if this is an existing suite name we dont' need to worry about changing it if ($exactMatch || strpos($group, "_") === false) { - return $group; + return $group; } // if we can't find this group in the generated suites we have to assume that the group was split for generation From a8d01f0f120c9c6f06c73bcbe069bdca6f4c23be Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 16:37:21 +0530 Subject: [PATCH 441/674] ACQE-4973 | Fix cyclometry complexity checks --- dev/.credentials | 1 + .../Extension/TestContextExtension.php | 21 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 dev/.credentials diff --git a/dev/.credentials b/dev/.credentials new file mode 100644 index 000000000..50c0c05bf --- /dev/null +++ b/dev/.credentials @@ -0,0 +1 @@ +magento/MAGENTO_ADMIN_PASSWORD=Admin@123456 diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index bc7245150..9bf6060cf 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -160,6 +160,11 @@ function (TestResult $testResult) { } ); + $this->addTestsInSuites($lifecycle, $cest); + } + + private function addTestsInSuites($lifecycle, $cest): void + { $groupName = null; if ($this->options['groups'] !== null) { $group = $this->options['groups'][0]; @@ -167,16 +172,16 @@ function (TestResult $testResult) { } $lifecycle->updateTest( function (TestResult $testResult) use ($groupName, $cest) { - $labels = $testResult->getLabels(); - foreach ($labels as $label) { - if ($groupName !== null && $label->getName() === "parentSuite") { - $label->setValue(sprintf('%s\%s', $label->getValue(), $groupName)); - } - if ($label->getName() === "package") { - $label->setValue($cest->getReportFields()['class']); - } + $labels = $testResult->getLabels(); + foreach ($labels as $label) { + if ($groupName !== null && $label->getName() === "parentSuite") { + $label->setValue(sprintf('%s\%s', $label->getValue(), $groupName)); + } + if ($label->getName() === "package") { + $label->setValue($cest->getReportFields()['class']); } } + } ); } From 12dc6903e6bcc79d19c47ca2a59bf1be72d93dbc Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 16:38:05 +0530 Subject: [PATCH 442/674] ACQE-4973 | Fix cyclometry complexity checks --- dev/.credentials | 1 - 1 file changed, 1 deletion(-) delete mode 100644 dev/.credentials diff --git a/dev/.credentials b/dev/.credentials deleted file mode 100644 index 50c0c05bf..000000000 --- a/dev/.credentials +++ /dev/null @@ -1 +0,0 @@ -magento/MAGENTO_ADMIN_PASSWORD=Admin@123456 From 2bcb74c00205229d46e549112052e71b8fcebcb8 Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 16:47:45 +0530 Subject: [PATCH 443/674] ACQE-4973 | Fix cyclometry complexity checks --- .../Extension/TestContextExtension.php | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index 9bf6060cf..d981d1c08 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -163,6 +163,12 @@ function (TestResult $testResult) { $this->addTestsInSuites($lifecycle, $cest); } + /** + * Function to add test under the suites + * + * @param string $group + * @return void + */ private function addTestsInSuites($lifecycle, $cest): void { $groupName = null; @@ -172,16 +178,16 @@ private function addTestsInSuites($lifecycle, $cest): void } $lifecycle->updateTest( function (TestResult $testResult) use ($groupName, $cest) { - $labels = $testResult->getLabels(); - foreach ($labels as $label) { - if ($groupName !== null && $label->getName() === "parentSuite") { - $label->setValue(sprintf('%s\%s', $label->getValue(), $groupName)); - } - if ($label->getName() === "package") { - $label->setValue($cest->getReportFields()['class']); + $labels = $testResult->getLabels(); + foreach ($labels as $label) { + if ($groupName !== null && $label->getName() === "parentSuite") { + $label->setValue(sprintf('%s\%s', $label->getValue(), $groupName)); + } + if ($label->getName() === "package") { + $label->setValue($cest->getReportFields()['class']); + } } } - } ); } From 7453d3c047d8454e95bf46ab5499a6a8ebfd6d94 Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 16:55:07 +0530 Subject: [PATCH 444/674] ACQE-4973 | Fix static checks --- .../Extension/TestContextExtension.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index d981d1c08..604d7d3be 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -166,7 +166,8 @@ function (TestResult $testResult) { /** * Function to add test under the suites * - * @param string $group + * @param $lifecycle + * @param $cest * @return void */ private function addTestsInSuites($lifecycle, $cest): void From f057509307fce5f21b7775442b1cb40fdb4ccf88 Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 17:03:40 +0530 Subject: [PATCH 445/674] ACQE-4973 | Fix static checks --- .../Extension/TestContextExtension.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index 604d7d3be..743637572 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -8,11 +8,13 @@ use Codeception\Events; use Codeception\Step; +use Codeception\Test\Test; use Magento\FunctionalTestingFramework\Allure\AllureHelper; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler; use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; use Qameta\Allure\Allure; +use Qameta\Allure\AllureLifecycleInterface; use Qameta\Allure\Model\StepResult; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Test\Objects\ActionGroupObject; @@ -166,8 +168,8 @@ function (TestResult $testResult) { /** * Function to add test under the suites * - * @param $lifecycle - * @param $cest + * @param AllureLifecycleInterface $lifecycle + * @param Test $cest * @return void */ private function addTestsInSuites($lifecycle, $cest): void From 7b3e234d1af48bf28c428a477a54041538215553 Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 17:08:56 +0530 Subject: [PATCH 446/674] ACQE-4973 | Fix static checks --- .../Extension/TestContextExtension.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index 743637572..10f91b561 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -170,9 +170,10 @@ function (TestResult $testResult) { * * @param AllureLifecycleInterface $lifecycle * @param Test $cest + * * @return void */ - private function addTestsInSuites($lifecycle, $cest): void + private function addTestsInSuites(AllureLifecycleInterface $lifecycle, Test $cest): void { $groupName = null; if ($this->options['groups'] !== null) { From 3aa90d6428920b96be19942e28b79bc02952c772 Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 17:11:08 +0530 Subject: [PATCH 447/674] ACQE-4973 | Fix static checks --- .../Extension/TestContextExtension.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index 10f91b561..dfec544f5 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -168,9 +168,8 @@ function (TestResult $testResult) { /** * Function to add test under the suites * - * @param AllureLifecycleInterface $lifecycle + * @param AllureLifecycleInterface $lifecycle * @param Test $cest - * * @return void */ private function addTestsInSuites(AllureLifecycleInterface $lifecycle, Test $cest): void From 3359dc27deb29f2ac167b05ebf652b88e6305826 Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 17:12:36 +0530 Subject: [PATCH 448/674] ACQE-4973 | Fix static checks --- .../Extension/TestContextExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index dfec544f5..1a1e379be 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -168,7 +168,7 @@ function (TestResult $testResult) { /** * Function to add test under the suites * - * @param AllureLifecycleInterface $lifecycle + * @param AllureLifecycleInterface $lifecycle * @param Test $cest * @return void */ From 0c16e969a3ba48eca0a27bd1be5f7c1b8cd646d4 Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 17:13:55 +0530 Subject: [PATCH 449/674] ACQE-4973 | Fix static checks --- .../Extension/TestContextExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index 1a1e379be..5484442cd 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -166,7 +166,7 @@ function (TestResult $testResult) { } /** - * Function to add test under the suites + * Function to add test under the suites. * * @param AllureLifecycleInterface $lifecycle * @param Test $cest From 37cbf8fdd70bfc1c737a02510a40b4896a81796f Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 17:15:30 +0530 Subject: [PATCH 450/674] ACQE-4973 | Fix static checks --- .../Extension/TestContextExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index 5484442cd..f4dbc9e65 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -168,7 +168,7 @@ function (TestResult $testResult) { /** * Function to add test under the suites. * - * @param AllureLifecycleInterface $lifecycle + * @param object $lifecycle * @param Test $cest * @return void */ From c279facdab908f9e2be56ff8e70c0ae35802b468 Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 17:17:05 +0530 Subject: [PATCH 451/674] ACQE-4973 | Fix static checks --- .../Extension/TestContextExtension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index f4dbc9e65..52185c040 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -168,11 +168,11 @@ function (TestResult $testResult) { /** * Function to add test under the suites. * - * @param object $lifecycle + * @param object $lifecycle * @param Test $cest * @return void */ - private function addTestsInSuites(AllureLifecycleInterface $lifecycle, Test $cest): void + private function addTestsInSuites($lifecycle, $cest): void { $groupName = null; if ($this->options['groups'] !== null) { From 31ec8b5700912397d91c1306807ac22a27a9369b Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 17:19:33 +0530 Subject: [PATCH 452/674] ACQE-4973 | Fix static checks --- .../Extension/TestContextExtension.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index 52185c040..81379efd8 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -168,8 +168,9 @@ function (TestResult $testResult) { /** * Function to add test under the suites. * - * @param object $lifecycle - * @param Test $cest + * @param string $lifecycle + * @param string $cest + * * @return void */ private function addTestsInSuites($lifecycle, $cest): void From 291990e92006c4aac2d1fdc1e03e745133687a68 Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 17:22:49 +0530 Subject: [PATCH 453/674] ACQE-4973 | Fix static checks --- .../Extension/TestContextExtension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index 81379efd8..9d4866028 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -168,8 +168,8 @@ function (TestResult $testResult) { /** * Function to add test under the suites. * - * @param string $lifecycle - * @param string $cest + * @param object $lifecycle + * @param object $cest * * @return void */ From 04c46801be5af6075ae7332188ec50d5b0af9a4c Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Thu, 25 May 2023 17:32:46 +0530 Subject: [PATCH 454/674] Fix internal exception in codeception --- .../Extension/TestContextExtension.php | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index f2e475a82..309f72070 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -267,15 +267,12 @@ public function attachExceptionToAllure($exception, $testMethod) AllureHelper::addAttachmentToCurrentStep($exception, $context . 'Exception'); - //pop suppressed exceptions and attach to allure - $change = function () { - if ($this instanceof \PHPUnit\Framework\ExceptionWrapper) { - return $this->previous; - } else { - return $this->getPrevious(); - } - }; - $previousException = $change->call($exception); + $previousException = null; + if ($exception instanceof \PHPUnit\Framework\ExceptionWrapper) { + $previousException = $exception->getPreviousWrapped(); + } elseif ($exception instanceof \Throwable) { + $previousException = $exception->getPrevious(); + } if ($previousException !== null) { $this->attachExceptionToAllure($previousException, $testMethod); From eed694b92b0831ea8e347ffd632aeb6a4549c698 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Fri, 26 May 2023 10:11:46 +0530 Subject: [PATCH 455/674] [ACQE-4318] Testing generation of testgroupmembership file --- .../Suite/SuiteGenerator.php | 62 ++++++++++--------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index f03bf6dbd..c59cb3eda 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -149,38 +149,40 @@ public function generateSuite($suiteName) */ public function generateTestgroupmembership($testManifest) { - $memberShipFilePath = FilePathFormatter::format(TESTS_MODULE_PATH).'_generated/testgroupmembership.txt'; - - - $testManifestArray = (array) $testManifest; - $prefix = chr(0).'*'.chr(0); - $defaultSuiteTests = $testManifestArray[$prefix.'testNameToSize']; - - $suiteCount = 0; - $testCount = 0; - foreach ($defaultSuiteTests as $defaultSuiteTestName => $defaultTestValue) { - $defaultSuiteTest = sprintf('%s:%s:%s', $suiteCount, $testCount, $defaultSuiteTestName); - file_put_contents($memberShipFilePath, $defaultSuiteTest.PHP_EOL, FILE_APPEND); - $testCount++; - } - - $suiteCount++; - $suites = $testManifest->getSuiteConfig(); - foreach ($suites as $suite => $tests) { - foreach ($tests as $key => $test) { - if (!is_numeric($key)) { - foreach ($test as $testKey => $testName) { - $suiteTest = sprintf('%s:%s:%s:%s', $suiteCount, $testKey, $key, $testName); - file_put_contents($memberShipFilePath, $suiteTest.PHP_EOL, FILE_APPEND); - $suiteCount++; - } - } else { - $suiteTest = sprintf('%s:%s:%s:%s', $suiteCount, $key, $suite, $test); - file_put_contents($memberShipFilePath, $suiteTest.PHP_EOL, FILE_APPEND); - } + // Get suits and subsuites data array + $suites = $testManifest->getSuiteConfig(); + + // Add subsuites array[2nd dimension] to main array[1st dimension] to access it directly later + if(!empty($suites)) { + foreach ($suites as $subSuites) { + if(!empty($subSuites)) { + foreach ($subSuites as $subSuiteName => $suiteTestNames) { + if (!is_numeric($subSuiteName)) { + $suites[$subSuiteName] = $suiteTestNames; + } else { + continue; + } } - $suiteCount++; + } } + } + + // Path to groups folder + $baseDir = FilePathFormatter::format(TESTS_MODULE_PATH); + + // Read each file in the reverse order and form an array with groupId as key + $groupNumber = 0; + while(!empty($groupFiles)){ + $group = array_pop($groupFiles); + $allGroupsContent[$groupNumber] = file($group); + $groupNumber++; + } + + // Output file path + $memberShipFilePath = $baseDir.'_generated/testgroupmembership.txt'; + + file_put_contents($memberShipFilePath, "testing" . PHP_EOL, FILE_APPEND); + } /** From c951fca7d930cc41c61e2eed39d4e7c8d8c71f6e Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Fri, 26 May 2023 12:28:54 +0530 Subject: [PATCH 456/674] [ACQE-4318] Reading files under groups folder --- .../Suite/SuiteGenerator.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index c59cb3eda..4ab7984d0 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -169,6 +169,16 @@ public function generateTestgroupmembership($testManifest) // Path to groups folder $baseDir = FilePathFormatter::format(TESTS_MODULE_PATH); + $path = $baseDir .'_generated/groups'; + + // Read all group files + if (is_dir($path)) { + $groupFiles = glob("$path/group*.txt"); + if ($groupFiles === false) { + throw new RuntimeException("glob(): error with '$path'"); + } + sort($groupFiles, SORT_NATURAL); + } // Read each file in the reverse order and form an array with groupId as key $groupNumber = 0; @@ -181,7 +191,7 @@ public function generateTestgroupmembership($testManifest) // Output file path $memberShipFilePath = $baseDir.'_generated/testgroupmembership.txt'; - file_put_contents($memberShipFilePath, "testing" . PHP_EOL, FILE_APPEND); + file_put_contents($memberShipFilePath, "testing again" . PHP_EOL, FILE_APPEND); } From 95a76c180693c8cb96d88f2bd4dac339a3edf56e Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Fri, 26 May 2023 14:06:42 +0530 Subject: [PATCH 457/674] [ACQE-4318] Adding test case names to testgroupmembership file --- .../Suite/SuiteGenerator.php | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 4ab7984d0..9d8ab2e6c 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -191,7 +191,32 @@ public function generateTestgroupmembership($testManifest) // Output file path $memberShipFilePath = $baseDir.'_generated/testgroupmembership.txt'; - file_put_contents($memberShipFilePath, "testing again" . PHP_EOL, FILE_APPEND); + $testCaseNumber = 0; + + if(!empty($allGroupsContent)) { + foreach ($allGroupsContent as $groupId => $groupInfo) { + foreach ($groupInfo as $testName) { + // If file has -g then it is test suite + if (str_contains($testName, '-g')) { + $suitename = explode(" ", $testName); + $suitename[1] = trim($suitename[1]); + if(!empty($suites[$suitename[1]])) { + foreach ($suites[$suitename[1]] as $key => $test) { + $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); + file_put_contents($memberShipFilePath, $suiteTest . PHP_EOL, FILE_APPEND); + } + } + } + // It is default test group + else { + $defaultSuiteTest = sprintf('%s:%s:%s', $groupId, $testCaseNumber, $testName); + file_put_contents($memberShipFilePath, $defaultSuiteTest . PHP_EOL, FILE_APPEND); + } + $testCaseNumber++; + } + $testCaseNumber = 0; + } + } } From 2c290c6f663d4a76c22ee45996eb37180b6e92b3 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Fri, 26 May 2023 15:50:09 +0530 Subject: [PATCH 458/674] [ACQE-4318] Debugging the groupID generation --- .../Suite/SuiteGenerator.php | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 9d8ab2e6c..2db38a6ad 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -191,30 +191,12 @@ public function generateTestgroupmembership($testManifest) // Output file path $memberShipFilePath = $baseDir.'_generated/testgroupmembership.txt'; - $testCaseNumber = 0; if(!empty($allGroupsContent)) { foreach ($allGroupsContent as $groupId => $groupInfo) { foreach ($groupInfo as $testName) { - // If file has -g then it is test suite - if (str_contains($testName, '-g')) { - $suitename = explode(" ", $testName); - $suitename[1] = trim($suitename[1]); - if(!empty($suites[$suitename[1]])) { - foreach ($suites[$suitename[1]] as $key => $test) { - $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); - file_put_contents($memberShipFilePath, $suiteTest . PHP_EOL, FILE_APPEND); - } - } - } - // It is default test group - else { - $defaultSuiteTest = sprintf('%s:%s:%s', $groupId, $testCaseNumber, $testName); - file_put_contents($memberShipFilePath, $defaultSuiteTest . PHP_EOL, FILE_APPEND); - } - $testCaseNumber++; + file_put_contents($memberShipFilePath, $testName . PHP_EOL, FILE_APPEND); } - $testCaseNumber = 0; } } From 7a709b607a756300046e10e06ef01796b98481db Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Fri, 26 May 2023 18:00:48 +0530 Subject: [PATCH 459/674] [ACQE-4318] Debugging the groupID generation --- .../Suite/SuiteGenerator.php | 96 +++++++++++-------- 1 file changed, 57 insertions(+), 39 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 2db38a6ad..0e35b7718 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -149,58 +149,76 @@ public function generateSuite($suiteName) */ public function generateTestgroupmembership($testManifest) { - // Get suits and subsuites data array - $suites = $testManifest->getSuiteConfig(); - - // Add subsuites array[2nd dimension] to main array[1st dimension] to access it directly later - if(!empty($suites)) { - foreach ($suites as $subSuites) { - if(!empty($subSuites)) { - foreach ($subSuites as $subSuiteName => $suiteTestNames) { - if (!is_numeric($subSuiteName)) { - $suites[$subSuiteName] = $suiteTestNames; - } else { - continue; - } + // Get suits and subsuites data array + $suites = $testManifest->getSuiteConfig(); + + // Add subsuites array[2nd dimension] to main array[1st dimension] to access it directly later + if(!empty($suites)) { + foreach ($suites as $subSuites) { + if(!empty($subSuites)) { + foreach ($subSuites as $subSuiteName => $suiteTestNames) { + if (!is_numeric($subSuiteName)) { + $suites[$subSuiteName] = $suiteTestNames; + } else { + continue; } } } } + } - // Path to groups folder - $baseDir = FilePathFormatter::format(TESTS_MODULE_PATH); - $path = $baseDir .'_generated/groups'; + // Path to groups folder + $baseDir = FilePathFormatter::format(TESTS_MODULE_PATH); + $path = $baseDir .'_generated/groups'; - // Read all group files - if (is_dir($path)) { - $groupFiles = glob("$path/group*.txt"); - if ($groupFiles === false) { - throw new RuntimeException("glob(): error with '$path'"); - } - sort($groupFiles, SORT_NATURAL); + // Read all group files + if (is_dir($path)) { + $groupFiles = glob("$path/group*.txt"); + if ($groupFiles === false) { + throw new RuntimeException("glob(): error with '$path'"); } + sort($groupFiles, SORT_NATURAL); + } - // Read each file in the reverse order and form an array with groupId as key - $groupNumber = 0; - while(!empty($groupFiles)){ - $group = array_pop($groupFiles); - $allGroupsContent[$groupNumber] = file($group); - $groupNumber++; - } - - // Output file path - $memberShipFilePath = $baseDir.'_generated/testgroupmembership.txt'; - + // Read each file in the reverse order and form an array with groupId as key + $groupNumber = 0; + $allGroupsContent = array(); + while(!empty($groupFiles)){ + $group = array_pop($groupFiles); + $allGroupsContent[$groupNumber] = file($group); + $groupNumber++; + } - if(!empty($allGroupsContent)) { - foreach ($allGroupsContent as $groupId => $groupInfo) { - foreach ($groupInfo as $testName) { - file_put_contents($memberShipFilePath, $testName . PHP_EOL, FILE_APPEND); + // Output file path + $memberShipFilePath = $baseDir.'_generated/testgroupmembership.txt'; + $testCaseNumber = 0; +echo "groups array-><pre>"; +print_r($allGroupsContent); + if(!empty($allGroupsContent)) { + foreach ($allGroupsContent as $groupId => $groupInfo) { + foreach ($groupInfo as $testName) { + // If file has -g then it is test suite + if (str_contains($testName, '-g')) { + $suitename = explode(" ", $testName); + $suitename[1] = trim($suitename[1]); + if(!empty($suites[$suitename[1]])) { + foreach ($suites[$suitename[1]] as $key => $test) { + $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); + file_put_contents($memberShipFilePath, $suiteTest . PHP_EOL, FILE_APPEND); + } + } + } + // It is default test group + else { + $defaultSuiteTest = sprintf('%s:%s:%s', $groupId, $testCaseNumber, $testName); + file_put_contents($memberShipFilePath, $defaultSuiteTest . PHP_EOL, FILE_APPEND); } + $testCaseNumber++; } + $testCaseNumber = 0; } - } + } /** * Function which takes a suite name and a set of test names. The function then generates all relevant supporting From 8a69ad9e2c3c811b2b0ac79b811fa8725b44fc9d Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Sat, 27 May 2023 10:50:04 +0530 Subject: [PATCH 460/674] [ACQE-4318] Generating testgroupmembership after groups generation --- src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 0e35b7718..f419f00d8 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -95,7 +95,6 @@ public static function getInstance(): SuiteGenerator */ public function generateAllSuites($testManifest) { - $this->generateTestgroupmembership($testManifest); $suites = $testManifest->getSuiteConfig(); foreach ($suites as $suiteName => $suiteContent) { @@ -118,6 +117,7 @@ public function generateAllSuites($testManifest) // if our first element is an array we know that we have split the suites if (is_array($firstElement)) { $this->generateSplitSuiteFromTest($suiteName, $suiteContent); + $this->generateTestgroupmembership($testManifest); } } catch (FastFailException $e) { throw $e; From 1f9cd2a241b6f33ab0eb46ea02b869eaec2984a0 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Mon, 29 May 2023 14:54:37 +0530 Subject: [PATCH 461/674] [ACQE-4318] Debug testgroupsmembership generation --- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index f419f00d8..637cf2eef 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -174,6 +174,8 @@ public function generateTestgroupmembership($testManifest) // Read all group files if (is_dir($path)) { $groupFiles = glob("$path/group*.txt"); + echo "Group files-> \n"; + print_r($groupFiles); if ($groupFiles === false) { throw new RuntimeException("glob(): error with '$path'"); } @@ -184,6 +186,7 @@ public function generateTestgroupmembership($testManifest) $groupNumber = 0; $allGroupsContent = array(); while(!empty($groupFiles)){ + echo "Group files not empty"; $group = array_pop($groupFiles); $allGroupsContent[$groupNumber] = file($group); $groupNumber++; From 6fcccac8a3c493faa65235447eacbd9fc5e229d3 Mon Sep 17 00:00:00 2001 From: Dan Wallis <dan@wallis.nz> Date: Tue, 30 May 2023 19:12:53 +0100 Subject: [PATCH 462/674] Wait for cron process to finish properly --- .../FunctionalTestingFramework/Module/MagentoWebDriver.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 54fecf7de..f2580deaf 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -1033,6 +1033,10 @@ private function executeCronjobs($cronGroups, $timeout, $arguments): string { $cronGroups = array_filter($cronGroups); + if (isset($cronGroups[0]) && !isset($cronGroups[1])) { + $arguments .= ' --bootstrap=standaloneProcessStarted=1'; + } + $waitFor = $this->getCronWait($cronGroups); if ($waitFor) { From 5dbb60f0bf2d7245ac126f57229e55c1149ab729 Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Wed, 31 May 2023 23:02:06 +0530 Subject: [PATCH 463/674] Release Checklist MFTF 4.3.1 --- CHANGELOG.md | 7 +++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f4d0466d..86452d120 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ Magento Functional Testing Framework Changelog ================================================ + +4.3.1 +--------- +### Fixes +* Fixed cannot bind closure to scope of internal class Exception. +* Fixed broken Mftf doctor command. + 4.3.0 --------- ### Enhancements diff --git a/composer.json b/composer.json index d6651abc9..26199a504 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": "4.3.0", + "version": "4.3.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 68bee06e7..8131637d3 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": "723f5ee4d66a45e6312b9b33b0490ba2", + "content-hash": "1cfdd64e0e61b92650826ed6b7378188", "packages": [ { "name": "allure-framework/allure-codeception", From 6e2dc63429befcc76c1780a79f47bfd8427ee2c7 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Thu, 1 Jun 2023 11:27:50 +0530 Subject: [PATCH 464/674] [ACQE-4318] Debugging testgroupmembership file generation --- .../Console/GenerateTestsCommand.php | 4 ++-- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index ee4f211cf..05e286c88 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -231,9 +231,9 @@ protected function execute(InputInterface $input, OutputInterface $output) $testManifest->createTestGroups($configNumber); } - SuiteGenerator::getInstance()->generateAllSuites($testManifest); - $testManifest->generate(); + + SuiteGenerator::getInstance()->generateAllSuites($testManifest); } catch (\Exception $e) { if (!empty(GenerationErrorHandler::getInstance()->getAllErrors())) { GenerationErrorHandler::getInstance()->printErrorSummary(); diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 637cf2eef..392f1a04e 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -175,7 +175,7 @@ public function generateTestgroupmembership($testManifest) if (is_dir($path)) { $groupFiles = glob("$path/group*.txt"); echo "Group files-> \n"; - print_r($groupFiles); + print_r($groupFiles); if ($groupFiles === false) { throw new RuntimeException("glob(): error with '$path'"); } From 33f58bd62420c7d53e0b88cd6b44811b0ec28232 Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Thu, 1 Jun 2023 12:01:39 +0530 Subject: [PATCH 465/674] ACQE-4951 : Handled Exception Serialization of weakMap is not allowed In Allure Helper.php Line 26 --- .../FunctionalTestingFramework/Allure/AllureHelper.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php b/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php index 8f7699ed0..c3a5a8cd4 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php +++ b/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php @@ -23,7 +23,11 @@ class AllureHelper public static function addAttachmentToCurrentStep($data, $caption): void { if (!is_string($data)) { - $data = serialize($data); + try { + $data = serialize($data); + } catch (Exception $exception) { + throw new \Exception($data->getMessage()); + } } if (@file_exists($data) && is_file($data)) { Allure::attachmentFile($caption, $data); From 6010fa7e0ccddc0e4f9e18da057571e996d69332 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Thu, 1 Jun 2023 14:29:27 +0530 Subject: [PATCH 466/674] [ACQE-4318] Debugging testgroupmembership file generation --- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 392f1a04e..8ac052bd3 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -95,6 +95,7 @@ public static function getInstance(): SuiteGenerator */ public function generateAllSuites($testManifest) { + $this->generateTestgroupmembership($testManifest); $suites = $testManifest->getSuiteConfig(); foreach ($suites as $suiteName => $suiteContent) { @@ -117,7 +118,7 @@ public function generateAllSuites($testManifest) // if our first element is an array we know that we have split the suites if (is_array($firstElement)) { $this->generateSplitSuiteFromTest($suiteName, $suiteContent); - $this->generateTestgroupmembership($testManifest); + } } catch (FastFailException $e) { throw $e; @@ -151,7 +152,8 @@ public function generateTestgroupmembership($testManifest) { // Get suits and subsuites data array $suites = $testManifest->getSuiteConfig(); - +echo "suites-> <pre>"; +print_r($suites); // Add subsuites array[2nd dimension] to main array[1st dimension] to access it directly later if(!empty($suites)) { foreach ($suites as $subSuites) { @@ -186,7 +188,6 @@ public function generateTestgroupmembership($testManifest) $groupNumber = 0; $allGroupsContent = array(); while(!empty($groupFiles)){ - echo "Group files not empty"; $group = array_pop($groupFiles); $allGroupsContent[$groupNumber] = file($group); $groupNumber++; @@ -202,8 +203,10 @@ public function generateTestgroupmembership($testManifest) foreach ($groupInfo as $testName) { // If file has -g then it is test suite if (str_contains($testName, '-g')) { + echo "testname-> $testName \n"; $suitename = explode(" ", $testName); $suitename[1] = trim($suitename[1]); + echo "$suitename-> $suitename[1] \n"; if(!empty($suites[$suitename[1]])) { foreach ($suites[$suitename[1]] as $key => $test) { $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); From efda9af1a6fa69694e6e59f2d19c5b8fc00fc238 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Fri, 2 Jun 2023 09:09:48 +0530 Subject: [PATCH 467/674] [ACQE-4318] Removing the extra EOL --- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 8ac052bd3..c4a47aedc 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -196,8 +196,7 @@ public function generateTestgroupmembership($testManifest) // Output file path $memberShipFilePath = $baseDir.'_generated/testgroupmembership.txt'; $testCaseNumber = 0; -echo "groups array-><pre>"; -print_r($allGroupsContent); + if(!empty($allGroupsContent)) { foreach ($allGroupsContent as $groupId => $groupInfo) { foreach ($groupInfo as $testName) { @@ -217,7 +216,7 @@ public function generateTestgroupmembership($testManifest) // It is default test group else { $defaultSuiteTest = sprintf('%s:%s:%s', $groupId, $testCaseNumber, $testName); - file_put_contents($memberShipFilePath, $defaultSuiteTest . PHP_EOL, FILE_APPEND); + file_put_contents($memberShipFilePath, $defaultSuiteTest, FILE_APPEND); } $testCaseNumber++; } From 1c75e9ba91b01447e3cbcaca3ceca08ba04c4c01 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Sat, 3 Jun 2023 12:59:28 +0530 Subject: [PATCH 468/674] [ACQE-4318] Removing echo and prints --- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index c4a47aedc..d4b8e74f7 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -152,8 +152,7 @@ public function generateTestgroupmembership($testManifest) { // Get suits and subsuites data array $suites = $testManifest->getSuiteConfig(); -echo "suites-> <pre>"; -print_r($suites); + // Add subsuites array[2nd dimension] to main array[1st dimension] to access it directly later if(!empty($suites)) { foreach ($suites as $subSuites) { @@ -176,8 +175,6 @@ public function generateTestgroupmembership($testManifest) // Read all group files if (is_dir($path)) { $groupFiles = glob("$path/group*.txt"); - echo "Group files-> \n"; - print_r($groupFiles); if ($groupFiles === false) { throw new RuntimeException("glob(): error with '$path'"); } @@ -202,10 +199,9 @@ public function generateTestgroupmembership($testManifest) foreach ($groupInfo as $testName) { // If file has -g then it is test suite if (str_contains($testName, '-g')) { - echo "testname-> $testName \n"; $suitename = explode(" ", $testName); $suitename[1] = trim($suitename[1]); - echo "$suitename-> $suitename[1] \n"; + if(!empty($suites[$suitename[1]])) { foreach ($suites[$suitename[1]] as $key => $test) { $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); From dc177d8851ba5465d576e08c00c9af34c02cae7c Mon Sep 17 00:00:00 2001 From: Pieter Hoste <hoste.pieter@gmail.com> Date: Sat, 3 Jun 2023 11:55:16 +0200 Subject: [PATCH 469/674] Fixed PHP 8.2 deprecation warnings: 'creation of dynamic property'. --- .../Util/UnusedEntityCheckTest.php | 24 +++++++++---------- .../Allure/Adapter/MagentoAllureAdapter.php | 7 +++++- .../Config/Reader.php | 6 ++--- .../ObjectManager/Config/Reader/Dom.php | 2 +- ...CreatedDataFromOutsideActionGroupCheck.php | 5 ++++ .../StaticCheck/UnusedEntityCheck.php | 12 +++++++++- .../Test/Objects/TestObject.php | 2 +- 7 files changed, 39 insertions(+), 19 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/UnusedEntityCheckTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/UnusedEntityCheckTest.php index c7a170d86..8d0d8995d 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/UnusedEntityCheckTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/UnusedEntityCheckTest.php @@ -42,11 +42,11 @@ public function testUnusedActiongroupFiles() public function testUnusedActiongroupFilesReturnedWhenActionXmlFilesAreNotEmpty() { - $this->scriptUtil = new ScriptUtil(); + $scriptUtil = new ScriptUtil(); $unusedEntityCheck = new UnusedEntityCheck(); $domDocument = new \DOMDocument(); - $modulePaths = $this->scriptUtil->getAllModulePaths(); - $actionGroupXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "ActionGroup"); + $modulePaths = $scriptUtil->getAllModulePaths(); + $actionGroupXmlFiles = $scriptUtil->getModuleXmlFilesByScope($modulePaths, "ActionGroup"); $actionGroupFiles = ['DeprecationCheckActionGroup' => '/verification/DeprecationCheckModule/ActionGroup/DeprecationCheckActionGroup.xml', 'ActionGroupWithMultiplePausesActionGroup'=> @@ -82,9 +82,9 @@ public function testUnusedSectionFiles() public function testUnusedSectionFilesReturnedWhenSectionXmlFilesAreNotEmpty() { $unusedEntityCheck = new UnusedEntityCheck(); - $this->scriptUtil = new ScriptUtil(); - $modulePaths = $this->scriptUtil->getAllModulePaths(); - $sectionXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Section"); + $scriptUtil = new ScriptUtil(); + $modulePaths = $scriptUtil->getAllModulePaths(); + $sectionXmlFiles = $scriptUtil->getModuleXmlFilesByScope($modulePaths, "Section"); $domDocument = new \DOMDocument(); $section = [ @@ -119,9 +119,9 @@ public function testUnusedPageFilesReturnedWhenPageXmlFilesPassedAreNotEmpty() { $unusedEntityCheck = new UnusedEntityCheck(); $domDocument = new \DOMDocument(); - $this->scriptUtil = new ScriptUtil(); - $modulePaths = $this->scriptUtil->getAllModulePaths(); - $pageXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Page"); + $scriptUtil = new ScriptUtil(); + $modulePaths = $scriptUtil->getAllModulePaths(); + $pageXmlFiles = $scriptUtil->getModuleXmlFilesByScope($modulePaths, "Page"); $page = [ 'DeprecationCheckPage' => '/verification/DeprecationCheckModule/Page/DeprecationCheckPage.xml', 'DeprecatedPage' => '/verification/TestModule/Page/DeprecatedPage.xml', @@ -164,9 +164,9 @@ public function testUnusedDataReturnedWhenCreateDataEntityAreNotEmpty() { $unusedEntityCheck = new UnusedEntityCheck(); $domDocument = new \DOMDocument(); - $this->scriptUtil = new ScriptUtil(); - $modulePaths = $this->scriptUtil->getAllModulePaths(); - $dataXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Data"); + $scriptUtil = new ScriptUtil(); + $modulePaths = $scriptUtil->getAllModulePaths(); + $dataXmlFiles = $scriptUtil->getModuleXmlFilesByScope($modulePaths, "Data"); $data = [ "simpleData" => [ diff --git a/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php b/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php index d5efbbc0f..485a86fe1 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php +++ b/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php @@ -42,6 +42,12 @@ class MagentoAllureAdapter extends AllureCodeception { const STEP_PASSED = "passed"; + + /** + * @var array + */ + private $options = []; + /** * Test files cache. * @@ -184,7 +190,6 @@ public function stepBefore(StepEvent $stepEvent) // Strip control characters so that report generation does not fail $stepName = preg_replace('/[[:cntrl:]]/', '', $stepName); - $this->emptyStep = false; $this->getLifecycle()->fire(new StepStartedEvent($stepName)); } diff --git a/src/Magento/FunctionalTestingFramework/Config/Reader.php b/src/Magento/FunctionalTestingFramework/Config/Reader.php index 0c996f14c..b627dec79 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Reader.php +++ b/src/Magento/FunctionalTestingFramework/Config/Reader.php @@ -48,9 +48,9 @@ public function __construct( $this->fileName = $fileName; $this->idAttributes = array_replace($this->idAttributes, $idAttributes); $this->schemaFile = $schemaLocator->getSchema(); - $this->isValidated = $validationState->isValidated(); - $this->perFileSchema = $schemaLocator->getPerFileSchema() && - $this->isValidated ? $schemaLocator->getPerFileSchema() : null; + $isValidated = $validationState->isValidated(); + $this->perFileSchema = $schemaLocator->getPerFileSchema() && $isValidated ? + $schemaLocator->getPerFileSchema() : null; $this->domDocumentClass = $domDocumentClass; $this->defaultScope = $defaultScope; } diff --git a/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Reader/Dom.php b/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Reader/Dom.php index 876e949cb..bcc897b4b 100644 --- a/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Reader/Dom.php +++ b/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Reader/Dom.php @@ -65,6 +65,6 @@ public function __construct( */ protected function _createConfigMerger($mergerClass, $initialContents) { - return new $mergerClass($initialContents, $this->_idAttributes, self::TYPE_ATTRIBUTE, $this->_perFileSchema); + return new $mergerClass($initialContents, $this->idAttributes, self::TYPE_ATTRIBUTE, $this->perFileSchema); } } diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php index 611e2946b..343e4dd8c 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/CreatedDataFromOutsideActionGroupCheck.php @@ -60,6 +60,11 @@ class CreatedDataFromOutsideActionGroupCheck implements StaticCheckInterface */ private $scriptUtil; + /** + * @var array + */ + private $actionGroupXmlFile = []; + /** * Checks test dependencies, determined by references in tests versus the dependencies listed in the Magento module * diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/UnusedEntityCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/UnusedEntityCheck.php index 50a348db0..d8d6979d5 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/UnusedEntityCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/UnusedEntityCheck.php @@ -37,6 +37,16 @@ class UnusedEntityCheck implements StaticCheckInterface */ private $scriptUtil; + /** + * @var array + */ + private $errors = []; + + /** + * @var string + */ + private $output = ''; + /** * Checks test dependencies, determined by references in tests versus the dependencies listed in the Magento module * @@ -625,7 +635,7 @@ public function getErrors() /** * Return output * - * @return array + * @return string */ public function getOutput() { diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php index 86b33285d..c92bff588 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/TestObject.php @@ -337,7 +337,7 @@ public function getAnnotationByName($name) */ public function getCustomData() { - return $this->customData; + return null; } /** From 4c1c6bd4cac1158371a4c9080314e6c9ad1d5019 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Sat, 3 Jun 2023 20:25:46 +0530 Subject: [PATCH 470/674] [ACQE-4318] Fixing static errors --- .../Suite/SuiteGenerator.php | 110 +++++++++--------- 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index d4b8e74f7..5b9197d4c 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -118,7 +118,6 @@ public function generateAllSuites($testManifest) // if our first element is an array we know that we have split the suites if (is_array($firstElement)) { $this->generateSplitSuiteFromTest($suiteName, $suiteContent); - } } catch (FastFailException $e) { throw $e; @@ -150,76 +149,75 @@ public function generateSuite($suiteName) */ public function generateTestgroupmembership($testManifest) { - // Get suits and subsuites data array - $suites = $testManifest->getSuiteConfig(); - - // Add subsuites array[2nd dimension] to main array[1st dimension] to access it directly later - if(!empty($suites)) { - foreach ($suites as $subSuites) { - if(!empty($subSuites)) { - foreach ($subSuites as $subSuiteName => $suiteTestNames) { - if (!is_numeric($subSuiteName)) { - $suites[$subSuiteName] = $suiteTestNames; - } else { - continue; + // Get suits and subsuites data array + $suites = $testManifest->getSuiteConfig(); + + // Add subsuites array[2nd dimension] to main array[1st dimension] to access it directly later + if (!empty($suites)) { + foreach ($suites as $subSuites) { + if (!empty($subSuites)) { + foreach ($subSuites as $subSuiteName => $suiteTestNames) { + if (!is_numeric($subSuiteName)) { + $suites[$subSuiteName] = $suiteTestNames; + } else { + continue; + } } } } } - } - // Path to groups folder - $baseDir = FilePathFormatter::format(TESTS_MODULE_PATH); - $path = $baseDir .'_generated/groups'; + // Path to groups folder + $baseDir = FilePathFormatter::format(TESTS_MODULE_PATH); + $path = $baseDir .'_generated/groups'; - // Read all group files - if (is_dir($path)) { - $groupFiles = glob("$path/group*.txt"); - if ($groupFiles === false) { - throw new RuntimeException("glob(): error with '$path'"); + // Read all group files + if (is_dir($path)) { + $groupFiles = glob("$path/group*.txt"); + if ($groupFiles === false) { + throw new RuntimeException("glob(): error with '$path'"); + } + sort($groupFiles, SORT_NATURAL); } - sort($groupFiles, SORT_NATURAL); - } - // Read each file in the reverse order and form an array with groupId as key - $groupNumber = 0; - $allGroupsContent = array(); - while(!empty($groupFiles)){ - $group = array_pop($groupFiles); - $allGroupsContent[$groupNumber] = file($group); - $groupNumber++; - } + // Read each file in the reverse order and form an array with groupId as key + $groupNumber = 0; + $allGroupsContent = []; + while (!empty($groupFiles)) { + $group = array_pop($groupFiles); + $allGroupsContent[$groupNumber] = file($group); + $groupNumber++; + } - // Output file path - $memberShipFilePath = $baseDir.'_generated/testgroupmembership.txt'; - $testCaseNumber = 0; - - if(!empty($allGroupsContent)) { - foreach ($allGroupsContent as $groupId => $groupInfo) { - foreach ($groupInfo as $testName) { - // If file has -g then it is test suite - if (str_contains($testName, '-g')) { - $suitename = explode(" ", $testName); - $suitename[1] = trim($suitename[1]); - - if(!empty($suites[$suitename[1]])) { - foreach ($suites[$suitename[1]] as $key => $test) { - $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); - file_put_contents($memberShipFilePath, $suiteTest . PHP_EOL, FILE_APPEND); + // Output file path + $memberShipFilePath = $baseDir.'_generated/testgroupmembership.txt'; + $testCaseNumber = 0; + + if (!empty($allGroupsContent)) { + foreach ($allGroupsContent as $groupId => $groupInfo) { + foreach ($groupInfo as $testName) { + // If file has -g then it is test suite + if (str_contains($testName, '-g')) { + $suitename = explode(" ", $testName); + $suitename[1] = trim($suitename[1]); + + if (!empty($suites[$suitename[1]])) { + foreach ($suites[$suitename[1]] as $key => $test) { + $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); + file_put_contents($memberShipFilePath, $suiteTest . PHP_EOL, FILE_APPEND); + } } } + else { + $defaultSuiteTest = sprintf('%s:%s:%s', $groupId, $testCaseNumber, $testName); + file_put_contents($memberShipFilePath, $defaultSuiteTest, FILE_APPEND); + } + $testCaseNumber++; } - // It is default test group - else { - $defaultSuiteTest = sprintf('%s:%s:%s', $groupId, $testCaseNumber, $testName); - file_put_contents($memberShipFilePath, $defaultSuiteTest, FILE_APPEND); - } - $testCaseNumber++; + $testCaseNumber = 0; } - $testCaseNumber = 0; } } - } /** * Function which takes a suite name and a set of test names. The function then generates all relevant supporting From b834629b65f62695f356d8107305984e48fd7407 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Sat, 3 Jun 2023 20:35:21 +0530 Subject: [PATCH 471/674] [ACQE-4318] Fixing indentation errors --- .../Suite/SuiteGenerator.php | 120 +++++++++--------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 5b9197d4c..edad03e72 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -149,74 +149,74 @@ public function generateSuite($suiteName) */ public function generateTestgroupmembership($testManifest) { - // Get suits and subsuites data array - $suites = $testManifest->getSuiteConfig(); - - // Add subsuites array[2nd dimension] to main array[1st dimension] to access it directly later - if (!empty($suites)) { - foreach ($suites as $subSuites) { - if (!empty($subSuites)) { - foreach ($subSuites as $subSuiteName => $suiteTestNames) { - if (!is_numeric($subSuiteName)) { - $suites[$subSuiteName] = $suiteTestNames; - } else { - continue; - } + // Get suits and subsuites data array + $suites = $testManifest->getSuiteConfig(); + + // Add subsuites array[2nd dimension] to main array[1st dimension] to access it directly later + if (!empty($suites)) { + foreach ($suites as $subSuites) { + if (!empty($subSuites)) { + foreach ($subSuites as $subSuiteName => $suiteTestNames) { + if (!is_numeric($subSuiteName)) { + $suites[$subSuiteName] = $suiteTestNames; + } else { + continue; + } + } + } } - } } - } - // Path to groups folder - $baseDir = FilePathFormatter::format(TESTS_MODULE_PATH); - $path = $baseDir .'_generated/groups'; + // Path to groups folder + $baseDir = FilePathFormatter::format(TESTS_MODULE_PATH); + $path = $baseDir .'_generated/groups'; + + // Read all group files + if (is_dir($path)) { + $groupFiles = glob("$path/group*.txt"); + if ($groupFiles === false) { + throw new RuntimeException("glob(): error with '$path'"); + } + sort($groupFiles, SORT_NATURAL); + } - // Read all group files - if (is_dir($path)) { - $groupFiles = glob("$path/group*.txt"); - if ($groupFiles === false) { - throw new RuntimeException("glob(): error with '$path'"); + // Read each file in the reverse order and form an array with groupId as key + $groupNumber = 0; + $allGroupsContent = []; + while (!empty($groupFiles)) { + $group = array_pop($groupFiles); + $allGroupsContent[$groupNumber] = file($group); + $groupNumber++; } - sort($groupFiles, SORT_NATURAL); - } - - // Read each file in the reverse order and form an array with groupId as key - $groupNumber = 0; - $allGroupsContent = []; - while (!empty($groupFiles)) { - $group = array_pop($groupFiles); - $allGroupsContent[$groupNumber] = file($group); - $groupNumber++; - } - - // Output file path - $memberShipFilePath = $baseDir.'_generated/testgroupmembership.txt'; - $testCaseNumber = 0; - - if (!empty($allGroupsContent)) { - foreach ($allGroupsContent as $groupId => $groupInfo) { - foreach ($groupInfo as $testName) { - // If file has -g then it is test suite - if (str_contains($testName, '-g')) { - $suitename = explode(" ", $testName); - $suitename[1] = trim($suitename[1]); - - if (!empty($suites[$suitename[1]])) { - foreach ($suites[$suitename[1]] as $key => $test) { - $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); - file_put_contents($memberShipFilePath, $suiteTest . PHP_EOL, FILE_APPEND); + + // Output file path + $memberShipFilePath = $baseDir.'_generated/testgroupmembership.txt'; + $testCaseNumber = 0; + + if (!empty($allGroupsContent)) { + foreach ($allGroupsContent as $groupId => $groupInfo) { + foreach ($groupInfo as $testName) { + // If file has -g then it is test suite + if (str_contains($testName, '-g')) { + $suitename = explode(" ", $testName); + $suitename[1] = trim($suitename[1]); + + if (!empty($suites[$suitename[1]])) { + foreach ($suites[$suitename[1]] as $key => $test) { + $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); + file_put_contents($memberShipFilePath, $suiteTest . PHP_EOL, FILE_APPEND); + } + } } - } - } - else { - $defaultSuiteTest = sprintf('%s:%s:%s', $groupId, $testCaseNumber, $testName); - file_put_contents($memberShipFilePath, $defaultSuiteTest, FILE_APPEND); + else { + $defaultSuiteTest = sprintf('%s:%s:%s', $groupId, $testCaseNumber, $testName); + file_put_contents($memberShipFilePath, $defaultSuiteTest, FILE_APPEND); + } + $testCaseNumber++; + } + $testCaseNumber = 0; } - $testCaseNumber++; - } - $testCaseNumber = 0; } - } } /** From 629ac1b147117858bf2e5663c8b0ec3811cf1730 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Sat, 3 Jun 2023 20:37:49 +0530 Subject: [PATCH 472/674] [ACQE-4318] Fixing indentation errors --- .../Suite/SuiteGenerator.php | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index edad03e72..202662061 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -196,23 +196,23 @@ public function generateTestgroupmembership($testManifest) if (!empty($allGroupsContent)) { foreach ($allGroupsContent as $groupId => $groupInfo) { foreach ($groupInfo as $testName) { - // If file has -g then it is test suite - if (str_contains($testName, '-g')) { - $suitename = explode(" ", $testName); - $suitename[1] = trim($suitename[1]); - - if (!empty($suites[$suitename[1]])) { - foreach ($suites[$suitename[1]] as $key => $test) { - $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); - file_put_contents($memberShipFilePath, $suiteTest . PHP_EOL, FILE_APPEND); + // If file has -g then it is test suite + if (str_contains($testName, '-g')) { + $suitename = explode(" ", $testName); + $suitename[1] = trim($suitename[1]); + + if (!empty($suites[$suitename[1]])) { + foreach ($suites[$suitename[1]] as $key => $test) { + $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); + file_put_contents($memberShipFilePath, $suiteTest . PHP_EOL, FILE_APPEND); + } } } - } - else { - $defaultSuiteTest = sprintf('%s:%s:%s', $groupId, $testCaseNumber, $testName); - file_put_contents($memberShipFilePath, $defaultSuiteTest, FILE_APPEND); - } - $testCaseNumber++; + else { + $defaultSuiteTest = sprintf('%s:%s:%s', $groupId, $testCaseNumber, $testName); + file_put_contents($memberShipFilePath, $defaultSuiteTest, FILE_APPEND); + } + $testCaseNumber++; } $testCaseNumber = 0; } From 795d08bdbc0ceefd719c68191a1a1cfbbc5e1440 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Sat, 3 Jun 2023 20:40:46 +0530 Subject: [PATCH 473/674] [ACQE-4318] Fixing indentation errors --- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 202662061..da98930ff 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -203,12 +203,11 @@ public function generateTestgroupmembership($testManifest) if (!empty($suites[$suitename[1]])) { foreach ($suites[$suitename[1]] as $key => $test) { - $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); - file_put_contents($memberShipFilePath, $suiteTest . PHP_EOL, FILE_APPEND); + $suiteTest = sprintf('%s:%s:%s:%s', $groupId, $key, $suitename[1], $test); + file_put_contents($memberShipFilePath, $suiteTest . PHP_EOL, FILE_APPEND); } } - } - else { + } else { $defaultSuiteTest = sprintf('%s:%s:%s', $groupId, $testCaseNumber, $testName); file_put_contents($memberShipFilePath, $defaultSuiteTest, FILE_APPEND); } From 0b2cea48fe0d27c5251d7bf0d4d9f8f41fa7facb Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Sat, 3 Jun 2023 21:27:14 +0530 Subject: [PATCH 474/674] [ACQE-4318] Optimizing the code --- .../Suite/SuiteGenerator.php | 93 ++++++++++++------- 1 file changed, 58 insertions(+), 35 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index da98930ff..1d93e62d0 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -147,47 +147,15 @@ public function generateSuite($suiteName) * @return void * @throws \Exception */ - public function generateTestgroupmembership($testManifest) + public function generateTestgroupmembership($testManifest): void { - // Get suits and subsuites data array - $suites = $testManifest->getSuiteConfig(); - - // Add subsuites array[2nd dimension] to main array[1st dimension] to access it directly later - if (!empty($suites)) { - foreach ($suites as $subSuites) { - if (!empty($subSuites)) { - foreach ($subSuites as $subSuiteName => $suiteTestNames) { - if (!is_numeric($subSuiteName)) { - $suites[$subSuiteName] = $suiteTestNames; - } else { - continue; - } - } - } - } - } + $suites = $this->getSuitesDetails($testManifest); // Path to groups folder $baseDir = FilePathFormatter::format(TESTS_MODULE_PATH); $path = $baseDir .'_generated/groups'; - // Read all group files - if (is_dir($path)) { - $groupFiles = glob("$path/group*.txt"); - if ($groupFiles === false) { - throw new RuntimeException("glob(): error with '$path'"); - } - sort($groupFiles, SORT_NATURAL); - } - - // Read each file in the reverse order and form an array with groupId as key - $groupNumber = 0; - $allGroupsContent = []; - while (!empty($groupFiles)) { - $group = array_pop($groupFiles); - $allGroupsContent[$groupNumber] = file($group); - $groupNumber++; - } + $allGroupsContent = $this->readAllGroupFiles($path); // Output file path $memberShipFilePath = $baseDir.'_generated/testgroupmembership.txt'; @@ -218,6 +186,61 @@ public function generateTestgroupmembership($testManifest) } } + /** + * Function to format suites details + * + * @param object $testManifest + * @return array $suites + */ + private function getSuitesDetails($testManifest): array + { + // Get suits and subsuites data array + $suites = $testManifest->getSuiteConfig(); + + // Add subsuites array[2nd dimension] to main array[1st dimension] to access it directly later + if (!empty($suites)) { + foreach ($suites as $subSuites) { + if (!empty($subSuites)) { + foreach ($subSuites as $subSuiteName => $suiteTestNames) { + if (!is_numeric($subSuiteName)) { + $suites[$subSuiteName] = $suiteTestNames; + } else { + continue; + } + } + } + } + } + return $suites; + } + + /** + * Function to read all group* text files inside /groups folder + * + * @param object $path + * @return array $allGroupsContent + */ + private function readAllGroupFiles($path): array + { + // Read all group files + if (is_dir($path)) { + $groupFiles = glob("$path/group*.txt"); + if ($groupFiles === false) { + throw new RuntimeException("glob(): error with '$path'"); + } + sort($groupFiles, SORT_NATURAL); + } + + // Read each file in the reverse order and form an array with groupId as key + $groupNumber = 0; + $allGroupsContent = []; + while (!empty($groupFiles)) { + $group = array_pop($groupFiles); + $allGroupsContent[$groupNumber] = file($group); + $groupNumber++; + } + return $allGroupsContent; + } /** * Function which takes a suite name and a set of test names. The function then generates all relevant supporting * files and classes for the suite. The function takes an optional argument for suites which are split by a parallel From 90ec67aeb93dd5ae44e3052a213269f31b77fabc Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Sat, 3 Jun 2023 23:05:01 +0530 Subject: [PATCH 475/674] [ACQE-4318] Fixing indentation errors --- .../Suite/SuiteGenerator.php | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 1d93e62d0..0fda94e82 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -199,17 +199,17 @@ private function getSuitesDetails($testManifest): array // Add subsuites array[2nd dimension] to main array[1st dimension] to access it directly later if (!empty($suites)) { - foreach ($suites as $subSuites) { - if (!empty($subSuites)) { - foreach ($subSuites as $subSuiteName => $suiteTestNames) { - if (!is_numeric($subSuiteName)) { - $suites[$subSuiteName] = $suiteTestNames; - } else { - continue; + foreach ($suites as $subSuites) { + if (!empty($subSuites)) { + foreach ($subSuites as $subSuiteName => $suiteTestNames) { + if (!is_numeric($subSuiteName)) { + $suites[$subSuiteName] = $suiteTestNames; + } else { + continue; + } + } } - } } - } } return $suites; } @@ -224,23 +224,24 @@ private function readAllGroupFiles($path): array { // Read all group files if (is_dir($path)) { - $groupFiles = glob("$path/group*.txt"); - if ($groupFiles === false) { - throw new RuntimeException("glob(): error with '$path'"); - } - sort($groupFiles, SORT_NATURAL); + $groupFiles = glob("$path/group*.txt"); + if ($groupFiles === false) { + throw new RuntimeException("glob(): error with '$path'"); + } + sort($groupFiles, SORT_NATURAL); } // Read each file in the reverse order and form an array with groupId as key $groupNumber = 0; $allGroupsContent = []; while (!empty($groupFiles)) { - $group = array_pop($groupFiles); - $allGroupsContent[$groupNumber] = file($group); - $groupNumber++; + $group = array_pop($groupFiles); + $allGroupsContent[$groupNumber] = file($group); + $groupNumber++; } return $allGroupsContent; } + /** * Function which takes a suite name and a set of test names. The function then generates all relevant supporting * files and classes for the suite. The function takes an optional argument for suites which are split by a parallel From 17ea56223417ebae796f59117322fa7e7993940e Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 5 Jun 2023 09:48:36 +0530 Subject: [PATCH 476/674] Update TestContextExtension.php --- .../Extension/TestContextExtension.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index 1ac155092..33c8cea0e 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -188,7 +188,9 @@ function (TestResult $testResult) use ($groupName, $cest) { $label->setValue(sprintf('%s\%s', $label->getValue(), $groupName)); } if ($label->getName() === "package") { - $label->setValue($cest->getReportFields()['class']); + $className = $cest->getReportFields()['class']; + $className = str_replace('\_default', '', $className); + $label->setValue($className); } } } From 540746cb0c8929cd4ff29e4a2a097bb5e172a5e9 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Wed, 7 Jun 2023 08:43:11 +0530 Subject: [PATCH 477/674] Update TestContextExtension.php --- .../Extension/TestContextExtension.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index 33c8cea0e..a4f9461df 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -189,7 +189,6 @@ function (TestResult $testResult) use ($groupName, $cest) { } if ($label->getName() === "package") { $className = $cest->getReportFields()['class']; - $className = str_replace('\_default', '', $className); $label->setValue($className); } } From 1f8137d829fd781d8b1e9c883ba40d6e3d5d4c21 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Wed, 7 Jun 2023 18:09:27 +0530 Subject: [PATCH 478/674] Update AllureHelper.php --- src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php b/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php index c3a5a8cd4..6e6498e62 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php +++ b/src/Magento/FunctionalTestingFramework/Allure/AllureHelper.php @@ -25,7 +25,7 @@ public static function addAttachmentToCurrentStep($data, $caption): void if (!is_string($data)) { try { $data = serialize($data); - } catch (Exception $exception) { + } catch (\Exception $exception) { throw new \Exception($data->getMessage()); } } From 605055a38a8035537823a78f546a030f9a5d5fb4 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Wed, 7 Jun 2023 21:07:12 +0530 Subject: [PATCH 479/674] Update TestContextExtension.php --- .../Extension/TestContextExtension.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php index a4f9461df..5f850a403 100644 --- a/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php +++ b/src/Magento/FunctionalTestingFramework/Extension/TestContextExtension.php @@ -189,6 +189,7 @@ function (TestResult $testResult) use ($groupName, $cest) { } if ($label->getName() === "package") { $className = $cest->getReportFields()['class']; + $className = preg_replace('{_[0-9]*_G}', '', $className); $label->setValue($className); } } From ca63d9f41762c7a39562683664b49608080dc984 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 12 Jun 2023 07:48:18 +0530 Subject: [PATCH 480/674] Update TestGeneratorTest.php --- .../Magento/FunctionalTestFramework/Util/TestGeneratorTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 9808c516b..490548f6c 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -347,7 +347,7 @@ public function testIfExceptionThrownWhenDuplicateArgumentsFound() ); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); $this->expectException(TestFrameworkException::class); - $testGeneratorObject->throwExceptionIfDuplicateArgumentsFound($fileContents); + $testGeneratorObject->throwExceptionIfDuplicateArgumentsFound($fileContents, $test1); } /** From 81e328a547a7a08f2a4f570a3978e66bdb1f549e Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:00:57 +0530 Subject: [PATCH 481/674] Update TestGenerator.php --- .../Util/TestGenerator.php | 80 ++++++++++++------- 1 file changed, 50 insertions(+), 30 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index a64d3137c..3d5afb871 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -247,48 +247,68 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) $this->createCestFile($testPhpFile[1], $testPhpFile[0]); } } + /** * Throw exception if duplicate arguments found * * @param string $fileContents - * @param string $fileName + * @param TestObject $testObject * @return void * @throws TestFrameworkException */ - public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, string $fileName = ''): void + public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, TestObject $testObject): void { - $fileToArr = explode("\n", $fileContents); - $argumentArray = []; - $actionGroupStart = false; - foreach ($fileToArr as $fileVal) { - $fileVal = trim($fileVal); - if (str_starts_with($fileVal, '<actionGroup') && !str_ends_with($fileVal, '/>')) { - $actionGroupStart = true; + $parsedSteps = $testObject->getUnresolvedSteps(); + foreach ($parsedSteps as $parsedStep) { + if( + $parsedStep->getType() !== 'actionGroup' && + $parsedStep->getType() !== 'helper' + ) { continue; } - if ($fileVal === '</actionGroup>') { - $argumentNameArray = []; - foreach ($argumentArray as $argument) { - $subtringStart = strpos($argument, 'name='); - $subtringStart += strlen('name='); - $size = strpos($argument, ' ', $subtringStart) - $subtringStart; - $argumentName = substr($argument, $subtringStart, $size); - if (in_array($argumentName, $argumentNameArray)) { - $err[] = sprintf( - 'Duplicate argument for actiongroup with name: %s in test file: %s', - $argumentName, - $fileName - ); - throw new TestFrameworkException(implode(PHP_EOL, $err)); - } - $argumentNameArray[] = $argumentName; - } - $argumentArray = []; - $actionGroupStart = false; + $attributesActions = $parsedStep->getCustomActionAttributes(); + if (!key_exists('arguments', $attributesActions)) { continue; } - if ($actionGroupStart) { - $argumentArray[] = $fileVal; + $arguments = $attributesActions['arguments']; + $stepKey = $parsedStep->getStepKey(); + + $fileToArr = explode("\n", $fileContents); + $actionGroupStart = false; + $argumentArray = []; + foreach ($fileToArr as $fileVal) { + $fileVal = trim($fileVal); + if ( + (str_contains($fileVal, '<actionGroup') || str_contains($fileVal, '<helper')) && + str_contains($fileVal, $stepKey) + ) { + $actionGroupStart = true; + continue; + } + if (str_contains($fileVal, '</actionGroup') || str_contains($fileVal, '</helper')) { + foreach ($arguments as $argumentName => $argumentValue) { + $argumentCounter = 0; + foreach ($argumentArray as $rawArgument) { + if (str_contains($rawArgument, '<argument') && str_contains($rawArgument, $argumentName)){ + $argumentCounter++; + } + if ($argumentCounter > 1) { + $err[] = sprintf( + 'Duplicate argument(%s) for stepKey: %s in test file: %s', + $argumentName, + $stepKey, + $testObject->getFileName() + ); + throw new TestFrameworkException(implode(PHP_EOL, $err)); + } + } + $actionGroupStart = false; + $argumentArray = []; + } + } + if ($actionGroupStart) { + $argumentArray[] = $fileVal; + } } } } From 715fb205ec58f29c78d3c89eb015efb8b2bcd0ad Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:03:56 +0530 Subject: [PATCH 482/674] Update TestGeneratorTest.php --- .../Magento/FunctionalTestFramework/Util/TestGeneratorTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 490548f6c..26306df74 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -394,7 +394,7 @@ public function testIfExceptionNotThrownWhenDuplicateArgumentsNotFound() 'filename' ); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); - $result = $testGeneratorObject->throwExceptionIfDuplicateArgumentsFound($fileContents); + $result = $testGeneratorObject->throwExceptionIfDuplicateArgumentsFound($fileContents, $test1); $this->assertEquals($result, ""); } From eb5695816e1c2aa031a193a7f46ca428603e72ac Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:05:21 +0530 Subject: [PATCH 483/674] Update TestGenerator.php --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 3d5afb871..13848dfa8 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -250,7 +250,6 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) /** * Throw exception if duplicate arguments found - * * @param string $fileContents * @param TestObject $testObject * @return void From 0187d4b10669c343e623563333b7130b049b87b5 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:08:01 +0530 Subject: [PATCH 484/674] Update TestGenerator.php --- .../Util/TestGenerator.php | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 13848dfa8..6a70eeca7 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -259,10 +259,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, Te { $parsedSteps = $testObject->getUnresolvedSteps(); foreach ($parsedSteps as $parsedStep) { - if( - $parsedStep->getType() !== 'actionGroup' && - $parsedStep->getType() !== 'helper' - ) { + if ($parsedStep->getType() !== 'actionGroup' && $parsedStep->getType() !== 'helper') { continue; } $attributesActions = $parsedStep->getCustomActionAttributes(); @@ -277,10 +274,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, Te $argumentArray = []; foreach ($fileToArr as $fileVal) { $fileVal = trim($fileVal); - if ( - (str_contains($fileVal, '<actionGroup') || str_contains($fileVal, '<helper')) && - str_contains($fileVal, $stepKey) - ) { + if ((str_contains($fileVal, '<actionGroup') || str_contains($fileVal, '<helper')) && str_contains($fileVal, $stepKey)) { $actionGroupStart = true; continue; } @@ -288,7 +282,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, Te foreach ($arguments as $argumentName => $argumentValue) { $argumentCounter = 0; foreach ($argumentArray as $rawArgument) { - if (str_contains($rawArgument, '<argument') && str_contains($rawArgument, $argumentName)){ + if (str_contains($rawArgument, '<argument') && str_contains($rawArgument, $argumentName)) { $argumentCounter++; } if ($argumentCounter > 1) { From d44fdaaf7185753c754562f9a7f518d961a32fd5 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:12:06 +0530 Subject: [PATCH 485/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 6a70eeca7..b1f532d0f 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -250,7 +250,7 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) /** * Throw exception if duplicate arguments found - * @param string $fileContents + * @param string $fileContents * @param TestObject $testObject * @return void * @throws TestFrameworkException @@ -274,7 +274,8 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, Te $argumentArray = []; foreach ($fileToArr as $fileVal) { $fileVal = trim($fileVal); - if ((str_contains($fileVal, '<actionGroup') || str_contains($fileVal, '<helper')) && str_contains($fileVal, $stepKey)) { + if ((str_contains($fileVal, '<actionGroup') || str_contains($fileVal, '<helper')) && + str_contains($fileVal, $stepKey)) { $actionGroupStart = true; continue; } From decf6302be4581efc99ebf81321e35aea1c9898a Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:13:40 +0530 Subject: [PATCH 486/674] Update TestGenerator.php --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index b1f532d0f..2ae5f4446 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -274,7 +274,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, Te $argumentArray = []; foreach ($fileToArr as $fileVal) { $fileVal = trim($fileVal); - if ((str_contains($fileVal, '<actionGroup') || str_contains($fileVal, '<helper')) && + if ((str_contains($fileVal, '<actionGroup') || str_contains($fileVal, '<helper')) && str_contains($fileVal, $stepKey)) { $actionGroupStart = true; continue; From c873e2b80deeb45559d08aea904bd20c8976ab9c Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:18:08 +0530 Subject: [PATCH 487/674] Update TestGenerator.php --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 2ae5f4446..ff7b08a60 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -255,7 +255,7 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) * @return void * @throws TestFrameworkException */ - public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, TestObject $testObject): void + public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, $testObject): void { $parsedSteps = $testObject->getUnresolvedSteps(); foreach ($parsedSteps as $parsedStep) { From f3a196afe3a08115504863b824d14b0f5358a408 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:23:12 +0530 Subject: [PATCH 488/674] Update TestGenerator.php --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index ff7b08a60..ee4145714 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -257,6 +257,9 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) */ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, $testObject): void { + if (!($testObject instanceof TestObject)) { + return; + } $parsedSteps = $testObject->getUnresolvedSteps(); foreach ($parsedSteps as $parsedStep) { if ($parsedStep->getType() !== 'actionGroup' && $parsedStep->getType() !== 'helper') { From ad0ca00c431df27b0bdd8cf1799371be9c7f1fb3 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:53:09 +0530 Subject: [PATCH 489/674] Update TestGenerator.php --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index ee4145714..4594e57e8 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -286,7 +286,7 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, $t foreach ($arguments as $argumentName => $argumentValue) { $argumentCounter = 0; foreach ($argumentArray as $rawArgument) { - if (str_contains($rawArgument, '<argument') && str_contains($rawArgument, $argumentName)) { + if (str_contains($rawArgument, '<argument') && str_contains($rawArgument, 'name="'.$argumentName.'"')) { $argumentCounter++; } if ($argumentCounter > 1) { From 3a269942874d8d348939a746fcb9bd74c05227be Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 12 Jun 2023 08:59:16 +0530 Subject: [PATCH 490/674] Update TestGenerator.php --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 4594e57e8..84df3c7bf 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -286,7 +286,8 @@ public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, $t foreach ($arguments as $argumentName => $argumentValue) { $argumentCounter = 0; foreach ($argumentArray as $rawArgument) { - if (str_contains($rawArgument, '<argument') && str_contains($rawArgument, 'name="'.$argumentName.'"')) { + if (str_contains($rawArgument, '<argument') && + str_contains($rawArgument, 'name="'.$argumentName.'"')) { $argumentCounter++; } if ($argumentCounter > 1) { From 10a03d5ab18e00a90412574ec5577fcd0294b5da Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Fri, 16 Jun 2023 12:29:48 +0530 Subject: [PATCH 491/674] 4.3.2-Release-Checklist : MFTF release --- CHANGELOG.md | 9 +++++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86452d120..cfd9a6e86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ Magento Functional Testing Framework Changelog ================================================ +4.3.2 +--------- +### Enhancements +* 'bootstrap' argument added to indicate that no additional background processes will be run and the jobs complete in the foreground process. + +### Fixes +* Fixed serialization of weakmap exception thrown for every internal exception after codeception upgrade. +* Fixed suites no longer separated by MFTF Suite. + 4.3.1 --------- ### Fixes diff --git a/composer.json b/composer.json index 26199a504..96105c4b0 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": "4.3.1", + "version": "4.3.2", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 8131637d3..ec7e440cd 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": "1cfdd64e0e61b92650826ed6b7378188", + "content-hash": "b3c3ad8cbe0e410841d4c61f9cd36a55", "packages": [ { "name": "allure-framework/allure-codeception", From 91e52679afd2ce6c643a4e519306a8963645c697 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Thu, 20 Jul 2023 08:36:56 +0530 Subject: [PATCH 492/674] Update TestGenerator.php --- .../FunctionalTestingFramework/Util/TestGenerator.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 84df3c7bf..e832bbfe3 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -255,11 +255,16 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) * @return void * @throws TestFrameworkException */ - public function throwExceptionIfDuplicateArgumentsFound(string $fileContents, $testObject): void + public function throwExceptionIfDuplicateArgumentsFound($testObject): void { if (!($testObject instanceof TestObject)) { return; } + $fileName = $testObject->getFilename(); + if (!empty($fileName) && file_exists($fileName)) { + return; + } + $parsedSteps = $testObject->getUnresolvedSteps(); foreach ($parsedSteps as $parsedStep) { if ($parsedStep->getType() !== 'actionGroup' && $parsedStep->getType() !== 'helper') { From c5d7994ff7324bb54ad7d6634203aa9f3d703313 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Thu, 20 Jul 2023 08:38:15 +0530 Subject: [PATCH 493/674] Update TestGeneratorTest.php --- .../FunctionalTestFramework/Util/TestGeneratorTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 26306df74..1e22aeb46 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -347,7 +347,7 @@ public function testIfExceptionThrownWhenDuplicateArgumentsFound() ); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); $this->expectException(TestFrameworkException::class); - $testGeneratorObject->throwExceptionIfDuplicateArgumentsFound($fileContents, $test1); + $testGeneratorObject->throwExceptionIfDuplicateArgumentsFound($testGeneratorObject); } /** @@ -394,7 +394,7 @@ public function testIfExceptionNotThrownWhenDuplicateArgumentsNotFound() 'filename' ); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); - $result = $testGeneratorObject->throwExceptionIfDuplicateArgumentsFound($fileContents, $test1); + $result = $testGeneratorObject->throwExceptionIfDuplicateArgumentsFound($testGeneratorObject); $this->assertEquals($result, ""); } From 854eb39a321d2efe3617fa8ccca61ad2137fd160 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Thu, 20 Jul 2023 08:40:01 +0530 Subject: [PATCH 494/674] Update TestGenerator.php --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index e832bbfe3..57e5642c3 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -250,7 +250,6 @@ public function createAllTestFiles($testManifest = null, $testsToIgnore = null) /** * Throw exception if duplicate arguments found - * @param string $fileContents * @param TestObject $testObject * @return void * @throws TestFrameworkException From 1fbd49fc8fb368280129634359d375358f35a895 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Thu, 20 Jul 2023 09:20:38 +0530 Subject: [PATCH 495/674] Update TestGenerator.php --- src/Magento/FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 57e5642c3..0dfb0f8ee 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -263,7 +263,7 @@ public function throwExceptionIfDuplicateArgumentsFound($testObject): void if (!empty($fileName) && file_exists($fileName)) { return; } - + $fileContents = file_get_contents($fileName); $parsedSteps = $testObject->getUnresolvedSteps(); foreach ($parsedSteps as $parsedStep) { if ($parsedStep->getType() !== 'actionGroup' && $parsedStep->getType() !== 'helper') { From 9a4617dc0b3834edc45b65b776a2aaa6e920b96b Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Thu, 20 Jul 2023 09:33:35 +0530 Subject: [PATCH 496/674] Update TestGeneratorTest.php --- .../FunctionalTestFramework/Util/TestGeneratorTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 1e22aeb46..e8e3a4338 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -346,8 +346,8 @@ public function testIfExceptionThrownWhenDuplicateArgumentsFound() 'filename' ); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); - $this->expectException(TestFrameworkException::class); - $testGeneratorObject->throwExceptionIfDuplicateArgumentsFound($testGeneratorObject); + $result = $testGeneratorObject->throwExceptionIfDuplicateArgumentsFound($testGeneratorObject); + $this->assertEquals($result, ""); } /** From 0b5df1258e7535e6fa0b5ecea95a3c039afc146f Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Mon, 24 Jul 2023 10:45:25 -0500 Subject: [PATCH 497/674] ACQE-5089 * Added warnings to test dependency check --- .../StaticCheck/TestDependencyCheck.php | 46 ++++++++++++++++++- .../Util/Script/ScriptUtil.php | 26 +++++++++-- 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php index 848b2c463..81528f22a 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php @@ -24,8 +24,11 @@ class TestDependencyCheck implements StaticCheckInterface const EXTENDS_REGEX_PATTERN = '/extends=["\']([^\'"]*)/'; const ACTIONGROUP_REGEX_PATTERN = '/ref=["\']([^\'"]*)/'; - const ERROR_LOG_FILENAME = 'mftf-dependency-checks'; + const ERROR_LOG_FILENAME = 'mftf-dependency-checks-errors'; const ERROR_LOG_MESSAGE = 'MFTF File Dependency Check'; + const WARNING_LOG_FILENAME = 'mftf-dependency-checks-warnings'; + + const ALLOW_LIST_FILENAME = 'test-dependency-allowlist'; /** * Array of FullModuleName => [dependencies], including flattened dependency tree @@ -51,6 +54,17 @@ class TestDependencyCheck implements StaticCheckInterface */ private $errors = []; + /** + * Array containing all warnings found after running the execute() function. + * @var array + */ + private $warnings = []; + /** + * Array containing warnings found while iterating through files + * @var array + */ + private $tempWarnings = []; + /** * String representing the output summary found after running the execute() function. * @var string @@ -75,6 +89,11 @@ class TestDependencyCheck implements StaticCheckInterface */ private $testDependencyUtil; + /** + * @var array $allowFailureEntities + */ + private $allowFailureEntities = []; + /** * Checks test dependencies, determined by references in tests versus the dependencies listed in the Magento module * @@ -93,6 +112,17 @@ public function execute(InputInterface $input) "TEST DEPENDENCY CHECK ABORTED: MFTF must be attached or pointing to Magento codebase." ); } + + foreach ($allModules as $modulePath) + { + if (file_exists($modulePath . DIRECTORY_SEPARATOR . self::ALLOW_LIST_FILENAME)) { + $contents = file_get_contents($modulePath . DIRECTORY_SEPARATOR . self::ALLOW_LIST_FILENAME); + foreach(explode("\n", $contents) as $entity) { + $this->allowFailureEntities[$entity] = true; + } + } + } + $registrar = new \Magento\Framework\Component\ComponentRegistrar(); $this->moduleNameToPath = $registrar->getPaths(\Magento\Framework\Component\ComponentRegistrar::MODULE); $this->moduleNameToComposerName = $this->testDependencyUtil->buildModuleNameToComposerName( @@ -118,12 +148,20 @@ public function execute(InputInterface $input) $this->errors += $this->findErrorsInFileSet($actionGroupXmlFiles); $this->errors += $this->findErrorsInFileSet($dataXmlFiles); + // hold on to the output and print any errors to a file $this->output = $this->scriptUtil->printErrorsToFile( $this->errors, StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', self::ERROR_LOG_MESSAGE ); + if (!empty($this->warnings)) { + $this->output .= "\n " . $this->scriptUtil->printWarningsToFile( + $this->warnings, + StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::WARNING_LOG_FILENAME . '.txt', + self::ERROR_LOG_MESSAGE + ); + } } /** @@ -199,6 +237,7 @@ private function findErrorsInFileSet(Finder $files): array // Find violating references and set error output $violatingReferences = $this->findViolatingReferences($moduleName); $testErrors = array_merge($testErrors, $this->setErrorOutput($violatingReferences, $filePath)); + $this->warnings = array_merge($this->warnings, $this->setErrorOutput($this->tempWarnings, $filePath)); } return $testErrors; } @@ -221,6 +260,7 @@ private function findViolatingReferences(string $moduleName): array ); $moduleDependencies = $this->flattenedDependencies[$moduleName]; foreach ($modulesReferencedInTest as $entityName => $files) { + $isInAllowList = array_key_exists($entityName, $this->allowFailureEntities); $valid = false; foreach ($files as $module) { if (array_key_exists($module, $moduleDependencies) || $module === $currentModule) { @@ -229,6 +269,10 @@ private function findViolatingReferences(string $moduleName): array } } if (!$valid) { + if ($isInAllowList) { + $this->tempWarnings[$entityName] = $files; + continue; + } $violatingReferences[$entityName] = $files; } } diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php index e7fb1075f..6f950caba 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php @@ -67,6 +67,26 @@ public function printErrorsToFile(array $errors, string $filePath, string $messa return $message . ": No errors found."; } + $this->printTofile($errors, $filePath, $message); + + $errorCount = count($errors); + + return $message . ": Errors found across {$errorCount} file(s). Error details output to {$filePath}"; + } + + public function printWarningsToFile(array $warnings, string $filePath, string $message): string + { + if (empty($warnings)) { + return "" . ": No warnings found."; + } + $this->printTofile($warnings, $filePath, $message); + $errorCount = count($warnings); + + return $message . ": Warnings found across {$errorCount} file(s). Warning details output to {$filePath}"; + } + + private function printTofile($contents, string $filePath, string $message) + { $dirname = dirname($filePath); if (!file_exists($dirname)) { mkdir($dirname, 0777, true); @@ -74,15 +94,11 @@ public function printErrorsToFile(array $errors, string $filePath, string $messa $fileResource = fopen($filePath, 'w'); - foreach ($errors as $test => $error) { + foreach ($contents 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; } /** From 8506c64e7ba06691c3e16b4b36a237af4048ae94 Mon Sep 17 00:00:00 2001 From: Mohit Sharma <glo87054@adobe.com> Date: Tue, 25 Jul 2023 10:31:32 +0530 Subject: [PATCH 498/674] ACQE-2580 | Empty commit added in PR From 09a1ec1d1c2bc2c4d4eeac762e7f3268e6130a05 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Wed, 26 Jul 2023 10:30:30 -0500 Subject: [PATCH 499/674] ACQE-5089 --- .../StaticCheck/TestDependencyCheck.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php index 81528f22a..0a873efe2 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php @@ -113,6 +113,8 @@ public function execute(InputInterface $input) ); } + // Build array of entities found in allow-list files + // Expect one entity per file line, no commas or anything else foreach ($allModules as $modulePath) { if (file_exists($modulePath . DIRECTORY_SEPARATOR . self::ALLOW_LIST_FILENAME)) { From 28f29798b99c9805836ef842a1c96b462441d6e0 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Wed, 26 Jul 2023 10:42:21 -0500 Subject: [PATCH 500/674] ACQE-5089 Fix static issues --- .../StaticCheck/TestDependencyCheck.php | 14 ++++++------- .../Util/Script/ScriptUtil.php | 21 +++++++++++++++---- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php index 0a873efe2..486fe8cdb 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php @@ -115,11 +115,10 @@ public function execute(InputInterface $input) // Build array of entities found in allow-list files // Expect one entity per file line, no commas or anything else - foreach ($allModules as $modulePath) - { + foreach ($allModules as $modulePath) { if (file_exists($modulePath . DIRECTORY_SEPARATOR . self::ALLOW_LIST_FILENAME)) { $contents = file_get_contents($modulePath . DIRECTORY_SEPARATOR . self::ALLOW_LIST_FILENAME); - foreach(explode("\n", $contents) as $entity) { + foreach (explode("\n", $contents) as $entity) { $this->allowFailureEntities[$entity] = true; } } @@ -150,7 +149,6 @@ public function execute(InputInterface $input) $this->errors += $this->findErrorsInFileSet($actionGroupXmlFiles); $this->errors += $this->findErrorsInFileSet($dataXmlFiles); - // hold on to the output and print any errors to a file $this->output = $this->scriptUtil->printErrorsToFile( $this->errors, @@ -159,10 +157,10 @@ public function execute(InputInterface $input) ); if (!empty($this->warnings)) { $this->output .= "\n " . $this->scriptUtil->printWarningsToFile( - $this->warnings, - StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::WARNING_LOG_FILENAME . '.txt', - self::ERROR_LOG_MESSAGE - ); + $this->warnings, + StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::WARNING_LOG_FILENAME . '.txt', + self::ERROR_LOG_MESSAGE + ); } } diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php index 6f950caba..9cd02a076 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php @@ -67,25 +67,38 @@ public function printErrorsToFile(array $errors, string $filePath, string $messa return $message . ": No errors found."; } - $this->printTofile($errors, $filePath, $message); + $this->printTofile($errors, $filePath); $errorCount = count($errors); return $message . ": Errors found across {$errorCount} file(s). Error details output to {$filePath}"; } + /** + * Prints out given warnings to file, and returns summary result string + * @param array $warnings + * @param string $filePath + * @param string $message + * @return string + */ public function printWarningsToFile(array $warnings, string $filePath, string $message): string { if (empty($warnings)) { - return "" . ": No warnings found."; + return $message . ": No warnings found."; } - $this->printTofile($warnings, $filePath, $message); + $this->printTofile($warnings, $filePath); $errorCount = count($warnings); return $message . ": Warnings found across {$errorCount} file(s). Warning details output to {$filePath}"; } - private function printTofile($contents, string $filePath, string $message) + /** + * Writes contents to filePath + * @param array $contents + * @param string $filePath + * @return void + */ + private function printTofile(array $contents, string $filePath) { $dirname = dirname($filePath); if (!file_exists($dirname)) { From 419a8fa696a47ccc93ee5175278fe7bac8a5448d Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Mon, 31 Jul 2023 12:39:40 +0530 Subject: [PATCH 501/674] upgrade-php-webdriver_ver2 : Verification test --- composer.json | 2 +- composer.lock | 39 ++++++++++--------- .../Suite/views/SuiteClass.mustache | 16 +++++++- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/composer.json b/composer.json index 96105c4b0..cebaee80a 100755 --- a/composer.json +++ b/composer.json @@ -30,7 +30,7 @@ "monolog/monolog": "^2.3", "mustache/mustache": "~2.5", "nikic/php-parser": "^4.4", - "php-webdriver/webdriver": "^1.9.0 <1.14.0", + "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0", "symfony/console": "^4.4||^5.4", "symfony/string": "^5.4", diff --git a/composer.lock b/composer.lock index ec7e440cd..4af35f921 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": "b3c3ad8cbe0e410841d4c61f9cd36a55", + "content-hash": "991c0fb52f6c0dad0b53b6d722030c29", "packages": [ { "name": "allure-framework/allure-codeception", @@ -2936,37 +2936,38 @@ }, { "name": "php-webdriver/webdriver", - "version": "1.13.1", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c" + "reference": "3ea4f924afb43056bf9c630509e657d951608563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/6dfe5f814b796c1b5748850aa19f781b9274c36c", - "reference": "6dfe5f814b796c1b5748850aa19f781b9274c36c", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/3ea4f924afb43056bf9c630509e657d951608563", + "reference": "3ea4f924afb43056bf9c630509e657d951608563", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "ext-zip": "*", - "php": "^5.6 || ~7.0 || ^8.0", + "php": "^7.3 || ^8.0", "symfony/polyfill-mbstring": "^1.12", - "symfony/process": "^2.8 || ^3.1 || ^4.0 || ^5.0 || ^6.0" + "symfony/process": "^5.0 || ^6.0" }, "replace": { "facebook/webdriver": "*" }, "require-dev": { - "ondram/ci-detector": "^2.1 || ^3.5 || ^4.0", + "ergebnis/composer-normalize": "^2.20.0", + "ondram/ci-detector": "^4.0", "php-coveralls/php-coveralls": "^2.4", - "php-mock/php-mock-phpunit": "^1.1 || ^2.0", + "php-mock/php-mock-phpunit": "^2.0", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpunit/phpunit": "^5.7 || ^7 || ^8 || ^9", + "phpunit/phpunit": "^9.3", "squizlabs/php_codesniffer": "^3.5", - "symfony/var-dumper": "^3.3 || ^4.0 || ^5.0 || ^6.0" + "symfony/var-dumper": "^5.0 || ^6.0" }, "suggest": { "ext-SimpleXML": "For Firefox profile creation" @@ -2995,9 +2996,9 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.13.1" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.14.0" }, - "time": "2022-10-11T11:49:44+00:00" + "time": "2023-02-09T12:12:19+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -7138,16 +7139,16 @@ }, { "name": "symfony/process", - "version": "v5.4.22", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "4b850da0cc3a2a9181c1ed407adbca4733dc839b" + "reference": "1a44dc377ec86a50fab40d066cd061e28a6b482f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/4b850da0cc3a2a9181c1ed407adbca4733dc839b", - "reference": "4b850da0cc3a2a9181c1ed407adbca4733dc839b", + "url": "https://api.github.com/repos/symfony/process/zipball/1a44dc377ec86a50fab40d066cd061e28a6b482f", + "reference": "1a44dc377ec86a50fab40d066cd061e28a6b482f", "shasum": "" }, "require": { @@ -7180,7 +7181,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.22" + "source": "https://github.com/symfony/process/tree/v5.4.26" }, "funding": [ { @@ -7196,7 +7197,7 @@ "type": "tidelift" } ], - "time": "2023-03-06T21:29:33+00:00" + "time": "2023-07-12T15:44:31+00:00" }, { "name": "symfony/service-contracts", diff --git a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache index ec8a23448..499562f54 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache +++ b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache @@ -3,6 +3,7 @@ namespace Group; use Facebook\WebDriver\Remote\RemoteWebDriver; +use Facebook\WebDriver\Remote\DesiredCapabilities; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; use Magento\FunctionalTestingFramework\Module\MagentoWebDriver; @@ -11,6 +12,7 @@ use Magento\FunctionalTestingFramework\Module\MagentoActionProxies; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Codeception\Lib\ModuleContainer; use Codeception\Module; +use Facebook\WebDriver\Chrome\ChromeOptions; /** * Group class is Codeception Extension which is allowed to handle to all internal events. @@ -27,6 +29,12 @@ class {{suiteName}} extends \Codeception\GroupObject private $testCount = {{testCount}}; private $preconditionFailure = null; private $currentTestRun = 0; + /** + * Remote Web Driver + * + * @var RemoteWebDriver + */ + private $remoteWebDriver = null; {{#helpers}} /** * @var \Magento\FunctionalTestingFramework\Helper\HelperContainer $helperContainer @@ -152,7 +160,11 @@ class {{suiteName}} extends \Codeception\GroupObject ); $availableSessions = RemoteWebDriver::getAllSessions($wdHost); foreach ($availableSessions as $session) { - $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost); + // Create an instance of ChromeOptions: + $chromeOptions = new ChromeOptions(); + $capabilities = DesiredCapabilities::chrome(); + $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost, + $webDriverConfig['connection_timeout'], $webDriverConfig['request_timeout'], true, $capabilities); $remoteWebDriver->quit(); } } @@ -197,4 +209,4 @@ class {{suiteName}} extends \Codeception\GroupObject return $this->testCount; } -} +} \ No newline at end of file From abdaf25057687c27af30b9a278edd6706b1ade7d Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Tue, 1 Aug 2023 10:44:18 +0530 Subject: [PATCH 502/674] upgrade-php-webdriver_ver2 : Fixed verification test --- .../Resources/ActionsInDifferentModulesSuite.txt | 16 ++++++++++++++-- .../Resources/functionalSuiteHooks.txt | 16 ++++++++++++++-- .../Resources/functionalSuiteWithComments.txt | 16 ++++++++++++++-- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt index 19829daa2..c80101718 100644 --- a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt +++ b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt @@ -3,6 +3,7 @@ namespace Group; use Facebook\WebDriver\Remote\RemoteWebDriver; +use Facebook\WebDriver\Remote\DesiredCapabilities; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; use Magento\FunctionalTestingFramework\Module\MagentoWebDriver; @@ -11,6 +12,7 @@ use Magento\FunctionalTestingFramework\Module\MagentoActionProxies; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Codeception\Lib\ModuleContainer; use Codeception\Module; +use Facebook\WebDriver\Chrome\ChromeOptions; /** * Group class is Codeception Extension which is allowed to handle to all internal events. @@ -27,6 +29,12 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject private $testCount = 1; private $preconditionFailure = null; private $currentTestRun = 0; + /** + * Remote Web Driver + * + * @var RemoteWebDriver + */ + private $remoteWebDriver = null; private static $HOOK_EXECUTION_INIT = "\n/******** Beginning execution of ActionsInDifferentModulesSuite suite %s block ********/\n"; private static $HOOK_EXECUTION_END = "\n/******** Execution of ActionsInDifferentModulesSuite suite %s block complete ********/\n"; /** @var MagentoWebDriver */ @@ -196,7 +204,11 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject ); $availableSessions = RemoteWebDriver::getAllSessions($wdHost); foreach ($availableSessions as $session) { - $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost); + // Create an instance of ChromeOptions: + $chromeOptions = new ChromeOptions(); + $capabilities = DesiredCapabilities::chrome(); + $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost, + $webDriverConfig['connection_timeout'], $webDriverConfig['request_timeout'], true, $capabilities); $remoteWebDriver->quit(); } } @@ -241,4 +253,4 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject return $this->testCount; } -} +} \ No newline at end of file diff --git a/dev/tests/verification/Resources/functionalSuiteHooks.txt b/dev/tests/verification/Resources/functionalSuiteHooks.txt index 5c4a8f594..7a05965e2 100644 --- a/dev/tests/verification/Resources/functionalSuiteHooks.txt +++ b/dev/tests/verification/Resources/functionalSuiteHooks.txt @@ -3,6 +3,7 @@ namespace Group; use Facebook\WebDriver\Remote\RemoteWebDriver; +use Facebook\WebDriver\Remote\DesiredCapabilities; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; use Magento\FunctionalTestingFramework\Module\MagentoWebDriver; @@ -11,6 +12,7 @@ use Magento\FunctionalTestingFramework\Module\MagentoActionProxies; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Codeception\Lib\ModuleContainer; use Codeception\Module; +use Facebook\WebDriver\Chrome\ChromeOptions; /** * Group class is Codeception Extension which is allowed to handle to all internal events. @@ -27,6 +29,12 @@ class functionalSuiteHooks extends \Codeception\GroupObject private $testCount = 1; private $preconditionFailure = null; private $currentTestRun = 0; + /** + * Remote Web Driver + * + * @var RemoteWebDriver + */ + private $remoteWebDriver = null; private static $HOOK_EXECUTION_INIT = "\n/******** Beginning execution of functionalSuiteHooks suite %s block ********/\n"; private static $HOOK_EXECUTION_END = "\n/******** Execution of functionalSuiteHooks suite %s block complete ********/\n"; /** @var MagentoWebDriver */ @@ -179,7 +187,11 @@ class functionalSuiteHooks extends \Codeception\GroupObject ); $availableSessions = RemoteWebDriver::getAllSessions($wdHost); foreach ($availableSessions as $session) { - $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost); + // Create an instance of ChromeOptions: + $chromeOptions = new ChromeOptions(); + $capabilities = DesiredCapabilities::chrome(); + $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost, + $webDriverConfig['connection_timeout'], $webDriverConfig['request_timeout'], true, $capabilities); $remoteWebDriver->quit(); } } @@ -224,4 +236,4 @@ class functionalSuiteHooks extends \Codeception\GroupObject return $this->testCount; } -} +} \ No newline at end of file diff --git a/dev/tests/verification/Resources/functionalSuiteWithComments.txt b/dev/tests/verification/Resources/functionalSuiteWithComments.txt index 7e9bd6ba1..ee59d50e8 100644 --- a/dev/tests/verification/Resources/functionalSuiteWithComments.txt +++ b/dev/tests/verification/Resources/functionalSuiteWithComments.txt @@ -3,6 +3,7 @@ namespace Group; use Facebook\WebDriver\Remote\RemoteWebDriver; +use Facebook\WebDriver\Remote\DesiredCapabilities; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; use Magento\FunctionalTestingFramework\Module\MagentoWebDriver; @@ -11,6 +12,7 @@ use Magento\FunctionalTestingFramework\Module\MagentoActionProxies; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; use Codeception\Lib\ModuleContainer; use Codeception\Module; +use Facebook\WebDriver\Chrome\ChromeOptions; /** * Group class is Codeception Extension which is allowed to handle to all internal events. @@ -27,6 +29,12 @@ class functionalSuiteWithComments extends \Codeception\GroupObject private $testCount = 1; private $preconditionFailure = null; private $currentTestRun = 0; + /** + * Remote Web Driver + * + * @var RemoteWebDriver + */ + private $remoteWebDriver = null; private static $HOOK_EXECUTION_INIT = "\n/******** Beginning execution of functionalSuiteWithComments suite %s block ********/\n"; private static $HOOK_EXECUTION_END = "\n/******** Execution of functionalSuiteWithComments suite %s block complete ********/\n"; /** @var MagentoWebDriver */ @@ -159,7 +167,11 @@ class functionalSuiteWithComments extends \Codeception\GroupObject ); $availableSessions = RemoteWebDriver::getAllSessions($wdHost); foreach ($availableSessions as $session) { - $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost); + // Create an instance of ChromeOptions: + $chromeOptions = new ChromeOptions(); + $capabilities = DesiredCapabilities::chrome(); + $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost, + $webDriverConfig['connection_timeout'], $webDriverConfig['request_timeout'], true, $capabilities); $remoteWebDriver->quit(); } } @@ -204,4 +216,4 @@ class functionalSuiteWithComments extends \Codeception\GroupObject return $this->testCount; } -} +} \ No newline at end of file From f398cc799c0cc8a8d807bdfb7008fd8098da7571 Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Tue, 1 Aug 2023 11:34:04 +0530 Subject: [PATCH 503/674] mftf_components_upgrade : Components upgrade --- composer.json | 16 +-- composer.lock | 264 +++++++++++++++++++++++++++++++++----------------- 2 files changed, 181 insertions(+), 99 deletions(-) diff --git a/composer.json b/composer.json index cebaee80a..bf9ca655d 100755 --- a/composer.json +++ b/composer.json @@ -31,16 +31,16 @@ "mustache/mustache": "~2.5", "nikic/php-parser": "^4.4", "php-webdriver/webdriver": "^1.14.0", - "spomky-labs/otphp": "^10.0", + "spomky-labs/otphp": "^10.0||^11.0", "symfony/console": "^4.4||^5.4", - "symfony/string": "^5.4", - "symfony/dotenv": "^5.3", - "symfony/finder": "^5.0", - "symfony/http-foundation": "^5.0", - "symfony/mime": "^5.0", + "symfony/string": "^5.4||^6.3", + "symfony/dotenv": "^5.3||^6.3", + "symfony/finder": "^5.0||^6.3", + "symfony/http-foundation": "^5.0||^6.3", + "symfony/mime": "^5.0||^6.3", "symfony/process": "^4.4||^5.4", "weew/helpers-array": "^1.3", - "doctrine/annotations": "^1.13" + "doctrine/annotations": "^2.0" }, "require-dev": { "brainmaestro/composer-git-hooks": "^2.3.1", @@ -49,7 +49,7 @@ "phpmd/phpmd": "^2.8.0", "phpunit/phpunit": "<=9.5.20", "sebastian/phpcpd": "~6.0.0", - "squizlabs/php_codesniffer": "~3.6.0" + "squizlabs/php_codesniffer": "~3.7.0" }, "suggest": { "hoa/console": "Enables <pause /> action and interactive console functionality" diff --git a/composer.lock b/composer.lock index 4af35f921..9bfd7c8c5 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": "991c0fb52f6c0dad0b53b6d722030c29", + "content-hash": "4bdd60501ade2366d3aaf6cccc03de16", "packages": [ { "name": "allure-framework/allure-codeception", @@ -1668,30 +1668,30 @@ }, { "name": "doctrine/annotations", - "version": "1.14.3", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", "shasum": "" }, "require": { - "doctrine/lexer": "^1 || ^2", + "doctrine/lexer": "^2 || ^3", "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", + "php": "^7.2 || ^8.0", "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.0", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/cache": "^5.4 || ^6", "vimeo/psalm": "^4.10" }, "suggest": { @@ -1738,9 +1738,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.3" + "source": "https://github.com/doctrine/annotations/tree/2.0.1" }, - "time": "2023-02-01T09:20:38+00:00" + "time": "2023-02-02T22:02:53+00:00" }, { "name": "doctrine/deprecations", @@ -5819,16 +5819,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { @@ -5837,7 +5837,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5866,7 +5866,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { @@ -5882,29 +5882,32 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:25:55+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/dotenv", - "version": "v5.4.22", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "77b7660bfcb85e8f28287d557d7af0046bcd2ca3" + "reference": "ceadb434fe2a6763a03d2d110441745834f3dd1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/77b7660bfcb85e8f28287d557d7af0046bcd2ca3", - "reference": "77b7660bfcb85e8f28287d557d7af0046bcd2ca3", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/ceadb434fe2a6763a03d2d110441745834f3dd1e", + "reference": "ceadb434fe2a6763a03d2d110441745834f3dd1e", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.1" + }, + "conflict": { + "symfony/console": "<5.4", + "symfony/process": "<5.4" }, "require-dev": { - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0" + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -5937,7 +5940,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.4.22" + "source": "https://github.com/symfony/dotenv/tree/v6.3.0" }, "funding": [ { @@ -5953,7 +5956,7 @@ "type": "tidelift" } ], - "time": "2023-03-09T20:36:58+00:00" + "time": "2023-04-21T14:41:17+00:00" }, { "name": "symfony/event-dispatcher", @@ -6182,22 +6185,23 @@ }, { "name": "symfony/finder", - "version": "v5.4.21", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19" + "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19", - "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19", + "url": "https://api.github.com/repos/symfony/finder/zipball/d9b01ba073c44cef617c7907ce2419f8d00d75e2", + "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" }, "type": "library", "autoload": { @@ -6225,7 +6229,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.21" + "source": "https://github.com/symfony/finder/tree/v6.3.0" }, "funding": [ { @@ -6241,40 +6245,41 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:33:00+00:00" + "time": "2023-04-02T01:25:41+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.22", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "05cd1acdd0e3ce8473aaba1d86c188321d85f313" + "reference": "718a97ed430d34e5c568ea2c44eab708c6efbefb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/05cd1acdd0e3ce8473aaba1d86c188321d85f313", - "reference": "05cd1acdd0e3ce8473aaba1d86c188321d85f313", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/718a97ed430d34e5c568ea2c44eab708c6efbefb", + "reference": "718a97ed430d34e5c568ea2c44eab708c6efbefb", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.2" }, "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0|^6.0", + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^5.4|^6.0", "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/mime": "^5.4|^6.0", "symfony/rate-limiter": "^5.2|^6.0" }, - "suggest": { - "symfony/mime": "To use the file extension guesser" - }, "type": "library", "autoload": { "psr-4": { @@ -6301,7 +6306,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.22" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.0" }, "funding": [ { @@ -6317,43 +6322,42 @@ "type": "tidelift" } ], - "time": "2023-03-28T07:28:17+00:00" + "time": "2023-05-19T12:46:45+00:00" }, { "name": "symfony/mime", - "version": "v5.4.21", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ef57d9fb9cdd5e6b2ffc567d109865d10b6920cd" + "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ef57d9fb9cdd5e6b2ffc567d109865d10b6920cd", - "reference": "ef57d9fb9cdd5e6b2ffc567d109865d10b6920cd", + "url": "https://api.github.com/repos/symfony/mime/zipball/7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", + "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.1", "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4", - "symfony/serializer": "<5.4.14|>=6.0,<6.0.14|>=6.1,<6.1.6" + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/property-access": "^4.4|^5.1|^6.0", - "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.4.14|~6.0.14|^6.1.6" + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/serializer": "^6.2" }, "type": "library", "autoload": { @@ -6385,7 +6389,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.21" + "source": "https://github.com/symfony/mime/tree/v6.3.0" }, "funding": [ { @@ -6401,7 +6405,7 @@ "type": "tidelift" } ], - "time": "2023-02-21T19:46:44+00:00" + "time": "2023-04-28T15:57:00+00:00" }, { "name": "symfony/polyfill-ctype", @@ -7137,6 +7141,83 @@ ], "time": "2022-11-03T14:55:06+00:00" }, + { + "name": "symfony/polyfill-php83", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "508c652ba3ccf69f8c97f251534f229791b52a57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/508c652ba3ccf69f8c97f251534f229791b52a57", + "reference": "508c652ba3ccf69f8c97f251534f229791b52a57", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + } + }, + "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 backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, { "name": "symfony/process", "version": "v5.4.26", @@ -7286,34 +7367,34 @@ }, { "name": "symfony/string", - "version": "v5.4.22", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "8036a4c76c0dd29e60b6a7cafcacc50cf088ea62" + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/8036a4c76c0dd29e60b6a7cafcacc50cf088ea62", - "reference": "8036a4c76c0dd29e60b6a7cafcacc50cf088ea62", + "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": ">=3.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -7352,7 +7433,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.22" + "source": "https://github.com/symfony/string/tree/v6.3.0" }, "funding": [ { @@ -7368,7 +7449,7 @@ "type": "tidelift" } ], - "time": "2023-03-14T06:11:53+00:00" + "time": "2023-03-21T21:06:29+00:00" }, { "name": "symfony/var-dumper", @@ -8308,16 +8389,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.6.2", + "version": "3.7.2", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" + "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", - "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", + "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", "shasum": "" }, "require": { @@ -8353,14 +8434,15 @@ "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", "keywords": [ "phpcs", - "standards" + "standards", + "static analysis" ], "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": "2021-12-12T21:44:58+00:00" + "time": "2023-02-22T23:07:41+00:00" }, { "name": "symfony/config", From 4ebf68342d84b1d8b2a0f344fd03bd9cc47ab766 Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Tue, 1 Aug 2023 11:41:28 +0530 Subject: [PATCH 504/674] 4.3.3-Release-CheckList : MFTF 4.3.3 Release --- CHANGELOG.md | 8 ++++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfd9a6e86..068410a3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Magento Functional Testing Framework Changelog ================================================ +4.3.3 +--------- +### Enhancements +* Enhance the details in the testgroupmembership.txt file. + +### Fixes +* Fixed MFTF helpers & actionGroups allow duplicate argument names to be passed. + 4.3.2 --------- ### Enhancements diff --git a/composer.json b/composer.json index 96105c4b0..3d5701062 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": "4.3.2", + "version": "4.3.3", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index ec7e440cd..ee14feb52 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": "b3c3ad8cbe0e410841d4c61f9cd36a55", + "content-hash": "38f76cb012349da43193639e44a6ca55", "packages": [ { "name": "allure-framework/allure-codeception", From 707caab36f47a2508625c1b466160f9421fd2a11 Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Tue, 1 Aug 2023 12:08:23 +0530 Subject: [PATCH 505/674] mftf_components_upgrade : Locking symfony/process to its prev version as latest version of symfony process gives rise to OS exceptions --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index bf9ca655d..050b05963 100755 --- a/composer.json +++ b/composer.json @@ -38,7 +38,7 @@ "symfony/finder": "^5.0||^6.3", "symfony/http-foundation": "^5.0||^6.3", "symfony/mime": "^5.0||^6.3", - "symfony/process": "^4.4||^5.4", + "symfony/process": "<=5.4.23", "weew/helpers-array": "^1.3", "doctrine/annotations": "^2.0" }, diff --git a/composer.lock b/composer.lock index 9bfd7c8c5..67aeb00da 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": "4bdd60501ade2366d3aaf6cccc03de16", + "content-hash": "bf474df2241ba983c3fcd612e44e601e", "packages": [ { "name": "allure-framework/allure-codeception", @@ -7220,16 +7220,16 @@ }, { "name": "symfony/process", - "version": "v5.4.26", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "1a44dc377ec86a50fab40d066cd061e28a6b482f" + "reference": "4b842fc4b61609e0a155a114082bd94e31e98287" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/1a44dc377ec86a50fab40d066cd061e28a6b482f", - "reference": "1a44dc377ec86a50fab40d066cd061e28a6b482f", + "url": "https://api.github.com/repos/symfony/process/zipball/4b842fc4b61609e0a155a114082bd94e31e98287", + "reference": "4b842fc4b61609e0a155a114082bd94e31e98287", "shasum": "" }, "require": { @@ -7262,7 +7262,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.26" + "source": "https://github.com/symfony/process/tree/v5.4.23" }, "funding": [ { @@ -7278,7 +7278,7 @@ "type": "tidelift" } ], - "time": "2023-07-12T15:44:31+00:00" + "time": "2023-04-18T13:50:24+00:00" }, { "name": "symfony/service-contracts", From 7ae3458f057a404167e527f729337bc2cb818b0d Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Fri, 4 Aug 2023 12:07:14 +0530 Subject: [PATCH 506/674] ACQE-5264 : Revert the code changes made for spomky/otphp --- composer.json | 2 +- composer.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 050b05963..d21ef2518 100755 --- a/composer.json +++ b/composer.json @@ -31,7 +31,7 @@ "mustache/mustache": "~2.5", "nikic/php-parser": "^4.4", "php-webdriver/webdriver": "^1.14.0", - "spomky-labs/otphp": "^10.0||^11.0", + "spomky-labs/otphp": "^10.0", "symfony/console": "^4.4||^5.4", "symfony/string": "^5.4||^6.3", "symfony/dotenv": "^5.3||^6.3", diff --git a/composer.lock b/composer.lock index 67aeb00da..9663527ac 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": "bf474df2241ba983c3fcd612e44e601e", + "content-hash": "b53fb296f2dc5c66cd49fff9f117fda5", "packages": [ { "name": "allure-framework/allure-codeception", From 61f9cbb4dd2867b9beb2be04c404cf7587a87317 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk <kolesnyk@adobe.com> Date: Mon, 14 Aug 2023 21:21:45 -0500 Subject: [PATCH 507/674] Suite rerun failure hotfix --- .../Suite/views/SuiteClass.mustache | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache index ec8a23448..d8f79e94c 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache +++ b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache @@ -152,8 +152,13 @@ class {{suiteName}} extends \Codeception\GroupObject ); $availableSessions = RemoteWebDriver::getAllSessions($wdHost); foreach ($availableSessions as $session) { - $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost); - $remoteWebDriver->quit(); + try { + $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost); + $remoteWebDriver->quit(); + } catch (\Exception $exception) { + print("Failed trying to quit WebDriver session. Exception message: " . $exception->getMessage() . " Test execution will continue." . PHP_EOL); + // Session already closed so nothing to do + } } } } From 64e8b3e7d307eb01221137032b91dc659eeced45 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk <kolesnyk@adobe.com> Date: Mon, 14 Aug 2023 21:27:25 -0500 Subject: [PATCH 508/674] Suite after section failure HOTFIX --- CHANGELOG.md | 5 +++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 068410a3b..3bb602154 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Magento Functional Testing Framework Changelog ================================================ +4.3.4 +--------- +### Fixes +* Resolving an issue when test is marked as failed due to Suite after section failure + 4.3.3 --------- ### Enhancements diff --git a/composer.json b/composer.json index 3d5701062..11412a51f 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": "4.3.3", + "version": "4.3.4", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index ee14feb52..fff04c318 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": "38f76cb012349da43193639e44a6ca55", + "content-hash": "9c914b99fdfd6e56de9a1f3d53b417bf", "packages": [ { "name": "allure-framework/allure-codeception", From 00e15089e70cce6ce2c62e2e5fe7cf9f4336aae7 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk <kolesnyk@adobe.com> Date: Mon, 14 Aug 2023 21:36:11 -0500 Subject: [PATCH 509/674] Suite after section failure HOTFIX - verification test fixes --- .../Resources/ActionsInDifferentModulesSuite.txt | 9 +++++++-- .../verification/Resources/functionalSuiteHooks.txt | 9 +++++++-- .../Resources/functionalSuiteWithComments.txt | 9 +++++++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt index 19829daa2..dc2fef293 100644 --- a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt +++ b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt @@ -196,8 +196,13 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject ); $availableSessions = RemoteWebDriver::getAllSessions($wdHost); foreach ($availableSessions as $session) { - $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost); - $remoteWebDriver->quit(); + try { + $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost); + $remoteWebDriver->quit(); + } catch (\Exception $exception) { + print("Failed trying to quit WebDriver session. Exception message: " . $exception->getMessage() . " Test execution will continue." . PHP_EOL); + // Session already closed so nothing to do + } } } } diff --git a/dev/tests/verification/Resources/functionalSuiteHooks.txt b/dev/tests/verification/Resources/functionalSuiteHooks.txt index 5c4a8f594..6b22382bb 100644 --- a/dev/tests/verification/Resources/functionalSuiteHooks.txt +++ b/dev/tests/verification/Resources/functionalSuiteHooks.txt @@ -179,8 +179,13 @@ class functionalSuiteHooks extends \Codeception\GroupObject ); $availableSessions = RemoteWebDriver::getAllSessions($wdHost); foreach ($availableSessions as $session) { - $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost); - $remoteWebDriver->quit(); + try { + $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost); + $remoteWebDriver->quit(); + } catch (\Exception $exception) { + print("Failed trying to quit WebDriver session. Exception message: " . $exception->getMessage() . " Test execution will continue." . PHP_EOL); + // Session already closed so nothing to do + } } } } diff --git a/dev/tests/verification/Resources/functionalSuiteWithComments.txt b/dev/tests/verification/Resources/functionalSuiteWithComments.txt index 7e9bd6ba1..bd0fd173f 100644 --- a/dev/tests/verification/Resources/functionalSuiteWithComments.txt +++ b/dev/tests/verification/Resources/functionalSuiteWithComments.txt @@ -159,8 +159,13 @@ class functionalSuiteWithComments extends \Codeception\GroupObject ); $availableSessions = RemoteWebDriver::getAllSessions($wdHost); foreach ($availableSessions as $session) { - $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost); - $remoteWebDriver->quit(); + try { + $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost); + $remoteWebDriver->quit(); + } catch (\Exception $exception) { + print("Failed trying to quit WebDriver session. Exception message: " . $exception->getMessage() . " Test execution will continue." . PHP_EOL); + // Session already closed so nothing to do + } } } } From 5bf7166b8e9aed5789613cba458f25912de39bb9 Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Wed, 16 Aug 2023 12:05:17 +0530 Subject: [PATCH 510/674] ACQE-5196 : Resolved conflicts --- .../Resources/ActionsInDifferentModulesSuite.txt | 11 +++++------ .../verification/Resources/functionalSuiteHooks.txt | 1 - .../Resources/functionalSuiteWithComments.txt | 10 +++++----- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt index 9605f057b..f7522c3b1 100644 --- a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt +++ b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt @@ -205,12 +205,11 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject $availableSessions = RemoteWebDriver::getAllSessions($wdHost); foreach ($availableSessions as $session) { try { - // Create an instance of ChromeOptions: - $chromeOptions = new ChromeOptions(); - $capabilities = DesiredCapabilities::chrome(); - $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost, - $webDriverConfig['connection_timeout'], $webDriverConfig['request_timeout'], true, $capabilities); - $remoteWebDriver->quit(); + $chromeOptions = new ChromeOptions(); + $capabilities = DesiredCapabilities::chrome(); + $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost, + $webDriverConfig['connection_timeout'], $webDriverConfig['request_timeout'], true, $capabilities); + $remoteWebDriver->quit(); } catch (\Exception $exception) { print("Failed trying to quit WebDriver session. Exception message: " . $exception->getMessage() . " Test execution will continue." . PHP_EOL); // Session already closed so nothing to do diff --git a/dev/tests/verification/Resources/functionalSuiteHooks.txt b/dev/tests/verification/Resources/functionalSuiteHooks.txt index 69f6367a5..9e855ba7d 100644 --- a/dev/tests/verification/Resources/functionalSuiteHooks.txt +++ b/dev/tests/verification/Resources/functionalSuiteHooks.txt @@ -188,7 +188,6 @@ class functionalSuiteHooks extends \Codeception\GroupObject $availableSessions = RemoteWebDriver::getAllSessions($wdHost); foreach ($availableSessions as $session) { try { - // Create an instance of ChromeOptions: $chromeOptions = new ChromeOptions(); $capabilities = DesiredCapabilities::chrome(); $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost, diff --git a/dev/tests/verification/Resources/functionalSuiteWithComments.txt b/dev/tests/verification/Resources/functionalSuiteWithComments.txt index 7b514ace2..5fa88c352 100644 --- a/dev/tests/verification/Resources/functionalSuiteWithComments.txt +++ b/dev/tests/verification/Resources/functionalSuiteWithComments.txt @@ -168,11 +168,11 @@ class functionalSuiteWithComments extends \Codeception\GroupObject $availableSessions = RemoteWebDriver::getAllSessions($wdHost); foreach ($availableSessions as $session) { try { - $chromeOptions = new ChromeOptions(); - $capabilities = DesiredCapabilities::chrome(); - $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost, - $webDriverConfig['connection_timeout'], $webDriverConfig['request_timeout'], true, $capabilities); - $remoteWebDriver->quit(); + $chromeOptions = new ChromeOptions(); + $capabilities = DesiredCapabilities::chrome(); + $remoteWebDriver = RemoteWebDriver::createBySessionID($session['id'], $wdHost, + $webDriverConfig['connection_timeout'], $webDriverConfig['request_timeout'], true, $capabilities); + $remoteWebDriver->quit(); } catch (\Exception $exception) { print("Failed trying to quit WebDriver session. Exception message: " . $exception->getMessage() . " Test execution will continue." . PHP_EOL); // Session already closed so nothing to do From c6af0a1b2cc9f709e6af21407c6d2070a4548e0f Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Thu, 17 Aug 2023 20:09:54 +0530 Subject: [PATCH 511/674] worked on Alex remove remoteWebDriver --- .../Resources/ActionsInDifferentModulesSuite.txt | 6 ------ dev/tests/verification/Resources/functionalSuiteHooks.txt | 6 ------ .../verification/Resources/functionalSuiteWithComments.txt | 6 ------ .../Suite/views/SuiteClass.mustache | 6 ------ 4 files changed, 24 deletions(-) diff --git a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt index f7522c3b1..c986b6fb4 100644 --- a/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt +++ b/dev/tests/verification/Resources/ActionsInDifferentModulesSuite.txt @@ -29,12 +29,6 @@ class ActionsInDifferentModulesSuite extends \Codeception\GroupObject private $testCount = 1; private $preconditionFailure = null; private $currentTestRun = 0; - /** - * Remote Web Driver - * - * @var RemoteWebDriver - */ - private $remoteWebDriver = null; private static $HOOK_EXECUTION_INIT = "\n/******** Beginning execution of ActionsInDifferentModulesSuite suite %s block ********/\n"; private static $HOOK_EXECUTION_END = "\n/******** Execution of ActionsInDifferentModulesSuite suite %s block complete ********/\n"; /** @var MagentoWebDriver */ diff --git a/dev/tests/verification/Resources/functionalSuiteHooks.txt b/dev/tests/verification/Resources/functionalSuiteHooks.txt index 9e855ba7d..946bf456e 100644 --- a/dev/tests/verification/Resources/functionalSuiteHooks.txt +++ b/dev/tests/verification/Resources/functionalSuiteHooks.txt @@ -29,12 +29,6 @@ class functionalSuiteHooks extends \Codeception\GroupObject private $testCount = 1; private $preconditionFailure = null; private $currentTestRun = 0; - /** - * Remote Web Driver - * - * @var RemoteWebDriver - */ - private $remoteWebDriver = null; private static $HOOK_EXECUTION_INIT = "\n/******** Beginning execution of functionalSuiteHooks suite %s block ********/\n"; private static $HOOK_EXECUTION_END = "\n/******** Execution of functionalSuiteHooks suite %s block complete ********/\n"; /** @var MagentoWebDriver */ diff --git a/dev/tests/verification/Resources/functionalSuiteWithComments.txt b/dev/tests/verification/Resources/functionalSuiteWithComments.txt index 5fa88c352..a5a130345 100644 --- a/dev/tests/verification/Resources/functionalSuiteWithComments.txt +++ b/dev/tests/verification/Resources/functionalSuiteWithComments.txt @@ -29,12 +29,6 @@ class functionalSuiteWithComments extends \Codeception\GroupObject private $testCount = 1; private $preconditionFailure = null; private $currentTestRun = 0; - /** - * Remote Web Driver - * - * @var RemoteWebDriver - */ - private $remoteWebDriver = null; private static $HOOK_EXECUTION_INIT = "\n/******** Beginning execution of functionalSuiteWithComments suite %s block ********/\n"; private static $HOOK_EXECUTION_END = "\n/******** Execution of functionalSuiteWithComments suite %s block complete ********/\n"; /** @var MagentoWebDriver */ diff --git a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache index 5941f85c6..599b5791e 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache +++ b/src/Magento/FunctionalTestingFramework/Suite/views/SuiteClass.mustache @@ -29,12 +29,6 @@ class {{suiteName}} extends \Codeception\GroupObject private $testCount = {{testCount}}; private $preconditionFailure = null; private $currentTestRun = 0; - /** - * Remote Web Driver - * - * @var RemoteWebDriver - */ - private $remoteWebDriver = null; {{#helpers}} /** * @var \Magento\FunctionalTestingFramework\Helper\HelperContainer $helperContainer From 8a3a5772fc67f1bbbfac7d08cadb55e61a2d5abb Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Fri, 18 Aug 2023 09:40:28 +0530 Subject: [PATCH 512/674] MFTF_4.4.0_Release : MFTF 4.4.0 Release PR --- CHANGELOG.md | 12 ++++++++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bb602154..32142c024 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,18 @@ Magento Functional Testing Framework Changelog ================================================ +4.4.0 +--------- +### Enhancements +* Bumped `doctrine/annotations` dependency to `^2.0`. +* Bumped `squizlabs/php_codesniffer` dependency to `^3.7`. +* Bumped `php-webdriver/webdriver` dependency to `^1.14`. +* Bumped `symfony/string` dependency to `^6.3`. +* Bumped `symfony/dotenv` dependency to `^6.3`. +* Bumped `symfony/finder` dependency to `^6.3`. +* Bumped `symfony/http-foundation` dependency to `^6.3`. +* Bumped `symfony/mime` dependency to `^6.3`. + 4.3.4 --------- ### Fixes diff --git a/composer.json b/composer.json index b6f2c422d..e55d99bb5 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": "4.3.4", + "version": "4.4.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index e86635d92..54d3286bc 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": "9c914b99fdfd6e56de9a1f3d53b417bf", + "content-hash": "c42cd21b24ad577d47a62b4d3506bed9", "packages": [ { "name": "allure-framework/allure-codeception", From 465b9c9bf4d1f53c88dff72b89064be57bc28d8d Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Fri, 18 Aug 2023 09:42:59 +0530 Subject: [PATCH 513/674] MFTF_4.4.0_Release : MFTF 4.4.0 Release PR --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32142c024..ef32fc8e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Magento Functional Testing Framework Changelog * Bumped `symfony/finder` dependency to `^6.3`. * Bumped `symfony/http-foundation` dependency to `^6.3`. * Bumped `symfony/mime` dependency to `^6.3`. +* Enhanced MFTF Modularity Test with "allow failure list". 4.3.4 --------- From e4fc3fc61a63abf2cb80d6e59e44c32e9c6be49c Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk <kolesnyk@adobe.com> Date: Wed, 30 Aug 2023 12:39:43 -0500 Subject: [PATCH 514/674] Resetting release changes --- CHANGELOG.md | 4 ++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef32fc8e5..dc0566cd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Magento Functional Testing Framework Changelog ================================================ +4.4.1 +--------- +* Same as previous release + 4.4.0 --------- ### Enhancements diff --git a/composer.json b/composer.json index e55d99bb5..7fd729ef7 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": "4.4.0", + "version": "4.4.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 54d3286bc..20b3bd5e6 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": "c42cd21b24ad577d47a62b4d3506bed9", + "content-hash": "ed9a0f6b303c7381d59f64ba18a27446", "packages": [ { "name": "allure-framework/allure-codeception", From 2ff713389b7c69033b185511b6abaaae21df0168 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk <kolesnyk@adobe.com> Date: Wed, 30 Aug 2023 20:15:12 -0500 Subject: [PATCH 515/674] ACQE-5434: Increase browser resolution for UI Functional tests --- CHANGELOG.md | 4 + composer.json | 2 +- composer.lock | 838 +++++++++++++-------------- etc/config/.env.example | 2 + etc/config/functional.suite.dist.yml | 4 +- 5 files changed, 423 insertions(+), 427 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc0566cd5..d61b5e827 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ Magento Functional Testing Framework Changelog ================================================ +4.4.2 +--------- +### Enhancements +* Increase browser resolution to 1920x1080. 4.4.1 --------- diff --git a/composer.json b/composer.json index 7fd729ef7..96f20576b 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": "4.4.1", + "version": "4.4.2", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 20b3bd5e6..d1904cf87 100644 --- a/composer.lock +++ b/composer.lock @@ -4,35 +4,34 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ed9a0f6b303c7381d59f64ba18a27446", + "content-hash": "fea242b10e0e1973576554e3f1e02eb0", "packages": [ { "name": "allure-framework/allure-codeception", - "version": "v2.1.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-codeception.git", - "reference": "1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8" + "reference": "d28f6ba7139406974b977e5611bc65b59c492a55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8", - "reference": "1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8", + "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/d28f6ba7139406974b977e5611bc65b59c492a55", + "reference": "d28f6ba7139406974b977e5611bc65b59c492a55", "shasum": "" }, "require": { - "allure-framework/allure-php-commons": "^2", - "codeception/codeception": "^5", + "allure-framework/allure-php-commons": "^2.3.1", + "codeception/codeception": "^5.0.3", "ext-json": "*", "php": "^8" }, "require-dev": { - "phpunit/phpunit": "^9", "psalm/plugin-phpunit": "^0.18.4", "remorhaz/php-json-data": "^0.5.3", "remorhaz/php-json-path": "^0.7.7", - "squizlabs/php_codesniffer": "^3.7.1", - "vimeo/psalm": "^5.2" + "squizlabs/php_codesniffer": "^3.7.2", + "vimeo/psalm": "^5.12" }, "type": "library", "autoload": { @@ -72,20 +71,20 @@ "issues": "https://github.com/allure-framework/allure-codeception/issues", "source": "https://github.com/allure-framework/allure-codeception" }, - "time": "2023-01-09T08:09:01+00:00" + "time": "2023-05-31T14:10:46+00:00" }, { "name": "allure-framework/allure-php-commons", - "version": "v2.2.0", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-php-commons2.git", - "reference": "c2b222c1f999c851e029290c09a3fe4933390bda" + "reference": "5d7ed5ab510339652163ca1473eb499d4b7ec488" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/c2b222c1f999c851e029290c09a3fe4933390bda", - "reference": "c2b222c1f999c851e029290c09a3fe4933390bda", + "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/5d7ed5ab510339652163ca1473eb499d4b7ec488", + "reference": "5d7ed5ab510339652163ca1473eb499d4b7ec488", "shasum": "" }, "require": { @@ -100,10 +99,10 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "^1", - "phpunit/phpunit": "^9.5.10", + "phpunit/phpunit": "^9.6.8", "psalm/plugin-phpunit": "^0.18.4", - "squizlabs/php_codesniffer": "^3.7.1", - "vimeo/psalm": "^5.4" + "squizlabs/php_codesniffer": "^3.7.2", + "vimeo/psalm": "^5.12" }, "type": "library", "autoload": { @@ -142,7 +141,7 @@ "issues": "https://github.com/allure-framework/allure-php-commons2/issues", "source": "https://github.com/allure-framework/allure-php-commons" }, - "time": "2023-01-12T14:28:21+00:00" + "time": "2023-05-30T10:55:43+00:00" }, { "name": "allure-framework/allure-phpunit", @@ -214,16 +213,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.1", + "version": "v1.2.2", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5" + "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/1926277fc71d253dfa820271ac5987bdb193ccf5", - "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/2f1dc7b7eda080498be96a4a6d683a41583030e9", + "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9", "shasum": "" }, "require": { @@ -262,22 +261,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.1" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.2" }, - "time": "2023-03-24T20:22:19+00:00" + "time": "2023-07-20T16:49:55+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.268.16", + "version": "3.280.0", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98" + "reference": "bf4f3079bc59af44a752677cfbcd43f7953c4343" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98", - "reference": "b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/bf4f3079bc59af44a752677cfbcd43f7953c4343", + "reference": "bf4f3079bc59af44a752677cfbcd43f7953c4343", "shasum": "" }, "require": { @@ -286,10 +285,11 @@ "ext-pcre": "*", "ext-simplexml": "*", "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0", + "guzzlehttp/promises": "^1.4.0 || ^2.0", "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "mtdowling/jmespath.php": "^2.6", - "php": ">=5.5" + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0" }, "require-dev": { "andrewsville/php-token-reflection": "^1.4", @@ -304,9 +304,8 @@ "ext-sockets": "*", "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", + "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", "psr/cache": "^1.0", - "psr/http-message": "^1.0", "psr/simple-cache": "^1.0", "sebastian/comparator": "^1.2.3 || ^4.0", "yoast/phpunit-polyfills": "^1.0" @@ -357,9 +356,9 @@ "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.268.16" + "source": "https://github.com/aws/aws-sdk-php/tree/3.280.0" }, - "time": "2023-04-21T21:37:05+00:00" + "time": "2023-08-30T18:19:33+00:00" }, { "name": "beberlei/assert", @@ -548,16 +547,16 @@ }, { "name": "codeception/codeception", - "version": "5.0.10", + "version": "5.0.11", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "ed4af7fd4103cdd035916fbb8f35124edd2d018b" + "reference": "1998a287a3d7f2771c9591aef1c528d9d44cc4b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/ed4af7fd4103cdd035916fbb8f35124edd2d018b", - "reference": "ed4af7fd4103cdd035916fbb8f35124edd2d018b", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/1998a287a3d7f2771c9591aef1c528d9d44cc4b4", + "reference": "1998a287a3d7f2771c9591aef1c528d9d44cc4b4", "shasum": "" }, "require": { @@ -652,7 +651,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/5.0.10" + "source": "https://github.com/Codeception/Codeception/tree/5.0.11" }, "funding": [ { @@ -660,7 +659,7 @@ "type": "open_collective" } ], - "time": "2023-03-14T07:21:10+00:00" + "time": "2023-08-22T06:42:39+00:00" }, { "name": "codeception/lib-asserts", @@ -936,16 +935,16 @@ }, { "name": "codeception/stub", - "version": "4.1.0", + "version": "4.1.1", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "58751aed08a68ae960a952fd3fe74ee9a56cdb1b" + "reference": "4aaeffdc7089f3cae173b73bd4bc3672e4618747" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/58751aed08a68ae960a952fd3fe74ee9a56cdb1b", - "reference": "58751aed08a68ae960a952fd3fe74ee9a56cdb1b", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/4aaeffdc7089f3cae173b73bd4bc3672e4618747", + "reference": "4aaeffdc7089f3cae173b73bd4bc3672e4618747", "shasum": "" }, "require": { @@ -971,22 +970,22 @@ "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", "support": { "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/4.1.0" + "source": "https://github.com/Codeception/Stub/tree/4.1.1" }, - "time": "2022-12-27T18:41:43+00:00" + "time": "2023-08-16T19:17:44+00:00" }, { "name": "composer/ca-bundle", - "version": "1.3.5", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd" + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", "shasum": "" }, "require": { @@ -1033,7 +1032,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.5" + "source": "https://github.com/composer/ca-bundle/tree/1.3.7" }, "funding": [ { @@ -1049,26 +1048,26 @@ "type": "tidelift" } ], - "time": "2023-01-11T08:27:00+00:00" + "time": "2023-08-30T09:31:38+00:00" }, { "name": "composer/class-map-generator", - "version": "1.0.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/953cc4ea32e0c31f2185549c7d216d7921f03da9", + "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9", "shasum": "" }, "require": { - "composer/pcre": "^2 || ^3", + "composer/pcre": "^2.1 || ^3.1", "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" }, "require-dev": { "phpstan/phpstan": "^1.6", @@ -1106,7 +1105,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + "source": "https://github.com/composer/class-map-generator/tree/1.1.0" }, "funding": [ { @@ -1122,20 +1121,20 @@ "type": "tidelift" } ], - "time": "2022-06-19T11:31:27+00:00" + "time": "2023-06-30T13:58:57+00:00" }, { "name": "composer/composer", - "version": "2.5.5", + "version": "2.5.8", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f" + "reference": "4c516146167d1392c8b9b269bb7c24115d262164" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/c7cffaad16a60636a776017eac5bd8cd0095c32f", - "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f", + "url": "https://api.github.com/repos/composer/composer/zipball/4c516146167d1392c8b9b269bb7c24115d262164", + "reference": "4c516146167d1392c8b9b269bb7c24115d262164", "shasum": "" }, "require": { @@ -1219,7 +1218,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.5.5" + "source": "https://github.com/composer/composer/tree/2.5.8" }, "funding": [ { @@ -1235,7 +1234,7 @@ "type": "tidelift" } ], - "time": "2023-03-21T10:50:05+00:00" + "time": "2023-06-09T15:13:21+00:00" }, { "name": "composer/metadata-minifier", @@ -1744,25 +1743,29 @@ }, { "name": "doctrine/deprecations", - "version": "v1.0.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5|^8.5|^9.5", - "psr/log": "^1|^2|^3" + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -1781,9 +1784,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" }, - "time": "2022-05-02T15:47:09+00:00" + "time": "2023-06-03T09:27:29+00:00" }, { "name": "doctrine/instantiator", @@ -1857,28 +1860,27 @@ }, { "name": "doctrine/lexer", - "version": "2.1.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" + "reference": "84a527db05647743d50373e0ec53a152f2cde568" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.0" + "vimeo/psalm": "^5.0" }, "type": "library", "autoload": { @@ -1915,7 +1917,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.0" + "source": "https://github.com/doctrine/lexer/tree/3.0.0" }, "funding": [ { @@ -1931,26 +1933,26 @@ "type": "tidelift" } ], - "time": "2022-12-14T08:49:07+00:00" + "time": "2022-12-15T16:57:16+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.5.1", + "version": "7.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9" + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b964ca597e86b752cd994f27293e9fa6b6a95ed9", - "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -1961,7 +1963,8 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.29 || ^9.5.23", "psr/log": "^1.1 || ^2.0 || ^3.0" }, @@ -1975,9 +1978,6 @@ "bamarni-bin": { "bin-links": true, "forward-command": false - }, - "branch-alias": { - "dev-master": "7.5-dev" } }, "autoload": { @@ -2043,7 +2043,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.5.1" + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" }, "funding": [ { @@ -2059,38 +2059,37 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:30:08+00:00" + "time": "2023-08-27T10:20:53+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.2", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "b94b2807d85443f9719887892882d0329d1e2598" + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", - "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -2127,7 +2126,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.2" + "source": "https://github.com/guzzle/promises/tree/2.0.1" }, "funding": [ { @@ -2143,20 +2142,20 @@ "type": "tidelift" } ], - "time": "2022-08-28T14:55:35+00:00" + "time": "2023-08-03T15:11:55+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.5.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "shasum": "" }, "require": { @@ -2243,7 +2242,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.5.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.1" }, "funding": [ { @@ -2259,7 +2258,7 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:11:26+00:00" + "time": "2023-08-27T10:13:57+00:00" }, { "name": "justinrainbow/json-schema", @@ -2532,25 +2531,25 @@ }, { "name": "mtdowling/jmespath.php", - "version": "2.6.1", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb" + "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb", - "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b", + "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b", "shasum": "" }, "require": { - "php": "^5.4 || ^7.0 || ^8.0", + "php": "^7.2.5 || ^8.0", "symfony/polyfill-mbstring": "^1.17" }, "require-dev": { - "composer/xdebug-handler": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^7.5.15" + "composer/xdebug-handler": "^3.0.3", + "phpunit/phpunit": "^8.5.33" }, "bin": [ "bin/jp.php" @@ -2558,7 +2557,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { @@ -2574,6 +2573,11 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", @@ -2587,9 +2591,9 @@ ], "support": { "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1" + "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0" }, - "time": "2021-06-14T00:11:39+00:00" + "time": "2023-08-25T10:54:48+00:00" }, { "name": "mustache/mustache", @@ -2702,16 +2706,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.4", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -2752,9 +2756,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2023-03-05T19:49:14+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -2936,16 +2940,16 @@ }, { "name": "php-webdriver/webdriver", - "version": "1.14.0", + "version": "1.15.0", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "3ea4f924afb43056bf9c630509e657d951608563" + "reference": "a1578689290055586f1ee51eaf0ec9d52895bb6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/3ea4f924afb43056bf9c630509e657d951608563", - "reference": "3ea4f924afb43056bf9c630509e657d951608563", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/a1578689290055586f1ee51eaf0ec9d52895bb6d", + "reference": "a1578689290055586f1ee51eaf0ec9d52895bb6d", "shasum": "" }, "require": { @@ -2996,9 +3000,9 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.14.0" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.0" }, - "time": "2023-02-09T12:12:19+00:00" + "time": "2023-08-29T13:52:26+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -3112,16 +3116,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.7.1", + "version": "1.7.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "dfc078e8af9c99210337325ff5aa152872c98714" + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/dfc078e8af9c99210337325ff5aa152872c98714", - "reference": "dfc078e8af9c99210337325ff5aa152872c98714", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", "shasum": "" }, "require": { @@ -3164,9 +3168,9 @@ "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.7.1" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.3" }, - "time": "2023-03-27T19:02:04+00:00" + "time": "2023-08-12T11:01:26+00:00" }, { "name": "phpspec/prophecy", @@ -3238,22 +3242,24 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.20.1", + "version": "1.23.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "57f6787f0bb6431905a18aa7caea25dcd2bd59e0" + "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/57f6787f0bb6431905a18aa7caea25dcd2bd59e0", - "reference": "57f6787f0bb6431905a18aa7caea25dcd2bd59e0", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/846ae76eef31c6d7790fac9bc399ecee45160b26", + "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.5", @@ -3277,22 +3283,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.20.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.23.1" }, - "time": "2023-04-22T09:05:52+00:00" + "time": "2023-08-03T16:32:59+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.26", + "version": "9.2.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b0a88255cb70d52653d80c890bd7f38740ea50d1", + "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1", "shasum": "" }, "require": { @@ -3348,7 +3354,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.27" }, "funding": [ { @@ -3356,7 +3363,7 @@ "type": "github" } ], - "time": "2023-03-06T12:58:08+00:00" + "time": "2023-07-26T13:44:30+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4066,16 +4073,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.15", + "version": "v0.11.20", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "5350ce0ec8ecf2c5b5cf554cd2496f97b444af85" + "reference": "0fa27040553d1d280a67a4393194df5228afea5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/5350ce0ec8ecf2c5b5cf554cd2496f97b444af85", - "reference": "5350ce0ec8ecf2c5b5cf554cd2496f97b444af85", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/0fa27040553d1d280a67a4393194df5228afea5b", + "reference": "0fa27040553d1d280a67a4393194df5228afea5b", "shasum": "" }, "require": { @@ -4136,9 +4143,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.15" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.20" }, - "time": "2023-04-07T21:57:09+00:00" + "time": "2023-07-31T14:32:22+00:00" }, { "name": "ralouphie/getallheaders", @@ -4367,23 +4374,23 @@ }, { "name": "react/promise", - "version": "v2.9.0", + "version": "v2.10.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4427,19 +4434,15 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" + "source": "https://github.com/reactphp/promise/tree/v2.10.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-02-11T10:27:51+00:00" + "time": "2023-05-02T15:15:43+00:00" }, { "name": "sebastian/cli-parser", @@ -4741,16 +4744,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -4795,7 +4798,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -4803,7 +4806,7 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", @@ -4947,16 +4950,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -4999,7 +5002,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { @@ -5007,7 +5010,7 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-08-02T09:26:13+00:00" }, { "name": "sebastian/lines-of-code", @@ -5407,16 +5410,16 @@ }, { "name": "seld/jsonlint", - "version": "1.9.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", "shasum": "" }, "require": { @@ -5455,7 +5458,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.10.0" }, "funding": [ { @@ -5467,7 +5470,7 @@ "type": "tidelift" } ], - "time": "2022-04-01T13:37:23+00:00" + "time": "2023-05-11T13:16:46+00:00" }, { "name": "seld/phar-utils", @@ -5655,16 +5658,16 @@ }, { "name": "symfony/console", - "version": "v5.4.22", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8" + "reference": "f4f71842f24c2023b91237c72a365306f3c58827" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3cd51fd2e6c461ca678f84d419461281bd87a0a8", - "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8", + "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", + "reference": "f4f71842f24c2023b91237c72a365306f3c58827", "shasum": "" }, "require": { @@ -5734,7 +5737,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.22" + "source": "https://github.com/symfony/console/tree/v5.4.28" }, "funding": [ { @@ -5750,20 +5753,20 @@ "type": "tidelift" } ], - "time": "2023-03-25T09:27:28+00:00" + "time": "2023-08-07T06:12:30+00:00" }, { "name": "symfony/css-selector", - "version": "v6.2.7", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0" + "reference": "883d961421ab1709877c10ac99451632a3d6fa57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/aedf3cb0f5b929ec255d96bbb4909e9932c769e0", - "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", + "reference": "883d961421ab1709877c10ac99451632a3d6fa57", "shasum": "" }, "require": { @@ -5799,7 +5802,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.2.7" + "source": "https://github.com/symfony/css-selector/tree/v6.3.2" }, "funding": [ { @@ -5815,7 +5818,7 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-07-12T16:00:22+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5960,24 +5963,25 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.2.8", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339" + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/04046f35fd7d72f9646e721fc2ecb8f9c67d3339", - "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2|^3" + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -5990,13 +5994,9 @@ "symfony/error-handler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/stopwatch": "^5.4|^6.0" }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, "type": "library", "autoload": { "psr-4": { @@ -6023,7 +6023,7 @@ "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/v6.2.8" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" }, "funding": [ { @@ -6039,33 +6039,30 @@ "type": "tidelift" } ], - "time": "2023-03-20T16:06:02+00:00" + "time": "2023-07-06T06:56:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd" + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", - "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", "shasum": "" }, "require": { "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6102,7 +6099,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" }, "funding": [ { @@ -6118,20 +6115,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/filesystem", - "version": "v6.2.7", + "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "82b6c62b959f642d000456f08c6d219d749215b3" + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/82b6c62b959f642d000456f08c6d219d749215b3", - "reference": "82b6c62b959f642d000456f08c6d219d749215b3", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "shasum": "" }, "require": { @@ -6165,7 +6162,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.2.7" + "source": "https://github.com/symfony/filesystem/tree/v6.3.1" }, "funding": [ { @@ -6181,20 +6178,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-06-01T08:30:39+00:00" }, { "name": "symfony/finder", - "version": "v6.3.0", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2" + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d9b01ba073c44cef617c7907ce2419f8d00d75e2", - "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2", + "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", "shasum": "" }, "require": { @@ -6229,7 +6226,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.0" + "source": "https://github.com/symfony/finder/tree/v6.3.3" }, "funding": [ { @@ -6245,20 +6242,20 @@ "type": "tidelift" } ], - "time": "2023-04-02T01:25:41+00:00" + "time": "2023-07-31T08:31:44+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.3.0", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "718a97ed430d34e5c568ea2c44eab708c6efbefb" + "reference": "cac1556fdfdf6719668181974104e6fcfa60e844" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/718a97ed430d34e5c568ea2c44eab708c6efbefb", - "reference": "718a97ed430d34e5c568ea2c44eab708c6efbefb", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cac1556fdfdf6719668181974104e6fcfa60e844", + "reference": "cac1556fdfdf6719668181974104e6fcfa60e844", "shasum": "" }, "require": { @@ -6306,7 +6303,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.0" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.4" }, "funding": [ { @@ -6322,24 +6319,25 @@ "type": "tidelift" } ], - "time": "2023-05-19T12:46:45+00:00" + "time": "2023-08-22T08:20:46+00:00" }, { "name": "symfony/mime", - "version": "v6.3.0", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad" + "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", - "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", + "url": "https://api.github.com/repos/symfony/mime/zipball/9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", + "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -6348,7 +6346,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2" + "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -6357,7 +6355,7 @@ "symfony/dependency-injection": "^5.4|^6.0", "symfony/property-access": "^5.4|^6.0", "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "^6.2" + "symfony/serializer": "~6.2.13|^6.3.2" }, "type": "library", "autoload": { @@ -6389,7 +6387,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.3.0" + "source": "https://github.com/symfony/mime/tree/v6.3.3" }, "funding": [ { @@ -6405,20 +6403,20 @@ "type": "tidelift" } ], - "time": "2023-04-28T15:57:00+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -6433,7 +6431,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6471,7 +6469,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -6487,20 +6485,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -6512,7 +6510,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6552,7 +6550,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -6568,20 +6566,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", "shasum": "" }, "require": { @@ -6595,7 +6593,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6639,7 +6637,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" }, "funding": [ { @@ -6655,20 +6653,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:30:37+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -6680,7 +6678,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6723,7 +6721,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -6739,20 +6737,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -6767,7 +6765,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6806,7 +6804,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -6822,20 +6820,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", "shasum": "" }, "require": { @@ -6844,7 +6842,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6882,7 +6880,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" }, "funding": [ { @@ -6898,20 +6896,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", "shasum": "" }, "require": { @@ -6920,7 +6918,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6961,7 +6959,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" }, "funding": [ { @@ -6977,20 +6975,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -6999,7 +6997,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7044,7 +7042,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -7060,20 +7058,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", "shasum": "" }, "require": { @@ -7082,7 +7080,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7123,7 +7121,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" }, "funding": [ { @@ -7139,20 +7137,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "508c652ba3ccf69f8c97f251534f229791b52a57" + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/508c652ba3ccf69f8c97f251534f229791b52a57", - "reference": "508c652ba3ccf69f8c97f251534f229791b52a57", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", "shasum": "" }, "require": { @@ -7162,7 +7160,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7175,7 +7173,10 @@ ], "psr-4": { "Symfony\\Polyfill\\Php83\\": "" - } + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7200,7 +7201,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" }, "funding": [ { @@ -7216,7 +7217,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-08-16T06:22:46+00:00" }, { "name": "symfony/process", @@ -7282,16 +7283,16 @@ }, { "name": "symfony/service-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a" + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { @@ -7301,13 +7302,10 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -7347,7 +7345,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -7363,20 +7361,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/string", - "version": "v6.3.0", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" + "reference": "53d1a83225002635bca3482fcbf963001313fb68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", - "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", + "reference": "53d1a83225002635bca3482fcbf963001313fb68", "shasum": "" }, "require": { @@ -7433,7 +7431,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.0" + "source": "https://github.com/symfony/string/tree/v6.3.2" }, "funding": [ { @@ -7449,42 +7447,38 @@ "type": "tidelift" } ], - "time": "2023-03-21T21:06:29+00:00" + "time": "2023-07-05T08:41:27+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.2.8", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0" + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d37ab6787be2db993747b6218fcc96e8e3bb4bd0", - "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2027be14f8ae8eae999ceadebcda5b4909b81d45", + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", "symfony/process": "^5.4|^6.0", "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, "bin": [ "Resources/bin/var-dump-server" ], @@ -7521,7 +7515,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.2.8" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.4" }, "funding": [ { @@ -7537,24 +7531,25 @@ "type": "tidelift" } ], - "time": "2023-03-29T21:42:15+00:00" + "time": "2023-08-24T14:51:05+00:00" }, { "name": "symfony/yaml", - "version": "v6.2.7", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e8e6a1d59e050525f27a1f530aa9703423cb7f57" + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e8e6a1d59e050525f27a1f530aa9703423cb7f57", - "reference": "e8e6a1d59e050525f27a1f530aa9703423cb7f57", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add", + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -7563,9 +7558,6 @@ "require-dev": { "symfony/console": "^5.4|^6.0" }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, "bin": [ "Resources/bin/yaml-lint" ], @@ -7595,7 +7587,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.2.7" + "source": "https://github.com/symfony/yaml/tree/v6.3.3" }, "funding": [ { @@ -7611,7 +7603,7 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:57:23+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "thecodingmachine/safe", @@ -8029,16 +8021,16 @@ }, { "name": "gitonomy/gitlib", - "version": "v1.3.7", + "version": "v1.3.8", "source": { "type": "git", "url": "https://github.com/gitonomy/gitlib.git", - "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7" + "reference": "9fea656e75ad6e3452feb2cac46a6c1239cd7f74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/00b57b79f02396aa4c7c163f76fe2bc48faebbb7", - "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7", + "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/9fea656e75ad6e3452feb2cac46a6c1239cd7f74", + "reference": "9fea656e75ad6e3452feb2cac46a6c1239cd7f74", "shasum": "" }, "require": { @@ -8092,7 +8084,7 @@ "description": "Library for accessing git", "support": { "issues": "https://github.com/gitonomy/gitlib/issues", - "source": "https://github.com/gitonomy/gitlib/tree/v1.3.7" + "source": "https://github.com/gitonomy/gitlib/tree/v1.3.8" }, "funding": [ { @@ -8100,20 +8092,20 @@ "type": "tidelift" } ], - "time": "2022-10-04T14:20:15+00:00" + "time": "2023-05-11T08:29:06+00:00" }, { "name": "pdepend/pdepend", - "version": "2.13.0", + "version": "2.14.0", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "31be7cd4f305f3f7b52af99c1cb13fc938d1cfad" + "reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/31be7cd4f305f3f7b52af99c1cb13fc938d1cfad", - "reference": "31be7cd4f305f3f7b52af99c1cb13fc938d1cfad", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/1121d4b04af06e33e9659bac3a6741b91cab1de1", + "reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1", "shasum": "" }, "require": { @@ -8147,9 +8139,15 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", + "keywords": [ + "PHP Depend", + "PHP_Depend", + "dev", + "pdepend" + ], "support": { "issues": "https://github.com/pdepend/pdepend/issues", - "source": "https://github.com/pdepend/pdepend/tree/2.13.0" + "source": "https://github.com/pdepend/pdepend/tree/2.14.0" }, "funding": [ { @@ -8157,20 +8155,20 @@ "type": "tidelift" } ], - "time": "2023-02-28T20:56:15+00:00" + "time": "2023-05-26T13:15:18+00:00" }, { "name": "php-coveralls/php-coveralls", - "version": "v2.5.3", + "version": "v2.6.0", "source": { "type": "git", "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9" + "reference": "9e88d7d38e9eab7c675da674481784321ea7a9bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9d8243bbf0e053333692857c98fab7cfba0d60a9", - "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9", + "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9e88d7d38e9eab7c675da674481784321ea7a9bc", + "reference": "9e88d7d38e9eab7c675da674481784321ea7a9bc", "shasum": "" }, "require": { @@ -8238,9 +8236,9 @@ ], "support": { "issues": "https://github.com/php-coveralls/php-coveralls/issues", - "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.5.3" + "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.6.0" }, - "time": "2022-09-12T20:47:09+00:00" + "time": "2023-07-16T08:39:10+00:00" }, { "name": "phpmd/phpmd", @@ -8446,37 +8444,35 @@ }, { "name": "symfony/config", - "version": "v6.2.7", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "249271da6f545d6579e0663374f8249a80be2893" + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/249271da6f545d6579e0663374f8249a80be2893", - "reference": "249271da6f545d6579e0663374f8249a80be2893", + "url": "https://api.github.com/repos/symfony/config/zipball/b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/filesystem": "^5.4|^6.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<5.4" + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" }, "require-dev": { "symfony/event-dispatcher": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, "type": "library", "autoload": { "psr-4": { @@ -8503,7 +8499,7 @@ "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/v6.2.7" + "source": "https://github.com/symfony/config/tree/v6.3.2" }, "funding": [ { @@ -8519,34 +8515,34 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-07-19T20:22:16+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.2.8", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "b6195feacceb88fc58a02b69522b569e4c6188ac" + "reference": "68a5a9570806a087982f383f6109c5e925892a49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b6195feacceb88fc58a02b69522b569e4c6188ac", - "reference": "b6195feacceb88fc58a02b69522b569e4c6188ac", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/68a5a9570806a087982f383f6109c5e925892a49", + "reference": "68a5a9570806a087982f383f6109c5e925892a49", "shasum": "" }, "require": { "php": ">=8.1", "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/service-contracts": "^1.1.6|^2.0|^3.0", - "symfony/var-exporter": "^6.2.7" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.2.10" }, "conflict": { "ext-psr": "<1.1|>=2", "symfony/config": "<6.1", "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.2", + "symfony/proxy-manager-bridge": "<6.3", "symfony/yaml": "<5.4" }, "provide": { @@ -8558,12 +8554,6 @@ "symfony/expression-language": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/yaml": "" - }, "type": "library", "autoload": { "psr-4": { @@ -8590,7 +8580,7 @@ "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/v6.2.8" + "source": "https://github.com/symfony/dependency-injection/tree/v6.3.4" }, "funding": [ { @@ -8606,25 +8596,25 @@ "type": "tidelift" } ], - "time": "2023-03-30T13:35:57+00:00" + "time": "2023-08-16T17:55:17+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.2.7", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f" + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", - "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/service-contracts": "^1|^2|^3" + "symfony/service-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -8652,7 +8642,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.2.7" + "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" }, "funding": [ { @@ -8668,20 +8658,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-02-16T10:14:28+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.2.8", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "8302bb670204500d492c6b8c595ee9a27da62cd6" + "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8302bb670204500d492c6b8c595ee9a27da62cd6", - "reference": "8302bb670204500d492c6b8c595ee9a27da62cd6", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/df1f8aac5751871b83d30bf3e2c355770f8f0691", + "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691", "shasum": "" }, "require": { @@ -8726,7 +8716,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.2.8" + "source": "https://github.com/symfony/var-exporter/tree/v6.3.4" }, "funding": [ { @@ -8742,7 +8732,7 @@ "type": "tidelift" } ], - "time": "2023-03-14T15:48:45+00:00" + "time": "2023-08-16T18:14:47+00:00" } ], "aliases": [], diff --git a/etc/config/.env.example b/etc/config/.env.example index d1acde342..3291d1082 100644 --- a/etc/config/.env.example +++ b/etc/config/.env.example @@ -24,6 +24,8 @@ SELENIUM_CLOSE_ALL_SESSIONS=true #*** Browser for running tests, default chrome. Uncomment and change if you want to run tests on another browser (ex. firefox). BROWSER=chrome +WINDOW_WIDTH=1920 +WINDOW_HEIGHT=1080 #*** Uncomment and set host & port if your dev environment needs different value other than MAGENTO_BASE_URL for Rest API Requests ***# #MAGENTO_RESTAPI_SERVER_HOST=restapi.magento.com diff --git a/etc/config/functional.suite.dist.yml b/etc/config/functional.suite.dist.yml index 161ddeee6..cacc6836f 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -24,7 +24,7 @@ modules: backend_name: "%MAGENTO_BACKEND_NAME%" browser: 'chrome' restart: true - window_size: 1280x1024 + window_size: 1920x1080 username: "%MAGENTO_ADMIN_USERNAME%" password: "%MAGENTO_ADMIN_PASSWORD%" pageload_timeout: "%WAIT_TIMEOUT%" @@ -38,4 +38,4 @@ modules: capabilities: unhandledPromptBehavior: "ignore" chromeOptions: - args: ["--no-sandbox", "--window-size=1280,1024", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--ignore-certificate-errors", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad"] + args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--ignore-certificate-errors", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad"] From f5cce72d1103b2ad1780352c2c98601e984b811a Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Mon, 4 Sep 2023 10:35:32 +0530 Subject: [PATCH 516/674] MFTF 4.4.2 Release --- CHANGELOG.md | 5 +++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc0566cd5..8c79aca60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Magento Functional Testing Framework Changelog ================================================ +4.4.2 +--------- +### Fixes +* Fixed deprecation warnings. + 4.4.1 --------- * Same as previous release diff --git a/composer.json b/composer.json index 7fd729ef7..96f20576b 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": "4.4.1", + "version": "4.4.2", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 20b3bd5e6..938f7b5f9 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": "ed9a0f6b303c7381d59f64ba18a27446", + "content-hash": "fea242b10e0e1973576554e3f1e02eb0", "packages": [ { "name": "allure-framework/allure-codeception", From ca4b273d9e54ae7c7e05c1ff02b0b239a8bbc5fd Mon Sep 17 00:00:00 2001 From: Manjusha <manjusha@BLR1-LMC-N71901.local> Date: Mon, 4 Sep 2023 10:36:24 +0530 Subject: [PATCH 517/674] MFTF 4.4.2 Release --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c79aca60..f594eebf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Magento Functional Testing Framework Changelog 4.4.2 --------- ### Fixes -* Fixed deprecation warnings. +* Fixed PHP 8.2 deprecation warnings. 4.4.1 --------- From afc0333b90a313cfebe1bdc40a4c9f0d6cb0b6ce Mon Sep 17 00:00:00 2001 From: Rajesh Kumar <glo71317@adobe.com> Date: Mon, 18 Sep 2023 12:10:43 +0530 Subject: [PATCH 518/674] AC-9499::Update Symfony dependency packages to the latest LTS versions 6.4 --- composer.json | 17 ++- composer.lock | 323 +++++++++++++++----------------------------------- 2 files changed, 101 insertions(+), 239 deletions(-) diff --git a/composer.json b/composer.json index 7fd729ef7..981d36007 100755 --- a/composer.json +++ b/composer.json @@ -32,19 +32,18 @@ "nikic/php-parser": "^4.4", "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0", - "symfony/console": "^4.4||^5.4", - "symfony/string": "^5.4||^6.3", - "symfony/dotenv": "^5.3||^6.3", - "symfony/finder": "^5.0||^6.3", - "symfony/http-foundation": "^5.0||^6.3", - "symfony/mime": "^5.0||^6.3", - "symfony/process": "<=5.4.23", + "symfony/console": "^6.3", + "symfony/string": "^6.3", + "symfony/dotenv": "^6.3", + "symfony/finder": "^6.3", + "symfony/http-foundation": "^6.3", + "symfony/mime": "^6.3", + "symfony/process": "^6.3", "weew/helpers-array": "^1.3", "doctrine/annotations": "^2.0" }, "require-dev": { - "brainmaestro/composer-git-hooks": "^2.3.1", - "codacy/coverage": "^1.4", + "brainmaestro/composer-git-hooks": "^v3.0.0-alpha.1", "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", "phpunit/phpunit": "<=9.5.20", diff --git a/composer.lock b/composer.lock index 20b3bd5e6..6914b536d 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": "ed9a0f6b303c7381d59f64ba18a27446", + "content-hash": "eb338b540a695fad45ff8ba114a87c24", "packages": [ { "name": "allure-framework/allure-codeception", @@ -5655,52 +5655,43 @@ }, { "name": "symfony/console", - "version": "v5.4.22", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8" + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3cd51fd2e6c461ca678f84d419461281bd87a0a8", - "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8", + "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0" }, "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" }, "provide": { - "psr/log-implementation": "1.0|2.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -5734,7 +5725,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.22" + "source": "https://github.com/symfony/console/tree/v6.3.4" }, "funding": [ { @@ -5750,7 +5741,7 @@ "type": "tidelift" } ], - "time": "2023-03-25T09:27:28+00:00" + "time": "2023-08-16T10:10:12+00:00" }, { "name": "symfony/css-selector", @@ -6409,16 +6400,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -6433,7 +6424,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6471,7 +6462,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -6487,20 +6478,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -6512,7 +6503,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6552,7 +6543,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -6568,7 +6559,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6659,16 +6650,16 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -6680,7 +6671,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6723,7 +6714,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -6739,20 +6730,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -6767,7 +6758,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6806,7 +6797,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -6822,7 +6813,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php72", @@ -6981,16 +6972,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -6999,7 +6990,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7044,7 +7035,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -7060,7 +7051,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php81", @@ -7220,21 +7211,20 @@ }, { "name": "symfony/process", - "version": "v5.4.23", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "4b842fc4b61609e0a155a114082bd94e31e98287" + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/4b842fc4b61609e0a155a114082bd94e31e98287", - "reference": "4b842fc4b61609e0a155a114082bd94e31e98287", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -7262,7 +7252,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.23" + "source": "https://github.com/symfony/process/tree/v6.3.4" }, "funding": [ { @@ -7278,20 +7268,20 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:50:24+00:00" + "time": "2023-08-07T10:39:22+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a" + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { @@ -7301,13 +7291,10 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -7347,7 +7334,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -7363,20 +7350,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/string", - "version": "v6.3.0", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" + "reference": "53d1a83225002635bca3482fcbf963001313fb68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", - "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", + "reference": "53d1a83225002635bca3482fcbf963001313fb68", "shasum": "" }, "require": { @@ -7433,7 +7420,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.0" + "source": "https://github.com/symfony/string/tree/v6.3.2" }, "funding": [ { @@ -7449,7 +7436,7 @@ "type": "tidelift" } ], - "time": "2023-03-21T21:06:29+00:00" + "time": "2023-07-05T08:41:27+00:00" }, { "name": "symfony/var-dumper", @@ -7905,26 +7892,26 @@ "packages-dev": [ { "name": "brainmaestro/composer-git-hooks", - "version": "v2.8.5", + "version": "v3.0.0-alpha.1", "source": { "type": "git", "url": "https://github.com/BrainMaestro/composer-git-hooks.git", - "reference": "ffed8803690ac12214082120eee3441b00aa390e" + "reference": "d230a0060a330b8f4d8bd99f602aad4d3ad763ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/BrainMaestro/composer-git-hooks/zipball/ffed8803690ac12214082120eee3441b00aa390e", - "reference": "ffed8803690ac12214082120eee3441b00aa390e", + "url": "https://api.github.com/repos/BrainMaestro/composer-git-hooks/zipball/d230a0060a330b8f4d8bd99f602aad4d3ad763ee", + "reference": "d230a0060a330b8f4d8bd99f602aad4d3ad763ee", "shasum": "" }, "require": { - "php": "^5.6 || >=7.0", - "symfony/console": "^3.2 || ^4.0 || ^5.0" + "php": "^8.0", + "symfony/console": "^6.0" }, "require-dev": { "ext-json": "*", - "friendsofphp/php-cs-fixer": "^2.9", - "phpunit/phpunit": "^5.7 || ^7.0" + "friendsofphp/php-cs-fixer": "^3.0", + "phpunit/phpunit": "^9.5" }, "bin": [ "cghooks" @@ -7936,7 +7923,7 @@ "pre-push": [ "composer test", "appver=$(grep -o -E '\\d.\\d.\\d' cghooks)", - "tag=$(git describe --tags --abbrev=0)", + "tag=$(git tag | tail -n 1)", "if [ \"$tag\" != \"v$appver\" ]; then", "echo \"The most recent tag $tag does not match the application version $appver\\n\"", "tag=${tag#v}", @@ -7972,135 +7959,9 @@ ], "support": { "issues": "https://github.com/BrainMaestro/composer-git-hooks/issues", - "source": "https://github.com/BrainMaestro/composer-git-hooks/tree/v2.8.5" - }, - "time": "2021-02-08T15:59:11+00:00" - }, - { - "name": "codacy/coverage", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/codacy/php-codacy-coverage.git", - "reference": "1852ca987c91ef466ebcfdbdd4e1788b653eaf1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/codacy/php-codacy-coverage/zipball/1852ca987c91ef466ebcfdbdd4e1788b653eaf1d", - "reference": "1852ca987c91ef466ebcfdbdd4e1788b653eaf1d", - "shasum": "" - }, - "require": { - "gitonomy/gitlib": ">=1.0", - "php": ">=5.3.3", - "symfony/console": "~2.5|~3.0|~4.0|~5.0" - }, - "require-dev": { - "clue/phar-composer": "^1.1", - "phpunit/phpunit": "~6.5" - }, - "bin": [ - "bin/codacycoverage" - ], - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] + "source": "https://github.com/BrainMaestro/composer-git-hooks/tree/v3.0.0-alpha.1" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jakob Pupke", - "email": "jakob.pupke@gmail.com" - } - ], - "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" - }, - { - "name": "gitonomy/gitlib", - "version": "v1.3.7", - "source": { - "type": "git", - "url": "https://github.com/gitonomy/gitlib.git", - "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/00b57b79f02396aa4c7c163f76fe2bc48faebbb7", - "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7", - "shasum": "" - }, - "require": { - "ext-pcre": "*", - "php": "^5.6 || ^7.0 || ^8.0", - "symfony/polyfill-mbstring": "^1.7", - "symfony/process": "^3.4 || ^4.4 || ^5.0 || ^6.0" - }, - "require-dev": { - "ext-fileinfo": "*", - "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.20 || ^9.5.9", - "psr/log": "^1.0" - }, - "suggest": { - "ext-fileinfo": "Required to determine the mimetype of a blob", - "psr/log": "Required to use loggers for reporting of execution" - }, - "type": "library", - "autoload": { - "psr-4": { - "Gitonomy\\Git\\": "src/Gitonomy/Git/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Julien Didier", - "email": "genzo.wm@gmail.com", - "homepage": "https://github.com/juliendidier" - }, - { - "name": "Grégoire Pineau", - "email": "lyrixx@lyrixx.info", - "homepage": "https://github.com/lyrixx" - }, - { - "name": "Alexandre Salomé", - "email": "alexandre.salome@gmail.com", - "homepage": "https://github.com/alexandresalome" - } - ], - "description": "Library for accessing git", - "support": { - "issues": "https://github.com/gitonomy/gitlib/issues", - "source": "https://github.com/gitonomy/gitlib/tree/v1.3.7" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/gitonomy/gitlib", - "type": "tidelift" - } - ], - "time": "2022-10-04T14:20:15+00:00" + "time": "2022-07-20T15:47:30+00:00" }, { "name": "pdepend/pdepend", @@ -8747,7 +8608,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "brainmaestro/composer-git-hooks": 15 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { From 2b55d9cb7df2b41f4259bc4cfa0d2e5724167acc Mon Sep 17 00:00:00 2001 From: Rajesh Kumar <glo71317@adobe.com> Date: Thu, 21 Sep 2023 16:27:38 +0530 Subject: [PATCH 519/674] AC-9499::Update Symfony dependency packages to the latest LTS versions 6.4 --- composer.json | 14 +++++++------- composer.lock | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 981d36007..d5afcf875 100755 --- a/composer.json +++ b/composer.json @@ -32,13 +32,13 @@ "nikic/php-parser": "^4.4", "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0", - "symfony/console": "^6.3", - "symfony/string": "^6.3", - "symfony/dotenv": "^6.3", - "symfony/finder": "^6.3", - "symfony/http-foundation": "^6.3", - "symfony/mime": "^6.3", - "symfony/process": "^6.3", + "symfony/console": "^5.4||^6.0", + "symfony/string": "^5.4||^6.0", + "symfony/dotenv": "^5.4||^6.0", + "symfony/finder": "^5.4||^6.0", + "symfony/http-foundation": "^5.4||^6.0", + "symfony/mime": "^5.4||^6.0", + "symfony/process": "^5.4||^6.0", "weew/helpers-array": "^1.3", "doctrine/annotations": "^2.0" }, diff --git a/composer.lock b/composer.lock index 6914b536d..e5832c300 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": "eb338b540a695fad45ff8ba114a87c24", + "content-hash": "e03c11234d51bb587d128640d9387b84", "packages": [ { "name": "allure-framework/allure-codeception", From 78ef400920a57de71808d4a5111202fed295d334 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Fri, 15 Sep 2023 10:28:09 -0500 Subject: [PATCH 520/674] ACQE-5434: Increase browser resolution for UI Functional tests --- CHANGELOG.md | 4 - composer.json | 2 +- composer.lock | 838 ++++++++++++++++---------------- etc/config/.credentials.example | 1 + 4 files changed, 426 insertions(+), 419 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d61b5e827..dc0566cd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,5 @@ Magento Functional Testing Framework Changelog ================================================ -4.4.2 ---------- -### Enhancements -* Increase browser resolution to 1920x1080. 4.4.1 --------- diff --git a/composer.json b/composer.json index 96f20576b..7fd729ef7 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": "4.4.2", + "version": "4.4.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index d1904cf87..20b3bd5e6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,34 +4,35 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "fea242b10e0e1973576554e3f1e02eb0", + "content-hash": "ed9a0f6b303c7381d59f64ba18a27446", "packages": [ { "name": "allure-framework/allure-codeception", - "version": "v2.3.0", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-codeception.git", - "reference": "d28f6ba7139406974b977e5611bc65b59c492a55" + "reference": "1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/d28f6ba7139406974b977e5611bc65b59c492a55", - "reference": "d28f6ba7139406974b977e5611bc65b59c492a55", + "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8", + "reference": "1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8", "shasum": "" }, "require": { - "allure-framework/allure-php-commons": "^2.3.1", - "codeception/codeception": "^5.0.3", + "allure-framework/allure-php-commons": "^2", + "codeception/codeception": "^5", "ext-json": "*", "php": "^8" }, "require-dev": { + "phpunit/phpunit": "^9", "psalm/plugin-phpunit": "^0.18.4", "remorhaz/php-json-data": "^0.5.3", "remorhaz/php-json-path": "^0.7.7", - "squizlabs/php_codesniffer": "^3.7.2", - "vimeo/psalm": "^5.12" + "squizlabs/php_codesniffer": "^3.7.1", + "vimeo/psalm": "^5.2" }, "type": "library", "autoload": { @@ -71,20 +72,20 @@ "issues": "https://github.com/allure-framework/allure-codeception/issues", "source": "https://github.com/allure-framework/allure-codeception" }, - "time": "2023-05-31T14:10:46+00:00" + "time": "2023-01-09T08:09:01+00:00" }, { "name": "allure-framework/allure-php-commons", - "version": "v2.3.1", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-php-commons2.git", - "reference": "5d7ed5ab510339652163ca1473eb499d4b7ec488" + "reference": "c2b222c1f999c851e029290c09a3fe4933390bda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/5d7ed5ab510339652163ca1473eb499d4b7ec488", - "reference": "5d7ed5ab510339652163ca1473eb499d4b7ec488", + "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/c2b222c1f999c851e029290c09a3fe4933390bda", + "reference": "c2b222c1f999c851e029290c09a3fe4933390bda", "shasum": "" }, "require": { @@ -99,10 +100,10 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "^1", - "phpunit/phpunit": "^9.6.8", + "phpunit/phpunit": "^9.5.10", "psalm/plugin-phpunit": "^0.18.4", - "squizlabs/php_codesniffer": "^3.7.2", - "vimeo/psalm": "^5.12" + "squizlabs/php_codesniffer": "^3.7.1", + "vimeo/psalm": "^5.4" }, "type": "library", "autoload": { @@ -141,7 +142,7 @@ "issues": "https://github.com/allure-framework/allure-php-commons2/issues", "source": "https://github.com/allure-framework/allure-php-commons" }, - "time": "2023-05-30T10:55:43+00:00" + "time": "2023-01-12T14:28:21+00:00" }, { "name": "allure-framework/allure-phpunit", @@ -213,16 +214,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.2", + "version": "v1.2.1", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9" + "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/2f1dc7b7eda080498be96a4a6d683a41583030e9", - "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/1926277fc71d253dfa820271ac5987bdb193ccf5", + "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5", "shasum": "" }, "require": { @@ -261,22 +262,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.2" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.1" }, - "time": "2023-07-20T16:49:55+00:00" + "time": "2023-03-24T20:22:19+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.280.0", + "version": "3.268.16", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "bf4f3079bc59af44a752677cfbcd43f7953c4343" + "reference": "b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/bf4f3079bc59af44a752677cfbcd43f7953c4343", - "reference": "bf4f3079bc59af44a752677cfbcd43f7953c4343", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98", + "reference": "b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98", "shasum": "" }, "require": { @@ -285,11 +286,10 @@ "ext-pcre": "*", "ext-simplexml": "*", "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0 || ^2.0", + "guzzlehttp/promises": "^1.4.0", "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "mtdowling/jmespath.php": "^2.6", - "php": ">=7.2.5", - "psr/http-message": "^1.0 || ^2.0" + "php": ">=5.5" }, "require-dev": { "andrewsville/php-token-reflection": "^1.4", @@ -304,8 +304,9 @@ "ext-sockets": "*", "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", + "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", "psr/cache": "^1.0", + "psr/http-message": "^1.0", "psr/simple-cache": "^1.0", "sebastian/comparator": "^1.2.3 || ^4.0", "yoast/phpunit-polyfills": "^1.0" @@ -356,9 +357,9 @@ "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.280.0" + "source": "https://github.com/aws/aws-sdk-php/tree/3.268.16" }, - "time": "2023-08-30T18:19:33+00:00" + "time": "2023-04-21T21:37:05+00:00" }, { "name": "beberlei/assert", @@ -547,16 +548,16 @@ }, { "name": "codeception/codeception", - "version": "5.0.11", + "version": "5.0.10", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "1998a287a3d7f2771c9591aef1c528d9d44cc4b4" + "reference": "ed4af7fd4103cdd035916fbb8f35124edd2d018b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/1998a287a3d7f2771c9591aef1c528d9d44cc4b4", - "reference": "1998a287a3d7f2771c9591aef1c528d9d44cc4b4", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/ed4af7fd4103cdd035916fbb8f35124edd2d018b", + "reference": "ed4af7fd4103cdd035916fbb8f35124edd2d018b", "shasum": "" }, "require": { @@ -651,7 +652,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/5.0.11" + "source": "https://github.com/Codeception/Codeception/tree/5.0.10" }, "funding": [ { @@ -659,7 +660,7 @@ "type": "open_collective" } ], - "time": "2023-08-22T06:42:39+00:00" + "time": "2023-03-14T07:21:10+00:00" }, { "name": "codeception/lib-asserts", @@ -935,16 +936,16 @@ }, { "name": "codeception/stub", - "version": "4.1.1", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "4aaeffdc7089f3cae173b73bd4bc3672e4618747" + "reference": "58751aed08a68ae960a952fd3fe74ee9a56cdb1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/4aaeffdc7089f3cae173b73bd4bc3672e4618747", - "reference": "4aaeffdc7089f3cae173b73bd4bc3672e4618747", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/58751aed08a68ae960a952fd3fe74ee9a56cdb1b", + "reference": "58751aed08a68ae960a952fd3fe74ee9a56cdb1b", "shasum": "" }, "require": { @@ -970,22 +971,22 @@ "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", "support": { "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/4.1.1" + "source": "https://github.com/Codeception/Stub/tree/4.1.0" }, - "time": "2023-08-16T19:17:44+00:00" + "time": "2022-12-27T18:41:43+00:00" }, { "name": "composer/ca-bundle", - "version": "1.3.7", + "version": "1.3.5", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" + "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", - "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", "shasum": "" }, "require": { @@ -1032,7 +1033,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.7" + "source": "https://github.com/composer/ca-bundle/tree/1.3.5" }, "funding": [ { @@ -1048,26 +1049,26 @@ "type": "tidelift" } ], - "time": "2023-08-30T09:31:38+00:00" + "time": "2023-01-11T08:27:00+00:00" }, { "name": "composer/class-map-generator", - "version": "1.1.0", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9" + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/953cc4ea32e0c31f2185549c7d216d7921f03da9", - "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", "shasum": "" }, "require": { - "composer/pcre": "^2.1 || ^3.1", + "composer/pcre": "^2 || ^3", "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" + "symfony/finder": "^4.4 || ^5.3 || ^6" }, "require-dev": { "phpstan/phpstan": "^1.6", @@ -1105,7 +1106,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.1.0" + "source": "https://github.com/composer/class-map-generator/tree/1.0.0" }, "funding": [ { @@ -1121,20 +1122,20 @@ "type": "tidelift" } ], - "time": "2023-06-30T13:58:57+00:00" + "time": "2022-06-19T11:31:27+00:00" }, { "name": "composer/composer", - "version": "2.5.8", + "version": "2.5.5", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "4c516146167d1392c8b9b269bb7c24115d262164" + "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/4c516146167d1392c8b9b269bb7c24115d262164", - "reference": "4c516146167d1392c8b9b269bb7c24115d262164", + "url": "https://api.github.com/repos/composer/composer/zipball/c7cffaad16a60636a776017eac5bd8cd0095c32f", + "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f", "shasum": "" }, "require": { @@ -1218,7 +1219,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.5.8" + "source": "https://github.com/composer/composer/tree/2.5.5" }, "funding": [ { @@ -1234,7 +1235,7 @@ "type": "tidelift" } ], - "time": "2023-06-09T15:13:21+00:00" + "time": "2023-03-21T10:50:05+00:00" }, { "name": "composer/metadata-minifier", @@ -1743,29 +1744,25 @@ }, { "name": "doctrine/deprecations", - "version": "v1.1.1", + "version": "v1.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.1|^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" + "phpunit/phpunit": "^7.5|^8.5|^9.5", + "psr/log": "^1|^2|^3" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -1784,9 +1781,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" + "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" }, - "time": "2023-06-03T09:27:29+00:00" + "time": "2022-05-02T15:47:09+00:00" }, { "name": "doctrine/instantiator", @@ -1860,27 +1857,28 @@ }, { "name": "doctrine/lexer", - "version": "3.0.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "84a527db05647743d50373e0ec53a152f2cde568" + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", - "reference": "84a527db05647743d50373e0ec53a152f2cde568", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", "shasum": "" }, "require": { - "php": "^8.1" + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^9.5", + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^5.0" + "vimeo/psalm": "^4.11 || ^5.0" }, "type": "library", "autoload": { @@ -1917,7 +1915,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.0" + "source": "https://github.com/doctrine/lexer/tree/2.1.0" }, "funding": [ { @@ -1933,26 +1931,26 @@ "type": "tidelift" } ], - "time": "2022-12-15T16:57:16+00:00" + "time": "2022-12-14T08:49:07+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.8.0", + "version": "7.5.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" + "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b964ca597e86b752cd994f27293e9fa6b6a95ed9", + "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -1963,8 +1961,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", - "php-http/message-factory": "^1.1", + "php-http/client-integration-tests": "^3.0", "phpunit/phpunit": "^8.5.29 || ^9.5.23", "psr/log": "^1.1 || ^2.0 || ^3.0" }, @@ -1978,6 +1975,9 @@ "bamarni-bin": { "bin-links": true, "forward-command": false + }, + "branch-alias": { + "dev-master": "7.5-dev" } }, "autoload": { @@ -2043,7 +2043,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.0" + "source": "https://github.com/guzzle/guzzle/tree/7.5.1" }, "funding": [ { @@ -2059,37 +2059,38 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:20:53+00:00" + "time": "2023-04-17T16:30:08+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" + "reference": "b94b2807d85443f9719887892882d0329d1e2598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", - "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "php": ">=5.5" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "symfony/phpunit-bridge": "^4.4 || ^5.1" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false + "branch-alias": { + "dev-master": "1.5-dev" } }, "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -2126,7 +2127,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.1" + "source": "https://github.com/guzzle/promises/tree/1.5.2" }, "funding": [ { @@ -2142,20 +2143,20 @@ "type": "tidelift" } ], - "time": "2023-08-03T15:11:55+00:00" + "time": "2022-08-28T14:55:35+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.1", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" + "reference": "b635f279edd83fc275f822a1188157ffea568ff6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6", "shasum": "" }, "require": { @@ -2242,7 +2243,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.1" + "source": "https://github.com/guzzle/psr7/tree/2.5.0" }, "funding": [ { @@ -2258,7 +2259,7 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:13:57+00:00" + "time": "2023-04-17T16:11:26+00:00" }, { "name": "justinrainbow/json-schema", @@ -2531,25 +2532,25 @@ }, { "name": "mtdowling/jmespath.php", - "version": "2.7.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b" + "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b", - "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", + "php": "^5.4 || ^7.0 || ^8.0", "symfony/polyfill-mbstring": "^1.17" }, "require-dev": { - "composer/xdebug-handler": "^3.0.3", - "phpunit/phpunit": "^8.5.33" + "composer/xdebug-handler": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^7.5.15" }, "bin": [ "bin/jp.php" @@ -2557,7 +2558,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "2.6-dev" } }, "autoload": { @@ -2573,11 +2574,6 @@ "MIT" ], "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", @@ -2591,9 +2587,9 @@ ], "support": { "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0" + "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1" }, - "time": "2023-08-25T10:54:48+00:00" + "time": "2021-06-14T00:11:39+00:00" }, { "name": "mustache/mustache", @@ -2706,16 +2702,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.17.1", + "version": "v4.15.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", "shasum": "" }, "require": { @@ -2756,9 +2752,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" }, - "time": "2023-08-13T19:53:39+00:00" + "time": "2023-03-05T19:49:14+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -2940,16 +2936,16 @@ }, { "name": "php-webdriver/webdriver", - "version": "1.15.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "a1578689290055586f1ee51eaf0ec9d52895bb6d" + "reference": "3ea4f924afb43056bf9c630509e657d951608563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/a1578689290055586f1ee51eaf0ec9d52895bb6d", - "reference": "a1578689290055586f1ee51eaf0ec9d52895bb6d", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/3ea4f924afb43056bf9c630509e657d951608563", + "reference": "3ea4f924afb43056bf9c630509e657d951608563", "shasum": "" }, "require": { @@ -3000,9 +2996,9 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.0" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.14.0" }, - "time": "2023-08-29T13:52:26+00:00" + "time": "2023-02-09T12:12:19+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -3116,16 +3112,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.7.3", + "version": "1.7.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" + "reference": "dfc078e8af9c99210337325ff5aa152872c98714" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", - "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/dfc078e8af9c99210337325ff5aa152872c98714", + "reference": "dfc078e8af9c99210337325ff5aa152872c98714", "shasum": "" }, "require": { @@ -3168,9 +3164,9 @@ "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.7.3" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.1" }, - "time": "2023-08-12T11:01:26+00:00" + "time": "2023-03-27T19:02:04+00:00" }, { "name": "phpspec/prophecy", @@ -3242,24 +3238,22 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.23.1", + "version": "1.20.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26" + "reference": "57f6787f0bb6431905a18aa7caea25dcd2bd59e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/846ae76eef31c6d7790fac9bc399ecee45160b26", - "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/57f6787f0bb6431905a18aa7caea25dcd2bd59e0", + "reference": "57f6787f0bb6431905a18aa7caea25dcd2bd59e0", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^4.15", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.5", @@ -3283,22 +3277,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.23.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.20.1" }, - "time": "2023-08-03T16:32:59+00:00" + "time": "2023-04-22T09:05:52+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.27", + "version": "9.2.26", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1" + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b0a88255cb70d52653d80c890bd7f38740ea50d1", - "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", "shasum": "" }, "require": { @@ -3354,8 +3348,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.27" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" }, "funding": [ { @@ -3363,7 +3356,7 @@ "type": "github" } ], - "time": "2023-07-26T13:44:30+00:00" + "time": "2023-03-06T12:58:08+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4073,16 +4066,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.20", + "version": "v0.11.15", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "0fa27040553d1d280a67a4393194df5228afea5b" + "reference": "5350ce0ec8ecf2c5b5cf554cd2496f97b444af85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/0fa27040553d1d280a67a4393194df5228afea5b", - "reference": "0fa27040553d1d280a67a4393194df5228afea5b", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/5350ce0ec8ecf2c5b5cf554cd2496f97b444af85", + "reference": "5350ce0ec8ecf2c5b5cf554cd2496f97b444af85", "shasum": "" }, "require": { @@ -4143,9 +4136,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.20" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.15" }, - "time": "2023-07-31T14:32:22+00:00" + "time": "2023-04-07T21:57:09+00:00" }, { "name": "ralouphie/getallheaders", @@ -4374,23 +4367,23 @@ }, { "name": "react/promise", - "version": "v2.10.0", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", - "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4434,15 +4427,19 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.10.0" + "source": "https://github.com/reactphp/promise/tree/v2.9.0" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" } ], - "time": "2023-05-02T15:15:43+00:00" + "time": "2022-02-11T10:27:51+00:00" }, { "name": "sebastian/cli-parser", @@ -4744,16 +4741,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.5", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", "shasum": "" }, "require": { @@ -4798,7 +4795,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" }, "funding": [ { @@ -4806,7 +4803,7 @@ "type": "github" } ], - "time": "2023-05-07T05:35:17+00:00" + "time": "2020-10-26T13:10:38+00:00" }, { "name": "sebastian/environment", @@ -4950,16 +4947,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.6", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bde739e7565280bda77be70044ac1047bc007e34" + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", - "reference": "bde739e7565280bda77be70044ac1047bc007e34", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", "shasum": "" }, "require": { @@ -5002,7 +4999,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" }, "funding": [ { @@ -5010,7 +5007,7 @@ "type": "github" } ], - "time": "2023-08-02T09:26:13+00:00" + "time": "2022-02-14T08:28:10+00:00" }, { "name": "sebastian/lines-of-code", @@ -5410,16 +5407,16 @@ }, { "name": "seld/jsonlint", - "version": "1.10.0", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1" + "reference": "4211420d25eba80712bff236a98960ef68b866b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", - "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", + "reference": "4211420d25eba80712bff236a98960ef68b866b7", "shasum": "" }, "require": { @@ -5458,7 +5455,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.10.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" }, "funding": [ { @@ -5470,7 +5467,7 @@ "type": "tidelift" } ], - "time": "2023-05-11T13:16:46+00:00" + "time": "2022-04-01T13:37:23+00:00" }, { "name": "seld/phar-utils", @@ -5658,16 +5655,16 @@ }, { "name": "symfony/console", - "version": "v5.4.28", + "version": "v5.4.22", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827" + "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827", + "url": "https://api.github.com/repos/symfony/console/zipball/3cd51fd2e6c461ca678f84d419461281bd87a0a8", + "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8", "shasum": "" }, "require": { @@ -5737,7 +5734,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.28" + "source": "https://github.com/symfony/console/tree/v5.4.22" }, "funding": [ { @@ -5753,20 +5750,20 @@ "type": "tidelift" } ], - "time": "2023-08-07T06:12:30+00:00" + "time": "2023-03-25T09:27:28+00:00" }, { "name": "symfony/css-selector", - "version": "v6.3.2", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "883d961421ab1709877c10ac99451632a3d6fa57" + "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", - "reference": "883d961421ab1709877c10ac99451632a3d6fa57", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/aedf3cb0f5b929ec255d96bbb4909e9932c769e0", + "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0", "shasum": "" }, "require": { @@ -5802,7 +5799,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.3.2" + "source": "https://github.com/symfony/css-selector/tree/v6.2.7" }, "funding": [ { @@ -5818,7 +5815,7 @@ "type": "tidelift" } ], - "time": "2023-07-12T16:00:22+00:00" + "time": "2023-02-14T08:44:56+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5963,25 +5960,24 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.3.2", + "version": "v6.2.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" + "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", - "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/04046f35fd7d72f9646e721fc2ecb8f9c67d3339", + "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2.5|^3" + "symfony/event-dispatcher-contracts": "^2|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/service-contracts": "<2.5" + "symfony/dependency-injection": "<5.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -5994,9 +5990,13 @@ "symfony/error-handler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^2.5|^3", + "symfony/service-contracts": "^1.1|^2|^3", "symfony/stopwatch": "^5.4|^6.0" }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, "type": "library", "autoload": { "psr-4": { @@ -6023,7 +6023,7 @@ "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/v6.3.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.8" }, "funding": [ { @@ -6039,30 +6039,33 @@ "type": "tidelift" } ], - "time": "2023-07-06T06:56:43+00:00" + "time": "2023-03-20T16:06:02+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.3.0", + "version": "v3.2.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", "shasum": "" }, "require": { "php": ">=8.1", "psr/event-dispatcher": "^1" }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -6099,7 +6102,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.1" }, "funding": [ { @@ -6115,20 +6118,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2023-03-01T10:32:47+00:00" }, { "name": "symfony/filesystem", - "version": "v6.3.1", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" + "reference": "82b6c62b959f642d000456f08c6d219d749215b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", - "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/82b6c62b959f642d000456f08c6d219d749215b3", + "reference": "82b6c62b959f642d000456f08c6d219d749215b3", "shasum": "" }, "require": { @@ -6162,7 +6165,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.3.1" + "source": "https://github.com/symfony/filesystem/tree/v6.2.7" }, "funding": [ { @@ -6178,20 +6181,20 @@ "type": "tidelift" } ], - "time": "2023-06-01T08:30:39+00:00" + "time": "2023-02-14T08:44:56+00:00" }, { "name": "symfony/finder", - "version": "v6.3.3", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" + "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", - "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "url": "https://api.github.com/repos/symfony/finder/zipball/d9b01ba073c44cef617c7907ce2419f8d00d75e2", + "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2", "shasum": "" }, "require": { @@ -6226,7 +6229,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.3" + "source": "https://github.com/symfony/finder/tree/v6.3.0" }, "funding": [ { @@ -6242,20 +6245,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T08:31:44+00:00" + "time": "2023-04-02T01:25:41+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.3.4", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "cac1556fdfdf6719668181974104e6fcfa60e844" + "reference": "718a97ed430d34e5c568ea2c44eab708c6efbefb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cac1556fdfdf6719668181974104e6fcfa60e844", - "reference": "cac1556fdfdf6719668181974104e6fcfa60e844", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/718a97ed430d34e5c568ea2c44eab708c6efbefb", + "reference": "718a97ed430d34e5c568ea2c44eab708c6efbefb", "shasum": "" }, "require": { @@ -6303,7 +6306,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.4" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.0" }, "funding": [ { @@ -6319,25 +6322,24 @@ "type": "tidelift" } ], - "time": "2023-08-22T08:20:46+00:00" + "time": "2023-05-19T12:46:45+00:00" }, { "name": "symfony/mime", - "version": "v6.3.3", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98" + "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", - "reference": "9a0cbd52baa5ba5a5b1f0cacc59466f194730f98", + "url": "https://api.github.com/repos/symfony/mime/zipball/7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", + "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -6346,7 +6348,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" + "symfony/serializer": "<6.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -6355,7 +6357,7 @@ "symfony/dependency-injection": "^5.4|^6.0", "symfony/property-access": "^5.4|^6.0", "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "~6.2.13|^6.3.2" + "symfony/serializer": "^6.2" }, "type": "library", "autoload": { @@ -6387,7 +6389,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.3.3" + "source": "https://github.com/symfony/mime/tree/v6.3.0" }, "funding": [ { @@ -6403,20 +6405,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-04-28T15:57:00+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { @@ -6431,7 +6433,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.28-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6469,7 +6471,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -6485,20 +6487,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.28.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -6510,7 +6512,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.28-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6550,7 +6552,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" }, "funding": [ { @@ -6566,20 +6568,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.28.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" + "reference": "639084e360537a19f9ee352433b84ce831f3d2da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", - "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da", "shasum": "" }, "require": { @@ -6593,7 +6595,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.28-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6637,7 +6639,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" }, "funding": [ { @@ -6653,20 +6655,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:30:37+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -6678,7 +6680,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.28-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6721,7 +6723,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { @@ -6737,20 +6739,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { @@ -6765,7 +6767,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.28-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6804,7 +6806,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -6820,20 +6822,20 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.28.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", - "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", "shasum": "" }, "require": { @@ -6842,7 +6844,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.28-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6880,7 +6882,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" }, "funding": [ { @@ -6896,20 +6898,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.28.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", "shasum": "" }, "require": { @@ -6918,7 +6920,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.28-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6959,7 +6961,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" }, "funding": [ { @@ -6975,20 +6977,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { @@ -6997,7 +6999,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.28-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7042,7 +7044,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { @@ -7058,20 +7060,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.28.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", "shasum": "" }, "require": { @@ -7080,7 +7082,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.28-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7121,7 +7123,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" }, "funding": [ { @@ -7137,20 +7139,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.28.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" + "reference": "508c652ba3ccf69f8c97f251534f229791b52a57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", - "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/508c652ba3ccf69f8c97f251534f229791b52a57", + "reference": "508c652ba3ccf69f8c97f251534f229791b52a57", "shasum": "" }, "require": { @@ -7160,7 +7162,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.28-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7173,10 +7175,7 @@ ], "psr-4": { "Symfony\\Polyfill\\Php83\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7201,7 +7200,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.27.0" }, "funding": [ { @@ -7217,7 +7216,7 @@ "type": "tidelift" } ], - "time": "2023-08-16T06:22:46+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/process", @@ -7283,16 +7282,16 @@ }, { "name": "symfony/service-contracts", - "version": "v3.3.0", + "version": "v3.2.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" + "reference": "a8c9cedf55f314f3a186041d19537303766df09a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", + "reference": "a8c9cedf55f314f3a186041d19537303766df09a", "shasum": "" }, "require": { @@ -7302,10 +7301,13 @@ "conflict": { "ext-psr": "<1.1|>=2" }, + "suggest": { + "symfony/service-implementation": "" + }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -7345,7 +7347,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" }, "funding": [ { @@ -7361,20 +7363,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2023-03-01T10:32:47+00:00" }, { "name": "symfony/string", - "version": "v6.3.2", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "53d1a83225002635bca3482fcbf963001313fb68" + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", - "reference": "53d1a83225002635bca3482fcbf963001313fb68", + "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", "shasum": "" }, "require": { @@ -7431,7 +7433,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.2" + "source": "https://github.com/symfony/string/tree/v6.3.0" }, "funding": [ { @@ -7447,38 +7449,42 @@ "type": "tidelift" } ], - "time": "2023-07-05T08:41:27+00:00" + "time": "2023-03-21T21:06:29+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.3.4", + "version": "v6.2.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45" + "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2027be14f8ae8eae999ceadebcda5b4909b81d45", - "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d37ab6787be2db993747b6218fcc96e8e3bb4bd0", + "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { + "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", "symfony/console": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", "symfony/process": "^5.4|^6.0", "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, "bin": [ "Resources/bin/var-dump-server" ], @@ -7515,7 +7521,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.4" + "source": "https://github.com/symfony/var-dumper/tree/v6.2.8" }, "funding": [ { @@ -7531,25 +7537,24 @@ "type": "tidelift" } ], - "time": "2023-08-24T14:51:05+00:00" + "time": "2023-03-29T21:42:15+00:00" }, { "name": "symfony/yaml", - "version": "v6.3.3", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add" + "reference": "e8e6a1d59e050525f27a1f530aa9703423cb7f57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add", - "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e8e6a1d59e050525f27a1f530aa9703423cb7f57", + "reference": "e8e6a1d59e050525f27a1f530aa9703423cb7f57", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -7558,6 +7563,9 @@ "require-dev": { "symfony/console": "^5.4|^6.0" }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, "bin": [ "Resources/bin/yaml-lint" ], @@ -7587,7 +7595,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.3.3" + "source": "https://github.com/symfony/yaml/tree/v6.2.7" }, "funding": [ { @@ -7603,7 +7611,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-02-16T09:57:23+00:00" }, { "name": "thecodingmachine/safe", @@ -8021,16 +8029,16 @@ }, { "name": "gitonomy/gitlib", - "version": "v1.3.8", + "version": "v1.3.7", "source": { "type": "git", "url": "https://github.com/gitonomy/gitlib.git", - "reference": "9fea656e75ad6e3452feb2cac46a6c1239cd7f74" + "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/9fea656e75ad6e3452feb2cac46a6c1239cd7f74", - "reference": "9fea656e75ad6e3452feb2cac46a6c1239cd7f74", + "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/00b57b79f02396aa4c7c163f76fe2bc48faebbb7", + "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7", "shasum": "" }, "require": { @@ -8084,7 +8092,7 @@ "description": "Library for accessing git", "support": { "issues": "https://github.com/gitonomy/gitlib/issues", - "source": "https://github.com/gitonomy/gitlib/tree/v1.3.8" + "source": "https://github.com/gitonomy/gitlib/tree/v1.3.7" }, "funding": [ { @@ -8092,20 +8100,20 @@ "type": "tidelift" } ], - "time": "2023-05-11T08:29:06+00:00" + "time": "2022-10-04T14:20:15+00:00" }, { "name": "pdepend/pdepend", - "version": "2.14.0", + "version": "2.13.0", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1" + "reference": "31be7cd4f305f3f7b52af99c1cb13fc938d1cfad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/1121d4b04af06e33e9659bac3a6741b91cab1de1", - "reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/31be7cd4f305f3f7b52af99c1cb13fc938d1cfad", + "reference": "31be7cd4f305f3f7b52af99c1cb13fc938d1cfad", "shasum": "" }, "require": { @@ -8139,15 +8147,9 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", - "keywords": [ - "PHP Depend", - "PHP_Depend", - "dev", - "pdepend" - ], "support": { "issues": "https://github.com/pdepend/pdepend/issues", - "source": "https://github.com/pdepend/pdepend/tree/2.14.0" + "source": "https://github.com/pdepend/pdepend/tree/2.13.0" }, "funding": [ { @@ -8155,20 +8157,20 @@ "type": "tidelift" } ], - "time": "2023-05-26T13:15:18+00:00" + "time": "2023-02-28T20:56:15+00:00" }, { "name": "php-coveralls/php-coveralls", - "version": "v2.6.0", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "9e88d7d38e9eab7c675da674481784321ea7a9bc" + "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9e88d7d38e9eab7c675da674481784321ea7a9bc", - "reference": "9e88d7d38e9eab7c675da674481784321ea7a9bc", + "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9d8243bbf0e053333692857c98fab7cfba0d60a9", + "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9", "shasum": "" }, "require": { @@ -8236,9 +8238,9 @@ ], "support": { "issues": "https://github.com/php-coveralls/php-coveralls/issues", - "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.6.0" + "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.5.3" }, - "time": "2023-07-16T08:39:10+00:00" + "time": "2022-09-12T20:47:09+00:00" }, { "name": "phpmd/phpmd", @@ -8444,35 +8446,37 @@ }, { "name": "symfony/config", - "version": "v6.3.2", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467" + "reference": "249271da6f545d6579e0663374f8249a80be2893" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", - "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", + "url": "https://api.github.com/repos/symfony/config/zipball/249271da6f545d6579e0663374f8249a80be2893", + "reference": "249271da6f545d6579e0663374f8249a80be2893", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/filesystem": "^5.4|^6.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<5.4", - "symfony/service-contracts": "<2.5" + "symfony/finder": "<5.4" }, "require-dev": { "symfony/event-dispatcher": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^2.5|^3", + "symfony/service-contracts": "^1.1|^2|^3", "symfony/yaml": "^5.4|^6.0" }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, "type": "library", "autoload": { "psr-4": { @@ -8499,7 +8503,7 @@ "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/v6.3.2" + "source": "https://github.com/symfony/config/tree/v6.2.7" }, "funding": [ { @@ -8515,34 +8519,34 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:22:16+00:00" + "time": "2023-02-14T08:44:56+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.3.4", + "version": "v6.2.8", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "68a5a9570806a087982f383f6109c5e925892a49" + "reference": "b6195feacceb88fc58a02b69522b569e4c6188ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/68a5a9570806a087982f383f6109c5e925892a49", - "reference": "68a5a9570806a087982f383f6109c5e925892a49", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b6195feacceb88fc58a02b69522b569e4c6188ac", + "reference": "b6195feacceb88fc58a02b69522b569e4c6188ac", "shasum": "" }, "require": { "php": ">=8.1", "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.2.10" + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/service-contracts": "^1.1.6|^2.0|^3.0", + "symfony/var-exporter": "^6.2.7" }, "conflict": { "ext-psr": "<1.1|>=2", "symfony/config": "<6.1", "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.3", + "symfony/proxy-manager-bridge": "<6.2", "symfony/yaml": "<5.4" }, "provide": { @@ -8554,6 +8558,12 @@ "symfony/expression-language": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0" }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/yaml": "" + }, "type": "library", "autoload": { "psr-4": { @@ -8580,7 +8590,7 @@ "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/v6.3.4" + "source": "https://github.com/symfony/dependency-injection/tree/v6.2.8" }, "funding": [ { @@ -8596,25 +8606,25 @@ "type": "tidelift" } ], - "time": "2023-08-16T17:55:17+00:00" + "time": "2023-03-30T13:35:57+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.3.0", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" + "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", + "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/service-contracts": "^2.5|^3" + "symfony/service-contracts": "^1|^2|^3" }, "type": "library", "autoload": { @@ -8642,7 +8652,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" + "source": "https://github.com/symfony/stopwatch/tree/v6.2.7" }, "funding": [ { @@ -8658,20 +8668,20 @@ "type": "tidelift" } ], - "time": "2023-02-16T10:14:28+00:00" + "time": "2023-02-14T08:44:56+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.3.4", + "version": "v6.2.8", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691" + "reference": "8302bb670204500d492c6b8c595ee9a27da62cd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/df1f8aac5751871b83d30bf3e2c355770f8f0691", - "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8302bb670204500d492c6b8c595ee9a27da62cd6", + "reference": "8302bb670204500d492c6b8c595ee9a27da62cd6", "shasum": "" }, "require": { @@ -8716,7 +8726,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.3.4" + "source": "https://github.com/symfony/var-exporter/tree/v6.2.8" }, "funding": [ { @@ -8732,7 +8742,7 @@ "type": "tidelift" } ], - "time": "2023-08-16T18:14:47+00:00" + "time": "2023-03-14T15:48:45+00:00" } ], "aliases": [], diff --git a/etc/config/.credentials.example b/etc/config/.credentials.example index 25400bd63..fe6dd19a9 100644 --- a/etc/config/.credentials.example +++ b/etc/config/.credentials.example @@ -1,4 +1,5 @@ magento/tfa/OTP_SHARED_SECRET +magento/MAGENTO_ADMIN_PASSWORD #magento/carriers_fedex_account= #magento/carriers_fedex_meter_number= From f02eac4532579336064fd91c1f8e955fa259329d Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Tue, 3 Oct 2023 16:54:27 +0530 Subject: [PATCH 521/674] [ACQE-5547] Reverting changes of ACQE-4318 in GenerateTestsCommand file and changing testgroupmembership generation call Add magento admin password to credentials example [ACQE-5547] Removing testgroupmembership call from SuiteGenerator --- etc/config/.credentials.example | 1 + .../Console/GenerateTestsCommand.php | 4 +++- .../FunctionalTestingFramework/Suite/SuiteGenerator.php | 1 - 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/etc/config/.credentials.example b/etc/config/.credentials.example index 25400bd63..fe6dd19a9 100644 --- a/etc/config/.credentials.example +++ b/etc/config/.credentials.example @@ -1,4 +1,5 @@ magento/tfa/OTP_SHARED_SECRET +magento/MAGENTO_ADMIN_PASSWORD #magento/carriers_fedex_account= #magento/carriers_fedex_meter_number= diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index 05e286c88..7976a2e60 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -231,9 +231,11 @@ protected function execute(InputInterface $input, OutputInterface $output) $testManifest->createTestGroups($configNumber); } + SuiteGenerator::getInstance()->generateAllSuites($testManifest); + $testManifest->generate(); - SuiteGenerator::getInstance()->generateAllSuites($testManifest); + SuiteGenerator::getInstance()->generateTestgroupmembership($testManifest); } catch (\Exception $e) { if (!empty(GenerationErrorHandler::getInstance()->getAllErrors())) { GenerationErrorHandler::getInstance()->printErrorSummary(); diff --git a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php index 0fda94e82..4c007ed95 100644 --- a/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Suite/SuiteGenerator.php @@ -95,7 +95,6 @@ public static function getInstance(): SuiteGenerator */ public function generateAllSuites($testManifest) { - $this->generateTestgroupmembership($testManifest); $suites = $testManifest->getSuiteConfig(); foreach ($suites as $suiteName => $suiteContent) { From b52f4716de57aa6c05a8400f07a9a62d93af0a99 Mon Sep 17 00:00:00 2001 From: Rajesh Kumar <glo71317@adobe.com> Date: Thu, 5 Oct 2023 15:32:39 +0530 Subject: [PATCH 522/674] AC-9499::Update Symfony dependency packages to the latest LTS versions 6.4 --- composer.json | 3 +- composer.lock | 1027 ++++++++++++++++++++++++++++--------------------- 2 files changed, 582 insertions(+), 448 deletions(-) diff --git a/composer.json b/composer.json index d5afcf875..c2a772790 100755 --- a/composer.json +++ b/composer.json @@ -43,7 +43,8 @@ "doctrine/annotations": "^2.0" }, "require-dev": { - "brainmaestro/composer-git-hooks": "^v3.0.0-alpha.1", + "brainmaestro/composer-git-hooks": "^2.8.5", + "codacy/coverage": "^1.4", "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", "phpunit/phpunit": "<=9.5.20", diff --git a/composer.lock b/composer.lock index e5832c300..d78661e5e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,35 +4,34 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e03c11234d51bb587d128640d9387b84", + "content-hash": "28d3378fc6c2fe8b8338159cb5bea501", "packages": [ { "name": "allure-framework/allure-codeception", - "version": "v2.1.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-codeception.git", - "reference": "1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8" + "reference": "d28f6ba7139406974b977e5611bc65b59c492a55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8", - "reference": "1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8", + "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/d28f6ba7139406974b977e5611bc65b59c492a55", + "reference": "d28f6ba7139406974b977e5611bc65b59c492a55", "shasum": "" }, "require": { - "allure-framework/allure-php-commons": "^2", - "codeception/codeception": "^5", + "allure-framework/allure-php-commons": "^2.3.1", + "codeception/codeception": "^5.0.3", "ext-json": "*", "php": "^8" }, "require-dev": { - "phpunit/phpunit": "^9", "psalm/plugin-phpunit": "^0.18.4", "remorhaz/php-json-data": "^0.5.3", "remorhaz/php-json-path": "^0.7.7", - "squizlabs/php_codesniffer": "^3.7.1", - "vimeo/psalm": "^5.2" + "squizlabs/php_codesniffer": "^3.7.2", + "vimeo/psalm": "^5.12" }, "type": "library", "autoload": { @@ -72,20 +71,20 @@ "issues": "https://github.com/allure-framework/allure-codeception/issues", "source": "https://github.com/allure-framework/allure-codeception" }, - "time": "2023-01-09T08:09:01+00:00" + "time": "2023-05-31T14:10:46+00:00" }, { "name": "allure-framework/allure-php-commons", - "version": "v2.2.0", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-php-commons2.git", - "reference": "c2b222c1f999c851e029290c09a3fe4933390bda" + "reference": "5d7ed5ab510339652163ca1473eb499d4b7ec488" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/c2b222c1f999c851e029290c09a3fe4933390bda", - "reference": "c2b222c1f999c851e029290c09a3fe4933390bda", + "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/5d7ed5ab510339652163ca1473eb499d4b7ec488", + "reference": "5d7ed5ab510339652163ca1473eb499d4b7ec488", "shasum": "" }, "require": { @@ -100,10 +99,10 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "^1", - "phpunit/phpunit": "^9.5.10", + "phpunit/phpunit": "^9.6.8", "psalm/plugin-phpunit": "^0.18.4", - "squizlabs/php_codesniffer": "^3.7.1", - "vimeo/psalm": "^5.4" + "squizlabs/php_codesniffer": "^3.7.2", + "vimeo/psalm": "^5.12" }, "type": "library", "autoload": { @@ -142,7 +141,7 @@ "issues": "https://github.com/allure-framework/allure-php-commons2/issues", "source": "https://github.com/allure-framework/allure-php-commons" }, - "time": "2023-01-12T14:28:21+00:00" + "time": "2023-05-30T10:55:43+00:00" }, { "name": "allure-framework/allure-phpunit", @@ -214,16 +213,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.1", + "version": "v1.2.2", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5" + "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/1926277fc71d253dfa820271ac5987bdb193ccf5", - "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/2f1dc7b7eda080498be96a4a6d683a41583030e9", + "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9", "shasum": "" }, "require": { @@ -262,22 +261,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.1" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.2" }, - "time": "2023-03-24T20:22:19+00:00" + "time": "2023-07-20T16:49:55+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.268.16", + "version": "3.283.0", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98" + "reference": "5084c03431ecda0003e35d7fc7a12eeca4242685" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98", - "reference": "b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5084c03431ecda0003e35d7fc7a12eeca4242685", + "reference": "5084c03431ecda0003e35d7fc7a12eeca4242685", "shasum": "" }, "require": { @@ -286,10 +285,11 @@ "ext-pcre": "*", "ext-simplexml": "*", "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0", + "guzzlehttp/promises": "^1.4.0 || ^2.0", "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "mtdowling/jmespath.php": "^2.6", - "php": ">=5.5" + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0" }, "require-dev": { "andrewsville/php-token-reflection": "^1.4", @@ -304,9 +304,8 @@ "ext-sockets": "*", "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", + "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", "psr/cache": "^1.0", - "psr/http-message": "^1.0", "psr/simple-cache": "^1.0", "sebastian/comparator": "^1.2.3 || ^4.0", "yoast/phpunit-polyfills": "^1.0" @@ -357,9 +356,9 @@ "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.268.16" + "source": "https://github.com/aws/aws-sdk-php/tree/3.283.0" }, - "time": "2023-04-21T21:37:05+00:00" + "time": "2023-10-04T18:08:32+00:00" }, { "name": "beberlei/assert", @@ -548,16 +547,16 @@ }, { "name": "codeception/codeception", - "version": "5.0.10", + "version": "5.0.11", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "ed4af7fd4103cdd035916fbb8f35124edd2d018b" + "reference": "1998a287a3d7f2771c9591aef1c528d9d44cc4b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/ed4af7fd4103cdd035916fbb8f35124edd2d018b", - "reference": "ed4af7fd4103cdd035916fbb8f35124edd2d018b", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/1998a287a3d7f2771c9591aef1c528d9d44cc4b4", + "reference": "1998a287a3d7f2771c9591aef1c528d9d44cc4b4", "shasum": "" }, "require": { @@ -652,7 +651,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/5.0.10" + "source": "https://github.com/Codeception/Codeception/tree/5.0.11" }, "funding": [ { @@ -660,7 +659,7 @@ "type": "open_collective" } ], - "time": "2023-03-14T07:21:10+00:00" + "time": "2023-08-22T06:42:39+00:00" }, { "name": "codeception/lib-asserts", @@ -936,16 +935,16 @@ }, { "name": "codeception/stub", - "version": "4.1.0", + "version": "4.1.1", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "58751aed08a68ae960a952fd3fe74ee9a56cdb1b" + "reference": "4aaeffdc7089f3cae173b73bd4bc3672e4618747" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/58751aed08a68ae960a952fd3fe74ee9a56cdb1b", - "reference": "58751aed08a68ae960a952fd3fe74ee9a56cdb1b", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/4aaeffdc7089f3cae173b73bd4bc3672e4618747", + "reference": "4aaeffdc7089f3cae173b73bd4bc3672e4618747", "shasum": "" }, "require": { @@ -971,22 +970,22 @@ "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", "support": { "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/4.1.0" + "source": "https://github.com/Codeception/Stub/tree/4.1.1" }, - "time": "2022-12-27T18:41:43+00:00" + "time": "2023-08-16T19:17:44+00:00" }, { "name": "composer/ca-bundle", - "version": "1.3.5", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd" + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", "shasum": "" }, "require": { @@ -1033,7 +1032,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.5" + "source": "https://github.com/composer/ca-bundle/tree/1.3.7" }, "funding": [ { @@ -1049,26 +1048,26 @@ "type": "tidelift" } ], - "time": "2023-01-11T08:27:00+00:00" + "time": "2023-08-30T09:31:38+00:00" }, { "name": "composer/class-map-generator", - "version": "1.0.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/953cc4ea32e0c31f2185549c7d216d7921f03da9", + "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9", "shasum": "" }, "require": { - "composer/pcre": "^2 || ^3", + "composer/pcre": "^2.1 || ^3.1", "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" }, "require-dev": { "phpstan/phpstan": "^1.6", @@ -1106,7 +1105,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + "source": "https://github.com/composer/class-map-generator/tree/1.1.0" }, "funding": [ { @@ -1122,20 +1121,20 @@ "type": "tidelift" } ], - "time": "2022-06-19T11:31:27+00:00" + "time": "2023-06-30T13:58:57+00:00" }, { "name": "composer/composer", - "version": "2.5.5", + "version": "2.6.4", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f" + "reference": "d75d17c16a863438027d1d96401cddcd6aa5bb60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/c7cffaad16a60636a776017eac5bd8cd0095c32f", - "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f", + "url": "https://api.github.com/repos/composer/composer/zipball/d75d17c16a863438027d1d96401cddcd6aa5bb60", + "reference": "d75d17c16a863438027d1d96401cddcd6aa5bb60", "shasum": "" }, "require": { @@ -1143,23 +1142,23 @@ "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", "composer/pcre": "^2.1 || ^3.1", - "composer/semver": "^3.0", + "composer/semver": "^3.2.5", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8", + "react/promise": "^2.8 || ^3", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", + "symfony/console": "^5.4.11 || ^6.0.11 || ^7", + "symfony/filesystem": "^5.4 || ^6.0 || ^7", + "symfony/finder": "^5.4 || ^6.0 || ^7", "symfony/polyfill-php73": "^1.24", "symfony/polyfill-php80": "^1.24", "symfony/polyfill-php81": "^1.24", - "symfony/process": "^5.4 || ^6.0" + "symfony/process": "^5.4 || ^6.0 || ^7" }, "require-dev": { "phpstan/phpstan": "^1.9.3", @@ -1167,7 +1166,7 @@ "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-strict-rules": "^1", "phpstan/phpstan-symfony": "^1.2.10", - "symfony/phpunit-bridge": "^6.0" + "symfony/phpunit-bridge": "^6.0 || ^7" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -1180,7 +1179,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.6-dev" }, "phpstan": { "includes": [ @@ -1190,7 +1189,7 @@ }, "autoload": { "psr-4": { - "Composer\\": "src/Composer" + "Composer\\": "src/Composer/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1219,7 +1218,8 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.5.5" + "security": "https://github.com/composer/composer/security/policy", + "source": "https://github.com/composer/composer/tree/2.6.4" }, "funding": [ { @@ -1235,7 +1235,7 @@ "type": "tidelift" } ], - "time": "2023-03-21T10:50:05+00:00" + "time": "2023-09-29T08:54:47+00:00" }, { "name": "composer/metadata-minifier", @@ -1379,16 +1379,16 @@ }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", "shasum": "" }, "require": { @@ -1438,9 +1438,9 @@ "versioning" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.4.0" }, "funding": [ { @@ -1456,7 +1456,7 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2023-08-31T09:50:34+00:00" }, { "name": "composer/spdx-licenses", @@ -1744,25 +1744,29 @@ }, { "name": "doctrine/deprecations", - "version": "v1.0.0", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5|^8.5|^9.5", - "psr/log": "^1|^2|^3" + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -1781,9 +1785,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + "source": "https://github.com/doctrine/deprecations/tree/1.1.2" }, - "time": "2022-05-02T15:47:09+00:00" + "time": "2023-09-27T20:04:15+00:00" }, { "name": "doctrine/instantiator", @@ -1857,28 +1861,27 @@ }, { "name": "doctrine/lexer", - "version": "2.1.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" + "reference": "84a527db05647743d50373e0ec53a152f2cde568" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.0" + "vimeo/psalm": "^5.0" }, "type": "library", "autoload": { @@ -1915,7 +1918,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.0" + "source": "https://github.com/doctrine/lexer/tree/3.0.0" }, "funding": [ { @@ -1931,26 +1934,26 @@ "type": "tidelift" } ], - "time": "2022-12-14T08:49:07+00:00" + "time": "2022-12-15T16:57:16+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.5.1", + "version": "7.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9" + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b964ca597e86b752cd994f27293e9fa6b6a95ed9", - "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -1961,7 +1964,8 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.29 || ^9.5.23", "psr/log": "^1.1 || ^2.0 || ^3.0" }, @@ -1975,9 +1979,6 @@ "bamarni-bin": { "bin-links": true, "forward-command": false - }, - "branch-alias": { - "dev-master": "7.5-dev" } }, "autoload": { @@ -2043,7 +2044,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.5.1" + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" }, "funding": [ { @@ -2059,38 +2060,37 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:30:08+00:00" + "time": "2023-08-27T10:20:53+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.2", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "b94b2807d85443f9719887892882d0329d1e2598" + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", - "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -2127,7 +2127,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.2" + "source": "https://github.com/guzzle/promises/tree/2.0.1" }, "funding": [ { @@ -2143,20 +2143,20 @@ "type": "tidelift" } ], - "time": "2022-08-28T14:55:35+00:00" + "time": "2023-08-03T15:11:55+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.5.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "shasum": "" }, "require": { @@ -2243,7 +2243,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.5.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.1" }, "funding": [ { @@ -2259,20 +2259,20 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:11:26+00:00" + "time": "2023-08-27T10:13:57+00:00" }, { "name": "justinrainbow/json-schema", - "version": "5.2.12", + "version": "v5.2.13", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", "shasum": "" }, "require": { @@ -2327,9 +2327,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "source": "https://github.com/justinrainbow/json-schema/tree/v5.2.13" }, - "time": "2022-04-13T08:02:27+00:00" + "time": "2023-09-26T02:20:38+00:00" }, { "name": "laminas/laminas-diactoros", @@ -2532,25 +2532,25 @@ }, { "name": "mtdowling/jmespath.php", - "version": "2.6.1", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb" + "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb", - "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b", + "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b", "shasum": "" }, "require": { - "php": "^5.4 || ^7.0 || ^8.0", + "php": "^7.2.5 || ^8.0", "symfony/polyfill-mbstring": "^1.17" }, "require-dev": { - "composer/xdebug-handler": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^7.5.15" + "composer/xdebug-handler": "^3.0.3", + "phpunit/phpunit": "^8.5.33" }, "bin": [ "bin/jp.php" @@ -2558,7 +2558,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { @@ -2574,6 +2574,11 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", @@ -2587,9 +2592,9 @@ ], "support": { "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1" + "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0" }, - "time": "2021-06-14T00:11:39+00:00" + "time": "2023-08-25T10:54:48+00:00" }, { "name": "mustache/mustache", @@ -2702,16 +2707,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.4", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -2752,9 +2757,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2023-03-05T19:49:14+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -2936,16 +2941,16 @@ }, { "name": "php-webdriver/webdriver", - "version": "1.14.0", + "version": "1.15.0", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "3ea4f924afb43056bf9c630509e657d951608563" + "reference": "a1578689290055586f1ee51eaf0ec9d52895bb6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/3ea4f924afb43056bf9c630509e657d951608563", - "reference": "3ea4f924afb43056bf9c630509e657d951608563", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/a1578689290055586f1ee51eaf0ec9d52895bb6d", + "reference": "a1578689290055586f1ee51eaf0ec9d52895bb6d", "shasum": "" }, "require": { @@ -2996,9 +3001,9 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.14.0" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.0" }, - "time": "2023-02-09T12:12:19+00:00" + "time": "2023-08-29T13:52:26+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -3112,16 +3117,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.7.1", + "version": "1.7.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "dfc078e8af9c99210337325ff5aa152872c98714" + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/dfc078e8af9c99210337325ff5aa152872c98714", - "reference": "dfc078e8af9c99210337325ff5aa152872c98714", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", "shasum": "" }, "require": { @@ -3164,9 +3169,9 @@ "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.7.1" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.3" }, - "time": "2023-03-27T19:02:04+00:00" + "time": "2023-08-12T11:01:26+00:00" }, { "name": "phpspec/prophecy", @@ -3238,22 +3243,24 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.20.1", + "version": "1.24.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "57f6787f0bb6431905a18aa7caea25dcd2bd59e0" + "reference": "bcad8d995980440892759db0c32acae7c8e79442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/57f6787f0bb6431905a18aa7caea25dcd2bd59e0", - "reference": "57f6787f0bb6431905a18aa7caea25dcd2bd59e0", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bcad8d995980440892759db0c32acae7c8e79442", + "reference": "bcad8d995980440892759db0c32acae7c8e79442", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.5", @@ -3277,22 +3284,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.20.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.2" }, - "time": "2023-04-22T09:05:52+00:00" + "time": "2023-09-26T12:28:12+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.26", + "version": "9.2.29", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", "shasum": "" }, "require": { @@ -3348,7 +3355,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" }, "funding": [ { @@ -3356,7 +3364,7 @@ "type": "github" } ], - "time": "2023-03-06T12:58:08+00:00" + "time": "2023-09-19T04:57:46+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3856,16 +3864,16 @@ }, { "name": "psr/http-client", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { @@ -3902,9 +3910,9 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/1.0.2" + "source": "https://github.com/php-fig/http-client" }, - "time": "2023-04-10T20:12:12+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", @@ -4066,16 +4074,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.15", + "version": "v0.11.21", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "5350ce0ec8ecf2c5b5cf554cd2496f97b444af85" + "reference": "bcb22101107f3bf770523b65630c9d547f60c540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/5350ce0ec8ecf2c5b5cf554cd2496f97b444af85", - "reference": "5350ce0ec8ecf2c5b5cf554cd2496f97b444af85", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/bcb22101107f3bf770523b65630c9d547f60c540", + "reference": "bcb22101107f3bf770523b65630c9d547f60c540", "shasum": "" }, "require": { @@ -4105,6 +4113,10 @@ "extra": { "branch-alias": { "dev-main": "0.11.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false } }, "autoload": { @@ -4136,9 +4148,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.15" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.21" }, - "time": "2023-04-07T21:57:09+00:00" + "time": "2023-09-17T21:15:54+00:00" }, { "name": "ralouphie/getallheaders", @@ -4367,23 +4379,24 @@ }, { "name": "react/promise", - "version": "v2.9.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "reference": "c86753c76fd3be465d93b308f18d189f01a22be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/c86753c76fd3be465d93b308f18d189f01a22be4", + "reference": "c86753c76fd3be465d93b308f18d189f01a22be4", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpstan/phpstan": "1.10.20 || 1.4.10", + "phpunit/phpunit": "^9.5 || ^7.5" }, "type": "library", "autoload": { @@ -4427,19 +4440,15 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" + "source": "https://github.com/reactphp/promise/tree/v3.0.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-02-11T10:27:51+00:00" + "time": "2023-07-11T16:12:49+00:00" }, { "name": "sebastian/cli-parser", @@ -4741,16 +4750,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -4795,7 +4804,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -4803,7 +4812,7 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", @@ -4947,16 +4956,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -4999,7 +5008,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { @@ -5007,7 +5016,7 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-08-02T09:26:13+00:00" }, { "name": "sebastian/lines-of-code", @@ -5407,16 +5416,16 @@ }, { "name": "seld/jsonlint", - "version": "1.9.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", "shasum": "" }, "require": { @@ -5455,7 +5464,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.10.0" }, "funding": [ { @@ -5467,7 +5476,7 @@ "type": "tidelift" } ], - "time": "2022-04-01T13:37:23+00:00" + "time": "2023-05-11T13:16:46+00:00" }, { "name": "seld/phar-utils", @@ -5519,16 +5528,16 @@ }, { "name": "seld/signal-handler", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", "shasum": "" }, "require": { @@ -5574,9 +5583,9 @@ ], "support": { "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" }, - "time": "2022-07-20T18:31:45+00:00" + "time": "2023-09-03T09:24:00+00:00" }, { "name": "spomky-labs/otphp", @@ -5655,43 +5664,52 @@ }, { "name": "symfony/console", - "version": "v6.3.4", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" + "reference": "f4f71842f24c2023b91237c72a365306f3c58827" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", - "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", + "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", + "reference": "f4f71842f24c2023b91237c72a365306f3c58827", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0" + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" }, "provide": { - "psr/log-implementation": "1.0|2.0|3.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/lock": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" }, "type": "library", "autoload": { @@ -5725,7 +5743,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.3.4" + "source": "https://github.com/symfony/console/tree/v5.4.28" }, "funding": [ { @@ -5741,20 +5759,20 @@ "type": "tidelift" } ], - "time": "2023-08-16T10:10:12+00:00" + "time": "2023-08-07T06:12:30+00:00" }, { "name": "symfony/css-selector", - "version": "v6.2.7", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0" + "reference": "883d961421ab1709877c10ac99451632a3d6fa57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/aedf3cb0f5b929ec255d96bbb4909e9932c769e0", - "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", + "reference": "883d961421ab1709877c10ac99451632a3d6fa57", "shasum": "" }, "require": { @@ -5790,7 +5808,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.2.7" + "source": "https://github.com/symfony/css-selector/tree/v6.3.2" }, "funding": [ { @@ -5806,7 +5824,7 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-07-12T16:00:22+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5951,24 +5969,25 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.2.8", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339" + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/04046f35fd7d72f9646e721fc2ecb8f9c67d3339", - "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2|^3" + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -5981,13 +6000,9 @@ "symfony/error-handler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/stopwatch": "^5.4|^6.0" }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, "type": "library", "autoload": { "psr-4": { @@ -6014,7 +6029,7 @@ "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/v6.2.8" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" }, "funding": [ { @@ -6030,33 +6045,30 @@ "type": "tidelift" } ], - "time": "2023-03-20T16:06:02+00:00" + "time": "2023-07-06T06:56:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd" + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", - "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", "shasum": "" }, "require": { "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6093,7 +6105,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" }, "funding": [ { @@ -6109,20 +6121,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/filesystem", - "version": "v6.2.7", + "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "82b6c62b959f642d000456f08c6d219d749215b3" + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/82b6c62b959f642d000456f08c6d219d749215b3", - "reference": "82b6c62b959f642d000456f08c6d219d749215b3", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "shasum": "" }, "require": { @@ -6156,7 +6168,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.2.7" + "source": "https://github.com/symfony/filesystem/tree/v6.3.1" }, "funding": [ { @@ -6172,20 +6184,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-06-01T08:30:39+00:00" }, { "name": "symfony/finder", - "version": "v6.3.0", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2" + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d9b01ba073c44cef617c7907ce2419f8d00d75e2", - "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2", + "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", "shasum": "" }, "require": { @@ -6220,7 +6232,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.0" + "source": "https://github.com/symfony/finder/tree/v6.3.5" }, "funding": [ { @@ -6236,20 +6248,20 @@ "type": "tidelift" } ], - "time": "2023-04-02T01:25:41+00:00" + "time": "2023-09-26T12:56:25+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.3.0", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "718a97ed430d34e5c568ea2c44eab708c6efbefb" + "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/718a97ed430d34e5c568ea2c44eab708c6efbefb", - "reference": "718a97ed430d34e5c568ea2c44eab708c6efbefb", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b50f5e281d722cb0f4c296f908bacc3e2b721957", + "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957", "shasum": "" }, "require": { @@ -6297,7 +6309,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.0" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.5" }, "funding": [ { @@ -6313,24 +6325,25 @@ "type": "tidelift" } ], - "time": "2023-05-19T12:46:45+00:00" + "time": "2023-09-04T21:33:54+00:00" }, { "name": "symfony/mime", - "version": "v6.3.0", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad" + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", - "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", + "url": "https://api.github.com/repos/symfony/mime/zipball/d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -6339,7 +6352,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2" + "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -6348,7 +6361,7 @@ "symfony/dependency-injection": "^5.4|^6.0", "symfony/property-access": "^5.4|^6.0", "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "^6.2" + "symfony/serializer": "~6.2.13|^6.3.2" }, "type": "library", "autoload": { @@ -6380,7 +6393,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.3.0" + "source": "https://github.com/symfony/mime/tree/v6.3.5" }, "funding": [ { @@ -6396,7 +6409,7 @@ "type": "tidelift" } ], - "time": "2023-04-28T15:57:00+00:00" + "time": "2023-09-29T06:59:36+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6563,16 +6576,16 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", "shasum": "" }, "require": { @@ -6586,7 +6599,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6630,7 +6643,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" }, "funding": [ { @@ -6646,7 +6659,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:30:37+00:00" }, { "name": "symfony/polyfill-intl-normalizer", @@ -6817,16 +6830,16 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", "shasum": "" }, "require": { @@ -6835,7 +6848,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6873,7 +6886,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" }, "funding": [ { @@ -6889,20 +6902,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", "shasum": "" }, "require": { @@ -6911,7 +6924,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6952,7 +6965,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" }, "funding": [ { @@ -6968,7 +6981,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php80", @@ -7055,16 +7068,16 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", "shasum": "" }, "require": { @@ -7073,7 +7086,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7114,7 +7127,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" }, "funding": [ { @@ -7130,20 +7143,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "508c652ba3ccf69f8c97f251534f229791b52a57" + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/508c652ba3ccf69f8c97f251534f229791b52a57", - "reference": "508c652ba3ccf69f8c97f251534f229791b52a57", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", "shasum": "" }, "require": { @@ -7153,7 +7166,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7166,7 +7179,10 @@ ], "psr-4": { "Symfony\\Polyfill\\Php83\\": "" - } + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7191,7 +7207,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" }, "funding": [ { @@ -7207,7 +7223,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-08-16T06:22:46+00:00" }, { "name": "symfony/process", @@ -7354,16 +7370,16 @@ }, { "name": "symfony/string", - "version": "v6.3.2", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "53d1a83225002635bca3482fcbf963001313fb68" + "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", - "reference": "53d1a83225002635bca3482fcbf963001313fb68", + "url": "https://api.github.com/repos/symfony/string/zipball/13d76d0fb049051ed12a04bef4f9de8715bea339", + "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339", "shasum": "" }, "require": { @@ -7420,7 +7436,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.2" + "source": "https://github.com/symfony/string/tree/v6.3.5" }, "funding": [ { @@ -7436,42 +7452,38 @@ "type": "tidelift" } ], - "time": "2023-07-05T08:41:27+00:00" + "time": "2023-09-18T10:38:32+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.2.8", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0" + "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d37ab6787be2db993747b6218fcc96e8e3bb4bd0", - "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3d9999376be5fea8de47752837a3e1d1c5f69ef5", + "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", "symfony/process": "^5.4|^6.0", "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, "bin": [ "Resources/bin/var-dump-server" ], @@ -7508,7 +7520,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.2.8" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.5" }, "funding": [ { @@ -7524,24 +7536,25 @@ "type": "tidelift" } ], - "time": "2023-03-29T21:42:15+00:00" + "time": "2023-09-12T10:11:35+00:00" }, { "name": "symfony/yaml", - "version": "v6.2.7", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e8e6a1d59e050525f27a1f530aa9703423cb7f57" + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e8e6a1d59e050525f27a1f530aa9703423cb7f57", - "reference": "e8e6a1d59e050525f27a1f530aa9703423cb7f57", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add", + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -7550,9 +7563,6 @@ "require-dev": { "symfony/console": "^5.4|^6.0" }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, "bin": [ "Resources/bin/yaml-lint" ], @@ -7582,7 +7592,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.2.7" + "source": "https://github.com/symfony/yaml/tree/v6.3.3" }, "funding": [ { @@ -7598,7 +7608,7 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:57:23+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "thecodingmachine/safe", @@ -7892,26 +7902,26 @@ "packages-dev": [ { "name": "brainmaestro/composer-git-hooks", - "version": "v3.0.0-alpha.1", + "version": "v2.8.5", "source": { "type": "git", "url": "https://github.com/BrainMaestro/composer-git-hooks.git", - "reference": "d230a0060a330b8f4d8bd99f602aad4d3ad763ee" + "reference": "ffed8803690ac12214082120eee3441b00aa390e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/BrainMaestro/composer-git-hooks/zipball/d230a0060a330b8f4d8bd99f602aad4d3ad763ee", - "reference": "d230a0060a330b8f4d8bd99f602aad4d3ad763ee", + "url": "https://api.github.com/repos/BrainMaestro/composer-git-hooks/zipball/ffed8803690ac12214082120eee3441b00aa390e", + "reference": "ffed8803690ac12214082120eee3441b00aa390e", "shasum": "" }, "require": { - "php": "^8.0", - "symfony/console": "^6.0" + "php": "^5.6 || >=7.0", + "symfony/console": "^3.2 || ^4.0 || ^5.0" }, "require-dev": { "ext-json": "*", - "friendsofphp/php-cs-fixer": "^3.0", - "phpunit/phpunit": "^9.5" + "friendsofphp/php-cs-fixer": "^2.9", + "phpunit/phpunit": "^5.7 || ^7.0" }, "bin": [ "cghooks" @@ -7923,7 +7933,7 @@ "pre-push": [ "composer test", "appver=$(grep -o -E '\\d.\\d.\\d' cghooks)", - "tag=$(git tag | tail -n 1)", + "tag=$(git describe --tags --abbrev=0)", "if [ \"$tag\" != \"v$appver\" ]; then", "echo \"The most recent tag $tag does not match the application version $appver\\n\"", "tag=${tag#v}", @@ -7959,22 +7969,148 @@ ], "support": { "issues": "https://github.com/BrainMaestro/composer-git-hooks/issues", - "source": "https://github.com/BrainMaestro/composer-git-hooks/tree/v3.0.0-alpha.1" + "source": "https://github.com/BrainMaestro/composer-git-hooks/tree/v2.8.5" + }, + "time": "2021-02-08T15:59:11+00:00" + }, + { + "name": "codacy/coverage", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/codacy/php-codacy-coverage.git", + "reference": "1852ca987c91ef466ebcfdbdd4e1788b653eaf1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/codacy/php-codacy-coverage/zipball/1852ca987c91ef466ebcfdbdd4e1788b653eaf1d", + "reference": "1852ca987c91ef466ebcfdbdd4e1788b653eaf1d", + "shasum": "" + }, + "require": { + "gitonomy/gitlib": ">=1.0", + "php": ">=5.3.3", + "symfony/console": "~2.5|~3.0|~4.0|~5.0" + }, + "require-dev": { + "clue/phar-composer": "^1.1", + "phpunit/phpunit": "~6.5" + }, + "bin": [ + "bin/codacycoverage" + ], + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jakob Pupke", + "email": "jakob.pupke@gmail.com" + } + ], + "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" + }, + { + "name": "gitonomy/gitlib", + "version": "v1.3.8", + "source": { + "type": "git", + "url": "https://github.com/gitonomy/gitlib.git", + "reference": "9fea656e75ad6e3452feb2cac46a6c1239cd7f74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/9fea656e75ad6e3452feb2cac46a6c1239cd7f74", + "reference": "9fea656e75ad6e3452feb2cac46a6c1239cd7f74", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "php": "^5.6 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.7", + "symfony/process": "^3.4 || ^4.4 || ^5.0 || ^6.0" + }, + "require-dev": { + "ext-fileinfo": "*", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.20 || ^9.5.9", + "psr/log": "^1.0" + }, + "suggest": { + "ext-fileinfo": "Required to determine the mimetype of a blob", + "psr/log": "Required to use loggers for reporting of execution" + }, + "type": "library", + "autoload": { + "psr-4": { + "Gitonomy\\Git\\": "src/Gitonomy/Git/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Julien Didier", + "email": "genzo.wm@gmail.com", + "homepage": "https://github.com/juliendidier" + }, + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info", + "homepage": "https://github.com/lyrixx" + }, + { + "name": "Alexandre Salomé", + "email": "alexandre.salome@gmail.com", + "homepage": "https://github.com/alexandresalome" + } + ], + "description": "Library for accessing git", + "support": { + "issues": "https://github.com/gitonomy/gitlib/issues", + "source": "https://github.com/gitonomy/gitlib/tree/v1.3.8" }, - "time": "2022-07-20T15:47:30+00:00" + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/gitonomy/gitlib", + "type": "tidelift" + } + ], + "time": "2023-05-11T08:29:06+00:00" }, { "name": "pdepend/pdepend", - "version": "2.13.0", + "version": "2.15.1", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "31be7cd4f305f3f7b52af99c1cb13fc938d1cfad" + "reference": "d12f25bcdfb7754bea458a4a5cb159d55e9950d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/31be7cd4f305f3f7b52af99c1cb13fc938d1cfad", - "reference": "31be7cd4f305f3f7b52af99c1cb13fc938d1cfad", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/d12f25bcdfb7754bea458a4a5cb159d55e9950d0", + "reference": "d12f25bcdfb7754bea458a4a5cb159d55e9950d0", "shasum": "" }, "require": { @@ -8008,9 +8144,15 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", + "keywords": [ + "PHP Depend", + "PHP_Depend", + "dev", + "pdepend" + ], "support": { "issues": "https://github.com/pdepend/pdepend/issues", - "source": "https://github.com/pdepend/pdepend/tree/2.13.0" + "source": "https://github.com/pdepend/pdepend/tree/2.15.1" }, "funding": [ { @@ -8018,20 +8160,20 @@ "type": "tidelift" } ], - "time": "2023-02-28T20:56:15+00:00" + "time": "2023-09-28T12:00:56+00:00" }, { "name": "php-coveralls/php-coveralls", - "version": "v2.5.3", + "version": "v2.6.0", "source": { "type": "git", "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9" + "reference": "9e88d7d38e9eab7c675da674481784321ea7a9bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9d8243bbf0e053333692857c98fab7cfba0d60a9", - "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9", + "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9e88d7d38e9eab7c675da674481784321ea7a9bc", + "reference": "9e88d7d38e9eab7c675da674481784321ea7a9bc", "shasum": "" }, "require": { @@ -8099,28 +8241,28 @@ ], "support": { "issues": "https://github.com/php-coveralls/php-coveralls/issues", - "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.5.3" + "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.6.0" }, - "time": "2022-09-12T20:47:09+00:00" + "time": "2023-07-16T08:39:10+00:00" }, { "name": "phpmd/phpmd", - "version": "2.13.0", + "version": "2.14.1", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "dad0228156856b3ad959992f9748514fa943f3e3" + "reference": "442fc2c34edcd5198b442d8647c7f0aec3afabe8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/dad0228156856b3ad959992f9748514fa943f3e3", - "reference": "dad0228156856b3ad959992f9748514fa943f3e3", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/442fc2c34edcd5198b442d8647c7f0aec3afabe8", + "reference": "442fc2c34edcd5198b442d8647c7f0aec3afabe8", "shasum": "" }, "require": { "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", "ext-xml": "*", - "pdepend/pdepend": "^2.12.1", + "pdepend/pdepend": "^2.15.1", "php": ">=5.3.9" }, "require-dev": { @@ -8130,7 +8272,7 @@ "gregwar/rst": "^1.0", "mikey179/vfsstream": "^1.6.8", "phpunit/phpunit": "^4.8.36 || ^5.7.27", - "squizlabs/php_codesniffer": "^2.0" + "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2" }, "bin": [ "src/bin/phpmd" @@ -8167,6 +8309,7 @@ "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", "homepage": "https://phpmd.org/", "keywords": [ + "dev", "mess detection", "mess detector", "pdepend", @@ -8176,7 +8319,7 @@ "support": { "irc": "irc://irc.freenode.org/phpmd", "issues": "https://github.com/phpmd/phpmd/issues", - "source": "https://github.com/phpmd/phpmd/tree/2.13.0" + "source": "https://github.com/phpmd/phpmd/tree/2.14.1" }, "funding": [ { @@ -8184,7 +8327,7 @@ "type": "tidelift" } ], - "time": "2022-09-10T08:44:15+00:00" + "time": "2023-09-28T13:07:44+00:00" }, { "name": "sebastian/phpcpd", @@ -8307,37 +8450,35 @@ }, { "name": "symfony/config", - "version": "v6.2.7", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "249271da6f545d6579e0663374f8249a80be2893" + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/249271da6f545d6579e0663374f8249a80be2893", - "reference": "249271da6f545d6579e0663374f8249a80be2893", + "url": "https://api.github.com/repos/symfony/config/zipball/b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/filesystem": "^5.4|^6.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<5.4" + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" }, "require-dev": { "symfony/event-dispatcher": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, "type": "library", "autoload": { "psr-4": { @@ -8364,7 +8505,7 @@ "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/v6.2.7" + "source": "https://github.com/symfony/config/tree/v6.3.2" }, "funding": [ { @@ -8380,34 +8521,34 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-07-19T20:22:16+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.2.8", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "b6195feacceb88fc58a02b69522b569e4c6188ac" + "reference": "2ed62b3bf98346e1f45529a7b6be2196739bb993" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b6195feacceb88fc58a02b69522b569e4c6188ac", - "reference": "b6195feacceb88fc58a02b69522b569e4c6188ac", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2ed62b3bf98346e1f45529a7b6be2196739bb993", + "reference": "2ed62b3bf98346e1f45529a7b6be2196739bb993", "shasum": "" }, "require": { "php": ">=8.1", "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/service-contracts": "^1.1.6|^2.0|^3.0", - "symfony/var-exporter": "^6.2.7" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.2.10" }, "conflict": { "ext-psr": "<1.1|>=2", "symfony/config": "<6.1", "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.2", + "symfony/proxy-manager-bridge": "<6.3", "symfony/yaml": "<5.4" }, "provide": { @@ -8419,12 +8560,6 @@ "symfony/expression-language": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/yaml": "" - }, "type": "library", "autoload": { "psr-4": { @@ -8451,7 +8586,7 @@ "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/v6.2.8" + "source": "https://github.com/symfony/dependency-injection/tree/v6.3.5" }, "funding": [ { @@ -8467,25 +8602,25 @@ "type": "tidelift" } ], - "time": "2023-03-30T13:35:57+00:00" + "time": "2023-09-25T16:46:40+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.2.7", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f" + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", - "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/service-contracts": "^1|^2|^3" + "symfony/service-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -8513,7 +8648,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.2.7" + "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" }, "funding": [ { @@ -8529,20 +8664,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-02-16T10:14:28+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.2.8", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "8302bb670204500d492c6b8c595ee9a27da62cd6" + "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8302bb670204500d492c6b8c595ee9a27da62cd6", - "reference": "8302bb670204500d492c6b8c595ee9a27da62cd6", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/df1f8aac5751871b83d30bf3e2c355770f8f0691", + "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691", "shasum": "" }, "require": { @@ -8587,7 +8722,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.2.8" + "source": "https://github.com/symfony/var-exporter/tree/v6.3.4" }, "funding": [ { @@ -8603,14 +8738,12 @@ "type": "tidelift" } ], - "time": "2023-03-14T15:48:45+00:00" + "time": "2023-08-16T18:14:47+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "brainmaestro/composer-git-hooks": 15 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { From aa10903bd86100818109eeb6e953db70149c048c Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Mon, 16 Oct 2023 14:11:02 -0500 Subject: [PATCH 523/674] ACQE-5682: Add metadata to ACQE Repos --- .github/.metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/.metadata.json b/.github/.metadata.json index f07606072..f8db2d701 100644 --- a/.github/.metadata.json +++ b/.github/.metadata.json @@ -1,5 +1,5 @@ { - "templateVersion": "0.1", + "templateVersion": "0.2", "product": { "name": "Magento2 Functional Testing Framework (MFTF)", "description": "MFTF is a framework to write and execute UI Functional tests for Magento 2 projects" @@ -21,6 +21,7 @@ "component": "Test Infrastructure" } }, + "productionCodeBranches": ["master"], "staticScan": { "enable": true, "frequency": "monthly", From 5a1cb9d99d6f417f69fef3cd4b52fc79679b65ad Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Thu, 19 Oct 2023 15:00:04 -0500 Subject: [PATCH 524/674] ACQE-5682: Add metadata to ACQE Repos --- .github/.metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/.metadata.json b/.github/.metadata.json index f8db2d701..f1f6926ab 100644 --- a/.github/.metadata.json +++ b/.github/.metadata.json @@ -6,14 +6,14 @@ }, "contacts": { "team": { - "name": "Magento Quality Engineering / Pangolin", + "name": "Adobe Commerce Quality Engineering / Pangolin", "DL": "GRP-Pangolin", "slackChannel": "mftf" } }, "ticketTracker": { "functionalJiraQueue": { - "projectKey": "MQE", + "projectKey": "ACQE", "component": "Framework - MFTF" }, "securityJiraQueue": { From 713e0b64194b137af3da5297c1ebb270d758d2ee Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Mon, 30 Oct 2023 16:17:07 +0530 Subject: [PATCH 525/674] ACQE-5710 : Upgrading php 8.3 --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 7fd729ef7..2392ccd66 100755 --- a/composer.json +++ b/composer.json @@ -26,7 +26,7 @@ "composer/composer": "^1.9 || ^2.0, !=2.2.16", "csharpru/vault-php": "^4.2.1", "guzzlehttp/guzzle": "^7.3.0", - "laminas/laminas-diactoros": "^2.8", + "laminas/laminas-diactoros": "^3.0", "monolog/monolog": "^2.3", "mustache/mustache": "~2.5", "nikic/php-parser": "^4.4", @@ -47,7 +47,7 @@ "codacy/coverage": "^1.4", "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", - "phpunit/phpunit": "<=9.5.20", + "phpunit/phpunit": "^9.5", "sebastian/phpcpd": "~6.0.0", "squizlabs/php_codesniffer": "~3.7.0" }, From b69bf76ce9193817f43658e4663d0ee60ec37d5c Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Mon, 30 Oct 2023 16:18:15 +0530 Subject: [PATCH 526/674] ACQE-5710 : Upgrading php 8.3 --- .github/workflows/main.yml | 6 +- composer.lock | 841 +++++++++++-------------------------- 2 files changed, 245 insertions(+), 602 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0225f58bc..3d806803d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,7 +54,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.1', '8.2'] + php-versions: ['8.1', '8.2', '8.3'] steps: - uses: actions/checkout@v2 @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.1', '8.2'] + php-versions: ['8.1', '8.2', '8.3'] steps: - uses: actions/checkout@v2 @@ -118,7 +118,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.1', '8.2'] + php-versions: ['8.1', '8.2', '8.3'] services: chrome: diff --git a/composer.lock b/composer.lock index 20b3bd5e6..b4395ecf9 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": "ed9a0f6b303c7381d59f64ba18a27446", + "content-hash": "9179fdb38023b95ab01ad2482db205a1", "packages": [ { "name": "allure-framework/allure-codeception", @@ -548,16 +548,16 @@ }, { "name": "codeception/codeception", - "version": "5.0.10", + "version": "5.0.12", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "ed4af7fd4103cdd035916fbb8f35124edd2d018b" + "reference": "7f528f5fd8cdcd05cd0a85eb1e24d05df989e0c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/ed4af7fd4103cdd035916fbb8f35124edd2d018b", - "reference": "ed4af7fd4103cdd035916fbb8f35124edd2d018b", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/7f528f5fd8cdcd05cd0a85eb1e24d05df989e0c4", + "reference": "7f528f5fd8cdcd05cd0a85eb1e24d05df989e0c4", "shasum": "" }, "require": { @@ -652,7 +652,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/5.0.10" + "source": "https://github.com/Codeception/Codeception/tree/5.0.12" }, "funding": [ { @@ -660,7 +660,7 @@ "type": "open_collective" } ], - "time": "2023-03-14T07:21:10+00:00" + "time": "2023-10-15T18:04:50+00:00" }, { "name": "codeception/lib-asserts", @@ -936,16 +936,16 @@ }, { "name": "codeception/stub", - "version": "4.1.0", + "version": "4.1.2", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "58751aed08a68ae960a952fd3fe74ee9a56cdb1b" + "reference": "f6bc56e33e3f5ba7a831dfb968c49b27cf1676ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/58751aed08a68ae960a952fd3fe74ee9a56cdb1b", - "reference": "58751aed08a68ae960a952fd3fe74ee9a56cdb1b", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/f6bc56e33e3f5ba7a831dfb968c49b27cf1676ad", + "reference": "f6bc56e33e3f5ba7a831dfb968c49b27cf1676ad", "shasum": "" }, "require": { @@ -971,9 +971,9 @@ "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", "support": { "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/4.1.0" + "source": "https://github.com/Codeception/Stub/tree/4.1.2" }, - "time": "2022-12-27T18:41:43+00:00" + "time": "2023-10-07T19:22:36+00:00" }, { "name": "composer/ca-bundle", @@ -1744,25 +1744,29 @@ }, { "name": "doctrine/deprecations", - "version": "v1.0.0", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5|^8.5|^9.5", - "psr/log": "^1|^2|^3" + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -1781,36 +1785,36 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + "source": "https://github.com/doctrine/deprecations/tree/1.1.2" }, - "time": "2022-05-02T15:47:09+00:00" + "time": "2023-09-27T20:04:15+00:00" }, { "name": "doctrine/instantiator", - "version": "1.5.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^11", + "doctrine/coding-standard": "^11", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.30 || ^5.4" + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" }, "type": "library", "autoload": { @@ -1837,7 +1841,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" }, "funding": [ { @@ -1853,7 +1857,7 @@ "type": "tidelift" } ], - "time": "2022-12-30T00:15:36+00:00" + "time": "2022-12-30T00:23:10+00:00" }, { "name": "doctrine/lexer", @@ -2147,16 +2151,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.5.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "shasum": "" }, "require": { @@ -2243,7 +2247,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.5.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.1" }, "funding": [ { @@ -2259,7 +2263,7 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:11:26+00:00" + "time": "2023-08-27T10:13:57+00:00" }, { "name": "justinrainbow/json-schema", @@ -2333,29 +2337,26 @@ }, { "name": "laminas/laminas-diactoros", - "version": "2.25.2", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e" + "reference": "4db52734837c60259c9b2d7caf08eef8f7f9b9ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e", - "reference": "9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/4db52734837c60259c9b2d7caf08eef8f7f9b9ac", + "reference": "4db52734837c60259c9b2d7caf08eef8f7f9b9ac", "shasum": "" }, "require": { - "php": "~8.0.0 || ~8.1.0 || ~8.2.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1" - }, - "conflict": { - "zendframework/zend-diactoros": "*" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/http-factory": "^1.0.2", + "psr/http-message": "^1.1 || ^2.0" }, "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" + "psr/http-factory-implementation": "^1.1 || ^2.0", + "psr/http-message-implementation": "^1.1 || ^2.0" }, "require-dev": { "ext-curl": "*", @@ -2363,11 +2364,11 @@ "ext-gd": "*", "ext-libxml": "*", "http-interop/http-factory-tests": "^0.9.0", - "laminas/laminas-coding-standard": "^2.5", - "php-http/psr7-integration-tests": "^1.2", + "laminas/laminas-coding-standard": "~2.5.0", + "php-http/psr7-integration-tests": "^1.3", "phpunit/phpunit": "^9.5.28", "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.6" + "vimeo/psalm": "^5.15.0" }, "type": "library", "extra": { @@ -2382,18 +2383,9 @@ "src/functions/marshal_headers_from_sapi.php", "src/functions/marshal_method_from_sapi.php", "src/functions/marshal_protocol_version_from_sapi.php", - "src/functions/marshal_uri_from_sapi.php", "src/functions/normalize_server.php", "src/functions/normalize_uploaded_files.php", - "src/functions/parse_cookie_header.php", - "src/functions/create_uploaded_file.legacy.php", - "src/functions/marshal_headers_from_sapi.legacy.php", - "src/functions/marshal_method_from_sapi.legacy.php", - "src/functions/marshal_protocol_version_from_sapi.legacy.php", - "src/functions/marshal_uri_from_sapi.legacy.php", - "src/functions/normalize_server.legacy.php", - "src/functions/normalize_uploaded_files.legacy.php", - "src/functions/parse_cookie_header.legacy.php" + "src/functions/parse_cookie_header.php" ], "psr-4": { "Laminas\\Diactoros\\": "src/" @@ -2426,7 +2418,7 @@ "type": "community_bridge" } ], - "time": "2023-04-17T15:44:17+00:00" + "time": "2023-10-26T11:01:07+00:00" }, { "name": "monolog/monolog", @@ -2702,16 +2694,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.4", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -2752,9 +2744,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2023-03-05T19:49:14+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -2936,16 +2928,16 @@ }, { "name": "php-webdriver/webdriver", - "version": "1.14.0", + "version": "1.15.1", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "3ea4f924afb43056bf9c630509e657d951608563" + "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/3ea4f924afb43056bf9c630509e657d951608563", - "reference": "3ea4f924afb43056bf9c630509e657d951608563", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/cd52d9342c5aa738c2e75a67e47a1b6df97154e8", + "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8", "shasum": "" }, "require": { @@ -2954,7 +2946,7 @@ "ext-zip": "*", "php": "^7.3 || ^8.0", "symfony/polyfill-mbstring": "^1.12", - "symfony/process": "^5.0 || ^6.0" + "symfony/process": "^5.0 || ^6.0 || ^7.0" }, "replace": { "facebook/webdriver": "*" @@ -2996,303 +2988,22 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.14.0" - }, - "time": "2023-02-09T12:12:19+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.1" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "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" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "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.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.7.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "dfc078e8af9c99210337325ff5aa152872c98714" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/dfc078e8af9c99210337325ff5aa152872c98714", - "reference": "dfc078e8af9c99210337325ff5aa152872c98714", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.13" - }, - "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "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.7.1" - }, - "time": "2023-03-27T19:02:04+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "15873c65b207b07765dbc3c95d20fdf4a320cbe2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/15873c65b207b07765dbc3c95d20fdf4a320cbe2", - "reference": "15873c65b207b07765dbc3c95d20fdf4a320cbe2", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2 || ^2.0", - "php": "^7.2 || 8.0.* || 8.1.* || 8.2.*", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.17.0" - }, - "time": "2023-02-02T15:41:36+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "1.20.1", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "57f6787f0bb6431905a18aa7caea25dcd2bd59e0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/57f6787f0bb6431905a18aa7caea25dcd2bd59e0", - "reference": "57f6787f0bb6431905a18aa7caea25dcd2bd59e0", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "symfony/process": "^5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.20.1" - }, - "time": "2023-04-22T09:05:52+00:00" + "time": "2023-10-20T12:21:20+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.26", + "version": "9.2.29", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", "shasum": "" }, "require": { @@ -3348,7 +3059,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" }, "funding": [ { @@ -3356,7 +3068,7 @@ "type": "github" } ], - "time": "2023-03-06T12:58:08+00:00" + "time": "2023-09-19T04:57:46+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3601,20 +3313,20 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.20", + "version": "9.6.13", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba" + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba", - "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", + "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -3625,31 +3337,26 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-code-coverage": "^9.2.28", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", + "sebastian/comparator": "^4.0.8", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", + "sebastian/exporter": "^4.0.5", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.0", + "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -3657,7 +3364,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { @@ -3688,7 +3395,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" }, "funding": [ { @@ -3698,9 +3406,13 @@ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2022-04-01T12:37:26+00:00" + "time": "2023-09-19T05:39:22+00:00" }, { "name": "psr/cache", @@ -3963,16 +3675,16 @@ }, { "name": "psr/http-message", - "version": "1.1", + "version": "2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { @@ -3981,7 +3693,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -3996,7 +3708,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", @@ -4010,9 +3722,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/1.1" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "time": "2023-04-04T09:50:52+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { "name": "psr/log", @@ -4066,16 +3778,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.15", + "version": "v0.11.22", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "5350ce0ec8ecf2c5b5cf554cd2496f97b444af85" + "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/5350ce0ec8ecf2c5b5cf554cd2496f97b444af85", - "reference": "5350ce0ec8ecf2c5b5cf554cd2496f97b444af85", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/128fa1b608be651999ed9789c95e6e2a31b5802b", + "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b", "shasum": "" }, "require": { @@ -4104,7 +3816,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "0.11.x-dev" + "dev-0.11": "0.11.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false } }, "autoload": { @@ -4136,9 +3852,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.15" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.22" }, - "time": "2023-04-07T21:57:09+00:00" + "time": "2023-10-14T21:56:36+00:00" }, { "name": "ralouphie/getallheaders", @@ -4741,16 +4457,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -4795,7 +4511,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -4803,7 +4519,7 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", @@ -4947,16 +4663,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -4999,7 +4715,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { @@ -5007,7 +4723,7 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-08-02T09:26:13+00:00" }, { "name": "sebastian/lines-of-code", @@ -5655,16 +5371,16 @@ }, { "name": "symfony/console", - "version": "v5.4.22", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8" + "reference": "f4f71842f24c2023b91237c72a365306f3c58827" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3cd51fd2e6c461ca678f84d419461281bd87a0a8", - "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8", + "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", + "reference": "f4f71842f24c2023b91237c72a365306f3c58827", "shasum": "" }, "require": { @@ -5734,7 +5450,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.22" + "source": "https://github.com/symfony/console/tree/v5.4.28" }, "funding": [ { @@ -5750,20 +5466,20 @@ "type": "tidelift" } ], - "time": "2023-03-25T09:27:28+00:00" + "time": "2023-08-07T06:12:30+00:00" }, { "name": "symfony/css-selector", - "version": "v6.2.7", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0" + "reference": "883d961421ab1709877c10ac99451632a3d6fa57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/aedf3cb0f5b929ec255d96bbb4909e9932c769e0", - "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", + "reference": "883d961421ab1709877c10ac99451632a3d6fa57", "shasum": "" }, "require": { @@ -5799,7 +5515,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.2.7" + "source": "https://github.com/symfony/css-selector/tree/v6.3.2" }, "funding": [ { @@ -5815,7 +5531,7 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-07-12T16:00:22+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5960,24 +5676,25 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.2.8", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339" + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/04046f35fd7d72f9646e721fc2ecb8f9c67d3339", - "reference": "04046f35fd7d72f9646e721fc2ecb8f9c67d3339", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2|^3" + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", @@ -5990,13 +5707,9 @@ "symfony/error-handler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/stopwatch": "^5.4|^6.0" }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, "type": "library", "autoload": { "psr-4": { @@ -6023,7 +5736,7 @@ "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/v6.2.8" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" }, "funding": [ { @@ -6039,33 +5752,30 @@ "type": "tidelift" } ], - "time": "2023-03-20T16:06:02+00:00" + "time": "2023-07-06T06:56:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd" + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", - "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", "shasum": "" }, "require": { "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6102,7 +5812,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" }, "funding": [ { @@ -6118,7 +5828,7 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/filesystem", @@ -6185,16 +5895,16 @@ }, { "name": "symfony/finder", - "version": "v6.3.0", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2" + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d9b01ba073c44cef617c7907ce2419f8d00d75e2", - "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2", + "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", + "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", "shasum": "" }, "require": { @@ -6229,7 +5939,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.0" + "source": "https://github.com/symfony/finder/tree/v6.3.5" }, "funding": [ { @@ -6245,7 +5955,7 @@ "type": "tidelift" } ], - "time": "2023-04-02T01:25:41+00:00" + "time": "2023-09-26T12:56:25+00:00" }, { "name": "symfony/http-foundation", @@ -6409,16 +6119,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -6433,7 +6143,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6471,7 +6181,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -6487,20 +6197,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -6512,7 +6222,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6552,7 +6262,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -6568,7 +6278,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -6659,16 +6369,16 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -6680,7 +6390,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6723,7 +6433,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -6739,20 +6449,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -6767,7 +6477,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6806,7 +6516,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -6822,20 +6532,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", "shasum": "" }, "require": { @@ -6844,7 +6554,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6882,7 +6592,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" }, "funding": [ { @@ -6898,20 +6608,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", "shasum": "" }, "require": { @@ -6920,7 +6630,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6961,7 +6671,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" }, "funding": [ { @@ -6977,20 +6687,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -6999,7 +6709,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7044,7 +6754,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -7060,7 +6770,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php81", @@ -7282,16 +6992,16 @@ }, { "name": "symfony/service-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a" + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { @@ -7301,13 +7011,10 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -7347,7 +7054,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -7363,20 +7070,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/string", - "version": "v6.3.0", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" + "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", - "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "url": "https://api.github.com/repos/symfony/string/zipball/13d76d0fb049051ed12a04bef4f9de8715bea339", + "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339", "shasum": "" }, "require": { @@ -7433,7 +7140,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.0" + "source": "https://github.com/symfony/string/tree/v6.3.5" }, "funding": [ { @@ -7449,42 +7156,38 @@ "type": "tidelift" } ], - "time": "2023-03-21T21:06:29+00:00" + "time": "2023-09-18T10:38:32+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.2.8", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0" + "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d37ab6787be2db993747b6218fcc96e8e3bb4bd0", - "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/999ede244507c32b8e43aebaa10e9fce20de7c97", + "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", "symfony/process": "^5.4|^6.0", "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, "bin": [ "Resources/bin/var-dump-server" ], @@ -7521,7 +7224,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.2.8" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.6" }, "funding": [ { @@ -7537,24 +7240,25 @@ "type": "tidelift" } ], - "time": "2023-03-29T21:42:15+00:00" + "time": "2023-10-12T18:45:56+00:00" }, { "name": "symfony/yaml", - "version": "v6.2.7", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e8e6a1d59e050525f27a1f530aa9703423cb7f57" + "reference": "9758b6c69d179936435d0ffb577c3708d57e38a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e8e6a1d59e050525f27a1f530aa9703423cb7f57", - "reference": "e8e6a1d59e050525f27a1f530aa9703423cb7f57", + "url": "https://api.github.com/repos/symfony/yaml/zipball/9758b6c69d179936435d0ffb577c3708d57e38a8", + "reference": "9758b6c69d179936435d0ffb577c3708d57e38a8", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -7563,9 +7267,6 @@ "require-dev": { "symfony/console": "^5.4|^6.0" }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, "bin": [ "Resources/bin/yaml-lint" ], @@ -7595,7 +7296,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.2.7" + "source": "https://github.com/symfony/yaml/tree/v6.3.7" }, "funding": [ { @@ -7611,7 +7312,7 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:57:23+00:00" + "time": "2023-10-28T23:31:00+00:00" }, { "name": "thecodingmachine/safe", @@ -7802,64 +7503,6 @@ ], "time": "2021-07-28T10:34:58+00:00" }, - { - "name": "webmozart/assert", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "time": "2022-06-03T18:03:27+00:00" - }, { "name": "weew/helpers-array", "version": "v1.3.1", @@ -8760,5 +8403,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From eaa05f9c30a689d4b99fe076c4320569db7f10c8 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Mon, 30 Oct 2023 16:19:24 +0530 Subject: [PATCH 527/674] ACQE-5710 : Upgrading php 8.3 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 2392ccd66..9e93756da 100755 --- a/composer.json +++ b/composer.json @@ -23,7 +23,7 @@ "codeception/module-asserts": "^3.0", "codeception/module-sequence": "^3.0", "codeception/module-webdriver": "^3.0", - "composer/composer": "^1.9 || ^2.0, !=2.2.16", + "composer/composer": "^1.9||^2.0,!=2.2.16", "csharpru/vault-php": "^4.2.1", "guzzlehttp/guzzle": "^7.3.0", "laminas/laminas-diactoros": "^3.0", From 4fa7974db171d63a43b5b014ea6cdf0a882ad43e Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 7 Nov 2023 11:08:34 +0530 Subject: [PATCH 528/674] ACQE-5706 : No Ansi Fix --- .../Console/RunTestCommand.php | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php index 02e721ae3..634ecfe18 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php @@ -47,6 +47,12 @@ protected function configure() InputOption::VALUE_NONE, "creates xml report for executed test" ) +// ->addOption( +// 'no-ansi', +// 'no-ansi', +// InputOption::VALUE_NONE, +// "Disable ANSI" +// ) ->addArgument( 'name', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, @@ -168,6 +174,9 @@ private function runTests(array $tests, OutputInterface $output, InputInterface $xml = ($input->getOption('xml')) ? '--xml' : ""; + $noAnsi = ($input->getOption('no-ansi')) + ? '--no-ansi' + : ""; if ($this->pauseEnabled()) { $codeceptionCommand = self::CODECEPT_RUN_FUNCTIONAL; } else { @@ -196,7 +205,7 @@ private function runTests(array $tests, OutputInterface $output, InputInterface $this->returnCode = max($this->returnCode, $this->codeceptRunTest($fullCommand, $output)); } else { $fullCommand = $codeceptionCommand . $testsDirectory . $testName . ' --verbose --steps '.$xml; - $this->returnCode = max($this->returnCode, $this->executeTestCommand($fullCommand, $output)); + $this->returnCode = max($this->returnCode, $this->executeTestCommand($fullCommand, $output, $noAnsi)); } if (!empty($xml)) { $this->movingXMLFileFromSourceToDestination($xml, $testName, $output); @@ -259,14 +268,19 @@ private function runTestsInSuite(array $suitesConfig, OutputInterface $output, I * * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - private function executeTestCommand(string $command, OutputInterface $output) + private function executeTestCommand(string $command, OutputInterface $output, $noAnsi) { $process = Process::fromShellCommandline($command); $process->setWorkingDirectory(TESTS_BP); $process->setIdleTimeout(600); $process->setTimeout(0); - return $process->run(function ($type, $buffer) use ($output) { + return $process->run(function ($type, $buffer) use ($output, $noAnsi) { + if ( $noAnsi != "") { + $pattern = "/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?[m|K]/"; + // Use preg_replace to remove ANSI escape codes from the string + $buffer = preg_replace($pattern, '', $buffer); + } $output->write($buffer); }); } From f2c8e1e3cc5867884faa8a5a2924c7ce984011c2 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 7 Nov 2023 12:09:54 +0530 Subject: [PATCH 529/674] ACQE-5169 : Resolved conflicts --- .../FunctionalTestingFramework/Console/RunTestCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php index 634ecfe18..62c0b047d 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php @@ -276,7 +276,7 @@ private function executeTestCommand(string $command, OutputInterface $output, $n $process->setTimeout(0); return $process->run(function ($type, $buffer) use ($output, $noAnsi) { - if ( $noAnsi != "") { + if ($noAnsi != "") { $pattern = "/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?[m|K]/"; // Use preg_replace to remove ANSI escape codes from the string $buffer = preg_replace($pattern, '', $buffer); From 0ad02f1d7781592fe7c16a5b213c64210891a61b Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 7 Nov 2023 12:16:03 +0530 Subject: [PATCH 530/674] ACQE-5706 : no-ansi fix --- .../Console/RunTestGroupCommand.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php index fefbe08f8..0c1c27595 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php @@ -67,6 +67,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int $xml = ($input->getOption('xml')) ? '--xml' : ""; + $noAnsi = ($input->getOption('no-ansi')) + ? '--no-ansi' + : ""; $skipGeneration = $input->getOption('skip-generate'); $force = $input->getOption('force'); $groups = $input->getArgument('groups'); @@ -136,7 +139,12 @@ protected function execute(InputInterface $input, OutputInterface $output): int $process->setIdleTimeout(600); $process->setTimeout(0); $returnCodes[] = $process->run( - function ($type, $buffer) use ($output) { + function ($type, $buffer) use ($output, $noAnsi) { + if ($noAnsi != "") { + $pattern = "/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?[m|K]/"; + // Use preg_replace to remove ANSI escape codes from the string + $buffer = preg_replace($pattern, '', $buffer); + } $output->write($buffer); } ); From eb7d2628b49e3c2f8677b863cb67c6f11e6a254f Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 7 Nov 2023 12:36:34 +0530 Subject: [PATCH 531/674] ACQE-5706 : no-ansi fix --- .../Console/RunTestGroupCommand.php | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php index 0c1c27595..edd6a7d9c 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php @@ -64,12 +64,8 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output): int { - $xml = ($input->getOption('xml')) - ? '--xml' - : ""; - $noAnsi = ($input->getOption('no-ansi')) - ? '--no-ansi' - : ""; + $xml = ($input->getOption('xml')) ? '--xml' : ""; + $noAnsi = ($input->getOption('no-ansi')) ? '--no-ansi' : ""; $skipGeneration = $input->getOption('skip-generate'); $force = $input->getOption('force'); $groups = $input->getArgument('groups'); @@ -140,11 +136,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $process->setTimeout(0); $returnCodes[] = $process->run( function ($type, $buffer) use ($output, $noAnsi) { - if ($noAnsi != "") { - $pattern = "/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?[m|K]/"; - // Use preg_replace to remove ANSI escape codes from the string - $buffer = preg_replace($pattern, '', $buffer); - } + $buffer = $this->disableAnsiColorCodes($buffer, $noAnsi); $output->write($buffer); } ); @@ -167,4 +159,19 @@ function ($type, $buffer) use ($output, $noAnsi) { } return max($exitCode, $generationErrorCode); } + + /** + * @param string $buffer + * @param string $noAnsi + * @return string + */ + private function disableAnsiColorCodes($buffer, $noAnsi) :string + { + if (empty($noAnsi)) { + return $buffer; + } + $pattern = "/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?[m|K]/"; + // Use preg_replace to remove ANSI escape codes from the string + return preg_replace($pattern, '', $buffer); + } } From bcb9e1bb8a19447db57a94b431feb57e60018e71 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 7 Nov 2023 13:54:54 +0530 Subject: [PATCH 532/674] ACQE-5706 : Fix --- .../Console/RunTestCommand.php | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php index 62c0b047d..31ca307d5 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php @@ -46,14 +46,7 @@ protected function configure() 'xml', InputOption::VALUE_NONE, "creates xml report for executed test" - ) -// ->addOption( -// 'no-ansi', -// 'no-ansi', -// InputOption::VALUE_NONE, -// "Disable ANSI" -// ) - ->addArgument( + )->addArgument( 'name', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, "name of tests to generate and execute" @@ -134,7 +127,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int '--debug' => $debug, '--allow-skipped' => $allowSkipped, '-v' => $verbose, - '' + '' ]; $command->run(new ArrayInput($args), $output); @@ -171,12 +164,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int */ private function runTests(array $tests, OutputInterface $output, InputInterface $input) { - $xml = ($input->getOption('xml')) - ? '--xml' - : ""; - $noAnsi = ($input->getOption('no-ansi')) - ? '--no-ansi' - : ""; + $xml = ($input->getOption('xml')) ? '--xml' : ""; + $noAnsi = ($input->getOption('no-ansi')) ? '--no-ansi' : ""; if ($this->pauseEnabled()) { $codeceptionCommand = self::CODECEPT_RUN_FUNCTIONAL; } else { @@ -226,9 +215,8 @@ private function runTests(array $tests, OutputInterface $output, InputInterface */ private function runTestsInSuite(array $suitesConfig, OutputInterface $output, InputInterface $input) { - $xml = ($input->getOption('xml')) - ? '--xml' - : ""; + $xml = ($input->getOption('xml')) ? '--xml' : ""; + $noAnsi = ($input->getOption('no-ansi')) ? '--no-ansi' : ""; if ($this->pauseEnabled()) { $codeceptionCommand = self::CODECEPT_RUN_FUNCTIONAL . '--verbose --steps --debug '.$xml; } else { @@ -249,7 +237,7 @@ private function runTestsInSuite(array $suitesConfig, OutputInterface $output, I } $this->returnCode = max($this->returnCode, $this->codeceptRunTest($fullCommand, $output)); } else { - $this->returnCode = max($this->returnCode, $this->executeTestCommand($fullCommand, $output)); + $this->returnCode = max($this->returnCode, $this->executeTestCommand($fullCommand, $output, $noAnsi)); } if (!empty($xml)) { $this->movingXMLFileFromSourceToDestination($xml, $suite, $output); @@ -276,12 +264,23 @@ private function executeTestCommand(string $command, OutputInterface $output, $n $process->setTimeout(0); return $process->run(function ($type, $buffer) use ($output, $noAnsi) { - if ($noAnsi != "") { - $pattern = "/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?[m|K]/"; - // Use preg_replace to remove ANSI escape codes from the string - $buffer = preg_replace($pattern, '', $buffer); - } + $buffer = $this->disableAnsiColorCodes($buffer, $noAnsi); $output->write($buffer); }); } + + /** + * @param string $buffer + * @param string $noAnsi + * @return string + */ + private function disableAnsiColorCodes($buffer, $noAnsi) :string + { + if (empty($noAnsi)) { + return $buffer; + } + $pattern = "/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?[m|K]/"; + // Use preg_replace to remove ANSI escape codes from the string + return preg_replace($pattern, '', $buffer); + } } From 30989534a70a09e7bb5346d1a0f4ee7b73f48931 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Wed, 8 Nov 2023 12:30:29 +0530 Subject: [PATCH 533/674] Added 8.3 in main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3d806803d..da5f161cb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.1', '8.2'] + php-versions: ['8.1', '8.2', '8.3'] steps: - uses: actions/checkout@v2 From 0edfcece7b7d0539661fd3ba4bb4f0c5464b1b75 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 9 Nov 2023 13:09:19 +0530 Subject: [PATCH 534/674] ACQE-5710 : Deprecation error Fix --- dev/tests/_bootstrap.php | 2 +- dev/tests/unit/Util/TestLoggingUtil.php | 8 ++++---- .../Tests/ResilientGenerationTest.php | 16 ++++++++-------- .../StaticCheck/DeprecationStaticCheckTest.php | 12 +++++------- .../StaticCheck/PauseActionStaticCheckTest.php | 13 ++++++------- .../verification/Tests/SuiteGenerationTest.php | 2 +- .../Util/Logger/LoggingUtil.php | 2 +- .../Util/Sorter/ParallelGroupSorter.php | 4 ++-- 8 files changed, 28 insertions(+), 31 deletions(-) diff --git a/dev/tests/_bootstrap.php b/dev/tests/_bootstrap.php index 3b31c6e4a..7da6cffa7 100644 --- a/dev/tests/_bootstrap.php +++ b/dev/tests/_bootstrap.php @@ -36,7 +36,7 @@ foreach ($TEST_ENVS as $key => $value) { $_ENV[$key] = $value; - putenv("{$key}=${value}"); + putenv("{$key}={$value}"); } // Add our test module to the allowlist diff --git a/dev/tests/unit/Util/TestLoggingUtil.php b/dev/tests/unit/Util/TestLoggingUtil.php index ed29f091c..5b15758c6 100644 --- a/dev/tests/unit/Util/TestLoggingUtil.php +++ b/dev/tests/unit/Util/TestLoggingUtil.php @@ -12,6 +12,7 @@ use Monolog\Handler\TestHandler; use PHPUnit\Framework\TestCase; use ReflectionProperty; +use ReflectionClass; class TestLoggingUtil extends TestCase { @@ -64,7 +65,7 @@ public function setMockLoggingUtil(): void $property = new ReflectionProperty(LoggingUtil::class, 'instance'); $property->setAccessible(true); - $property->setValue($mockLoggingUtil); + $property->setValue(null, $mockLoggingUtil); } /** @@ -122,8 +123,7 @@ public function validateMockLogStatmentRegex(string $type, string $regex, array */ public function clearMockLoggingUtil(): void { - $property = new ReflectionProperty(LoggingUtil::class, 'instance'); - $property->setAccessible(true); - $property->setValue(null); + $reflectionClass = new ReflectionClass(LoggingUtil::class); + $reflectionClass->setStaticPropertyValue('instance', null); } } diff --git a/dev/tests/verification/Tests/ResilientGenerationTest.php b/dev/tests/verification/Tests/ResilientGenerationTest.php index cbd032ed2..23602e49b 100644 --- a/dev/tests/verification/Tests/ResilientGenerationTest.php +++ b/dev/tests/verification/Tests/ResilientGenerationTest.php @@ -76,19 +76,19 @@ public function setUp(): void $property = new \ReflectionProperty(SuiteGenerator::class, "instance"); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null,null); $property = new \ReflectionProperty(DirSetupUtil::class, "DIR_CONTEXT"); $property->setAccessible(true); - $property->setValue([]); + $property->setValue(null, []); $property = new \ReflectionProperty(SuiteObjectHandler::class, "instance"); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); $property = new \ReflectionProperty(TestObjectHandler::class, "testObjectHandler"); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); } /** @@ -261,19 +261,19 @@ public function tearDown(): void $property = new \ReflectionProperty(SuiteGenerator::class, "instance"); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); $property = new \ReflectionProperty(DirSetupUtil::class, "DIR_CONTEXT"); $property->setAccessible(true); - $property->setValue([]); + $property->setValue(null, []); $property = new \ReflectionProperty(SuiteObjectHandler::class, "instance"); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); $property = new \ReflectionProperty(TestObjectHandler::class, "testObjectHandler"); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); } /** diff --git a/dev/tests/verification/Tests/StaticCheck/DeprecationStaticCheckTest.php b/dev/tests/verification/Tests/StaticCheck/DeprecationStaticCheckTest.php index 58875d660..6b034adb1 100644 --- a/dev/tests/verification/Tests/StaticCheck/DeprecationStaticCheckTest.php +++ b/dev/tests/verification/Tests/StaticCheck/DeprecationStaticCheckTest.php @@ -10,6 +10,7 @@ use ReflectionProperty; use Symfony\Component\Console\Input\InputInterface; use tests\util\MftfStaticTestCase; +use ReflectionClass; class DeprecationStaticCheckTest extends MftfStaticTestCase { @@ -33,10 +34,8 @@ public function testDeprecatedEntityUsageCheck() $staticCheck = new DeprecatedEntityUsageCheck(); $input = $this->mockInputInterface(self::TEST_MODULE_PATH); - $property = new ReflectionProperty(StaticChecksList::class, 'errorFilesPath'); - $property->setAccessible(true); - $property->setValue(self::STATIC_RESULTS_DIR); - + $reflectionClass = new ReflectionClass(StaticChecksList::class); + $reflectionClass->setStaticPropertyValue('errorFilesPath', self::STATIC_RESULTS_DIR); /** @var InputInterface $input */ $staticCheck->execute($input); @@ -55,8 +54,7 @@ public function testDeprecatedEntityUsageCheck() */ public function tearDown(): void { - $property = new ReflectionProperty(StaticChecksList::class, 'errorFilesPath'); - $property->setAccessible(true); - $property->setValue(null); + $reflectionClass = new ReflectionClass(StaticChecksList::class); + $reflectionClass->setStaticPropertyValue('errorFilesPath', null); } } diff --git a/dev/tests/verification/Tests/StaticCheck/PauseActionStaticCheckTest.php b/dev/tests/verification/Tests/StaticCheck/PauseActionStaticCheckTest.php index 4c579b6c0..70ab480c4 100644 --- a/dev/tests/verification/Tests/StaticCheck/PauseActionStaticCheckTest.php +++ b/dev/tests/verification/Tests/StaticCheck/PauseActionStaticCheckTest.php @@ -8,9 +8,11 @@ use Exception; use Magento\FunctionalTestingFramework\StaticCheck\PauseActionUsageCheck; use Magento\FunctionalTestingFramework\StaticCheck\StaticChecksList; +use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler; use ReflectionProperty; use Symfony\Component\Console\Input\InputInterface; use tests\util\MftfStaticTestCase; +use ReflectionClass; class PauseActionStaticCheckTest extends MftfStaticTestCase { @@ -34,10 +36,8 @@ public function testPauseActionUsageCheck() $staticCheck = new PauseActionUsageCheck(); $input = $this->mockInputInterface(self::TEST_MODULE_PATH); - - $property = new ReflectionProperty(StaticChecksList::class, 'errorFilesPath'); - $property->setAccessible(true); - $property->setValue(self::STATIC_RESULTS_DIR); + $reflectionClass = new ReflectionClass(StaticChecksList::class); + $reflectionClass->setStaticPropertyValue('errorFilesPath', self::STATIC_RESULTS_DIR); /** @var InputInterface $input */ $staticCheck->execute($input); @@ -57,8 +57,7 @@ public function testPauseActionUsageCheck() */ public static function tearDownAfterClass(): void { - $property = new ReflectionProperty(StaticChecksList::class, 'errorFilesPath'); - $property->setAccessible(true); - $property->setValue(null); + $reflectionClass = new ReflectionClass(StaticChecksList::class); + $reflectionClass->setStaticPropertyValue('errorFilesPath', null); } } diff --git a/dev/tests/verification/Tests/SuiteGenerationTest.php b/dev/tests/verification/Tests/SuiteGenerationTest.php index 85fbbacc9..ea25048b4 100644 --- a/dev/tests/verification/Tests/SuiteGenerationTest.php +++ b/dev/tests/verification/Tests/SuiteGenerationTest.php @@ -493,7 +493,7 @@ public function tearDown(): void $property = new \ReflectionProperty(DirSetupUtil::class, "DIR_CONTEXT"); $property->setAccessible(true); - $property->setValue([]); + $property->setValue(null, []); } /** diff --git a/src/Magento/FunctionalTestingFramework/Util/Logger/LoggingUtil.php b/src/Magento/FunctionalTestingFramework/Util/Logger/LoggingUtil.php index c32348bcc..56a35be05 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Logger/LoggingUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Logger/LoggingUtil.php @@ -36,10 +36,10 @@ public static function getInstance(): LoggingUtil if (self::$instance === null) { self::$instance = new LoggingUtil(); } - return self::$instance; } + /** * Avoids instantiation of LoggingUtil by new. * @return void diff --git a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php index 0049ed81a..479471f96 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php +++ b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php @@ -487,8 +487,8 @@ private function splitTestSuite($suiteName, $tests, $maxTime) } $group = $this->createTestGroup($maxTime, $test, $size, $availableTests); - $splitSuites["{$suiteName}_${splitCount}_G"] = $group; - $this->addSuiteToConfig($suiteName, "{$suiteName}_${splitCount}_G", $group); + $splitSuites["{$suiteName}_{$splitCount}_G"] = $group; + $this->addSuiteToConfig($suiteName, "{$suiteName}_{$splitCount}_G", $group); $availableTests = array_diff_key($availableTests, $group); $splitCount++; From 1f14bff852cb729392e0fb0bbf4b4c6d7aaff5f1 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 9 Nov 2023 13:17:16 +0530 Subject: [PATCH 535/674] ACQE-5710 : Deprecation error Fix --- dev/tests/util/MftfTestCase.php | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/dev/tests/util/MftfTestCase.php b/dev/tests/util/MftfTestCase.php index a563186b3..365a8351f 100644 --- a/dev/tests/util/MftfTestCase.php +++ b/dev/tests/util/MftfTestCase.php @@ -9,8 +9,10 @@ use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler; use Magento\FunctionalTestingFramework\Suite\SuiteGenerator; use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; +use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; use Magento\FunctionalTestingFramework\Util\TestGenerator; use PHPUnit\Framework\TestCase; +use ReflectionClass; abstract class MftfTestCase extends TestCase { @@ -112,23 +114,19 @@ protected function assertExceptionRegex(string $expectClass, array $expectedMess private function clearHandler() { // clear test object handler to force recollection of test data - $property = new \ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); - $property->setAccessible(true); - $property->setValue(null); + $reflectionClass = new ReflectionClass(TestObjectHandler::class); + $reflectionClass->setStaticPropertyValue('testObjectHandler', null); // clear test object handler to force recollection of test data - $property = new \ReflectionProperty(ObjectManager::class, 'instance'); - $property->setAccessible(true); - $property->setValue(null); + $reflectionClass = new ReflectionClass(ObjectManager::class); + $reflectionClass->setStaticPropertyValue('instance', null); // clear suite generator to force recollection of test data - $property = new \ReflectionProperty(SuiteGenerator::class, 'instance'); - $property->setAccessible(true); - $property->setValue(null); + $reflectionClass = new ReflectionClass(SuiteGenerator::class); + $reflectionClass->setStaticPropertyValue('instance', null); // clear suite object handler to force recollection of test data - $property = new \ReflectionProperty(SuiteObjectHandler::class, 'instance'); - $property->setAccessible(true); - $property->setValue(null); + $reflectionClass = new ReflectionClass(SuiteObjectHandler::class); + $reflectionClass->setStaticPropertyValue('instance', null); } } From c646e081170da809d55ca4d904655d1941c04a22 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 9 Nov 2023 13:18:14 +0530 Subject: [PATCH 536/674] ACQE-5710 : Deprecation error Fix --- .../FunctionalTestingFramework/Util/Logger/LoggingUtil.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Logger/LoggingUtil.php b/src/Magento/FunctionalTestingFramework/Util/Logger/LoggingUtil.php index 56a35be05..51d707305 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Logger/LoggingUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Logger/LoggingUtil.php @@ -39,7 +39,6 @@ public static function getInstance(): LoggingUtil return self::$instance; } - /** * Avoids instantiation of LoggingUtil by new. * @return void From 15e91f937b40a4470e89999f6b1011dec44be8e3 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 9 Nov 2023 14:17:59 +0530 Subject: [PATCH 537/674] ACQE-5710 : Deprecation error Fix --- dev/tests/verification/Tests/ResilientGenerationTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/verification/Tests/ResilientGenerationTest.php b/dev/tests/verification/Tests/ResilientGenerationTest.php index 23602e49b..9bb2b9479 100644 --- a/dev/tests/verification/Tests/ResilientGenerationTest.php +++ b/dev/tests/verification/Tests/ResilientGenerationTest.php @@ -76,7 +76,7 @@ public function setUp(): void $property = new \ReflectionProperty(SuiteGenerator::class, "instance"); $property->setAccessible(true); - $property->setValue(null,null); + $property->setValue(null, null); $property = new \ReflectionProperty(DirSetupUtil::class, "DIR_CONTEXT"); $property->setAccessible(true); From bf104818020e6df518eae310945a397306c1f975 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 9 Nov 2023 15:01:41 +0530 Subject: [PATCH 538/674] ACQE-5710 : Deprecation error Fix Unit-Test --- .../Console/BaseGenerateCommandTest.php | 8 +++--- .../Handlers/DataObjectHandlerTest.php | 8 +++--- .../OperationDefinitionObjectHandlerTest.php | 8 +++--- .../Handlers/PersistedObjectHandlerTest.php | 8 +++--- .../OperationDataArrayResolverTest.php | 4 +-- .../Util/DataExtensionUtilTest.php | 4 +-- .../Page/Handlers/PageObjectHandlerTest.php | 8 +++--- .../Handlers/SectionObjectHandlerTest.php | 8 +++--- .../DeprecatedEntityUsageCheckTest.php | 8 +++--- .../Suite/Handlers/SuiteObjectHandlerTest.php | 6 ++--- .../Suite/SuiteGeneratorTest.php | 14 +++++----- .../Handlers/ActionGroupObjectHandlerTest.php | 8 +++--- .../Test/Handlers/TestObjectHandlerTest.php | 4 +-- .../Test/Objects/ActionGroupObjectTest.php | 6 ++--- .../Test/Objects/ActionObjectTest.php | 8 +++--- .../Test/Util/ObjectExtensionUtilTest.php | 6 ++--- .../Util/GenerationErrorHandlerTest.php | 2 +- .../Util/ModulePathExtractorTest.php | 2 +- .../Util/ModuleResolverTest.php | 10 +++---- .../Util/Sorter/ParallelGroupSorterTest.php | 2 +- .../Util/TestGeneratorTest.php | 26 +++++++++---------- 21 files changed, 79 insertions(+), 79 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php index fe486b615..6ce83ca9a 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php @@ -31,7 +31,7 @@ protected function tearDown(): void $testsProperty->setValue($handler, []); $testObjectHandlerProperty = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); $testObjectHandlerProperty->setAccessible(true); - $testObjectHandlerProperty->setValue($handler); + $testObjectHandlerProperty->setValue(null, $handler); $handler = SuiteObjectHandler::getInstance(); $suiteObjectsProperty = new ReflectionProperty(SuiteObjectHandler::class, 'suiteObjects'); @@ -39,7 +39,7 @@ protected function tearDown(): void $suiteObjectsProperty->setValue($handler, []); $suiteObjectHandlerProperty = new ReflectionProperty(SuiteObjectHandler::class, 'instance'); $suiteObjectHandlerProperty->setAccessible(true); - $suiteObjectHandlerProperty->setValue($handler); + $suiteObjectHandlerProperty->setValue(null, $handler); } public function testOneTestOneSuiteConfig(): void @@ -218,7 +218,7 @@ public function mockHandlers(array $testArray, array $suiteArray): void $testObjectHandlerProperty = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); $testObjectHandlerProperty->setAccessible(true); - $testObjectHandlerProperty->setValue($testObjectHandlerObject); + $testObjectHandlerProperty->setValue(null, $testObjectHandlerObject); $handler = TestObjectHandler::getInstance(); $property = new ReflectionProperty(TestObjectHandler::class, 'tests'); @@ -234,7 +234,7 @@ public function mockHandlers(array $testArray, array $suiteArray): void $suiteObjectHandlerProperty = new ReflectionProperty(SuiteObjectHandler::class, 'instance'); $suiteObjectHandlerProperty->setAccessible(true); - $suiteObjectHandlerProperty->setValue($suiteObjectHandlerObject); + $suiteObjectHandlerProperty->setValue(null, $suiteObjectHandlerObject); $handler = SuiteObjectHandler::getInstance(); $property = new ReflectionProperty(SuiteObjectHandler::class, 'suiteObjects'); diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php index 7ef84a53d..059a94057 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php @@ -324,7 +324,7 @@ private function mockDataObjectHandlerWithData(array $mockData): void { $dataObjectHandlerProperty = new ReflectionProperty(DataObjectHandler::class, "INSTANCE"); $dataObjectHandlerProperty->setAccessible(true); - $dataObjectHandlerProperty->setValue(null); + $dataObjectHandlerProperty->setValue(null, null); $mockDataProfileSchemaParser = $this->createMock(DataProfileSchemaParser::class); $mockDataProfileSchemaParser @@ -355,7 +355,7 @@ function ( $property = new ReflectionProperty(ObjectManager::class, 'instance'); $property->setAccessible(true); - $property->setValue($mockObjectManagerInstance); + $property->setValue(null, $mockObjectManagerInstance); } /** @@ -367,11 +367,11 @@ public static function tearDownAfterClass(): void $dataObjectHandlerProperty = new ReflectionProperty(DataObjectHandler::class, "INSTANCE"); $dataObjectHandlerProperty->setAccessible(true); - $dataObjectHandlerProperty->setValue(null); + $dataObjectHandlerProperty->setValue(null, null); $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue(null); + $objectManagerProperty->setValue(null, null); TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php index 33079b6cd..23dbcacc1 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php @@ -506,7 +506,7 @@ private function mockOperationHandlerWithData(array $mockData): void 'INSTANCE' ); $operationDefinitionObjectHandlerProperty->setAccessible(true); - $operationDefinitionObjectHandlerProperty->setValue(null); + $operationDefinitionObjectHandlerProperty->setValue(null, null); $mockOperationParser = $this->createMock(OperationDefinitionParser::class); $mockOperationParser @@ -537,7 +537,7 @@ function ( $property = new ReflectionProperty(ObjectManager::class, 'instance'); $property->setAccessible(true); - $property->setValue($mockObjectManagerInstance); + $property->setValue(null, $mockObjectManagerInstance); } /** @@ -552,11 +552,11 @@ public static function tearDownAfterClass(): void 'INSTANCE' ); $operationDefinitionObjectHandlerProperty->setAccessible(true); - $operationDefinitionObjectHandlerProperty->setValue(null); + $operationDefinitionObjectHandlerProperty->setValue(null, null); $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue(null); + $objectManagerProperty->setValue(null, null); TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php index f4b798ec5..19237247b 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php @@ -534,7 +534,7 @@ public function mockCurlHandler(string $response, array $parserOutput): void { $dataObjectHandler = new ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); $dataObjectHandler->setAccessible(true); - $dataObjectHandler->setValue(null); + $dataObjectHandler->setValue(null, null); $dataProfileSchemaParser = $this->createMock(DataProfileSchemaParser::class); $dataProfileSchemaParser @@ -574,7 +574,7 @@ function ($class, $arguments = []) use ($curlHandler, $objectManager, $dataProfi $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue($objectManagerMockInstance); + $objectManagerProperty->setValue(null, $objectManagerMockInstance); } /** @@ -589,11 +589,11 @@ public static function tearDownAfterClass(): void // Clear out Singleton between tests $persistedObjectHandlerProperty = new ReflectionProperty(PersistedObjectHandler::class, "INSTANCE"); $persistedObjectHandlerProperty->setAccessible(true); - $persistedObjectHandlerProperty->setValue(null); + $persistedObjectHandlerProperty->setValue(null, null); $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue(null); + $objectManagerProperty->setValue(null, null); 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 ce1911fd0..b4152901e 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php @@ -553,7 +553,7 @@ private function mockDataObjectHandler($childDataObject): void $property = new ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($instance); + $property->setValue(null, $instance); } /** @@ -578,6 +578,6 @@ private function mockOperationDefinitionObjectHandler($childOperationDefinition) $property = new ReflectionProperty(OperationDefinitionObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($instance); + $property->setValue(null, $instance); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Util/DataExtensionUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Util/DataExtensionUtilTest.php index 513715cc1..529af6e44 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Util/DataExtensionUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Util/DataExtensionUtilTest.php @@ -136,7 +136,7 @@ private function setMockEntities($mockEntityData): void { $property = new ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); $mockDataProfileSchemaParser = $this->createMock(DataProfileSchemaParser::class); $mockDataProfileSchemaParser->expects($this->any()) @@ -150,6 +150,6 @@ private function setMockEntities($mockEntityData): void $property = new ReflectionProperty(ObjectManager::class, 'instance'); $property->setAccessible(true); - $property->setValue($mockObjectManager); + $property->setValue(null, $mockObjectManager); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php index c611cc6a7..1f84f4b14 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php @@ -134,7 +134,7 @@ private function mockPageObjectHandlerWithData(array $mockData): void { $pageObjectHandlerProperty = new ReflectionProperty(PageObjectHandler::class, 'INSTANCE'); $pageObjectHandlerProperty->setAccessible(true); - $pageObjectHandlerProperty->setValue(null); + $pageObjectHandlerProperty->setValue(null, null); $mockSectionParser = $this->createMock(PageParser::class); $mockSectionParser @@ -165,7 +165,7 @@ function ( $property = new ReflectionProperty(ObjectManager::class, 'instance'); $property->setAccessible(true); - $property->setValue($mockObjectManagerInstance); + $property->setValue(null, $mockObjectManagerInstance); } /** @@ -177,11 +177,11 @@ public static function tearDownAfterClass(): void $pageObjectHandlerProperty = new ReflectionProperty(PageObjectHandler::class, 'INSTANCE'); $pageObjectHandlerProperty->setAccessible(true); - $pageObjectHandlerProperty->setValue(null); + $pageObjectHandlerProperty->setValue(null, null); $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue(null); + $objectManagerProperty->setValue(null, null); TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php index b0ce0a4b8..6ef16096a 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php @@ -119,7 +119,7 @@ private function mockSectionObjectHandlerWithData(array $mockData): void { $sectionObjectHandlerProperty = new ReflectionProperty(SectionObjectHandler::class, "INSTANCE"); $sectionObjectHandlerProperty->setAccessible(true); - $sectionObjectHandlerProperty->setValue(null); + $sectionObjectHandlerProperty->setValue(null, null); $mockSectionParser = $this->createMock(SectionParser::class); $mockSectionParser @@ -150,7 +150,7 @@ function ( $property = new ReflectionProperty(ObjectManager::class, 'instance'); $property->setAccessible(true); - $property->setValue($mockObjectManagerInstance); + $property->setValue(null, $mockObjectManagerInstance); } /** @@ -162,11 +162,11 @@ public static function tearDownAfterClass(): void $sectionObjectHandlerProperty = new ReflectionProperty(SectionObjectHandler::class, "INSTANCE"); $sectionObjectHandlerProperty->setAccessible(true); - $sectionObjectHandlerProperty->setValue(null); + $sectionObjectHandlerProperty->setValue(null, null); $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue(null); + $objectManagerProperty->setValue(null, null); TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/StaticCheck/DeprecatedEntityUsageCheckTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/StaticCheck/DeprecatedEntityUsageCheckTest.php index d4286060f..57044f123 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/StaticCheck/DeprecatedEntityUsageCheckTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/StaticCheck/DeprecatedEntityUsageCheckTest.php @@ -297,7 +297,7 @@ private function mockOperationHandlerWithData(array $mockData): void 'INSTANCE' ); $operationDefinitionObjectHandlerProperty->setAccessible(true); - $operationDefinitionObjectHandlerProperty->setValue(null); + $operationDefinitionObjectHandlerProperty->setValue(null, null); $mockOperationParser = $this->createMock(OperationDefinitionParser::class); $mockOperationParser @@ -328,7 +328,7 @@ function ( $property = new ReflectionProperty(ObjectManager::class, 'instance'); $property->setAccessible(true); - $property->setValue($mockObjectManagerInstance); + $property->setValue(null, $mockObjectManagerInstance); } /** @@ -343,11 +343,11 @@ public static function tearDownAfterClass(): void 'INSTANCE' ); $operationDefinitionObjectHandlerProperty->setAccessible(true); - $operationDefinitionObjectHandlerProperty->setValue(null); + $operationDefinitionObjectHandlerProperty->setValue(null, null); $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue(null); + $objectManagerProperty->setValue(null, null); } /** diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php index 373e0d6c1..7d1dd46bb 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php @@ -90,12 +90,12 @@ private function setMockTestAndSuiteParserOutput(array $testData, array $suiteDa // clear test object handler value to inject parsed content $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); // clear suite object handler value to inject parsed content $property = new ReflectionProperty(SuiteObjectHandler::class, 'instance'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); $mockDataParser = $this->createMock(TestDataParser::class); $mockDataParser @@ -128,6 +128,6 @@ function ($clazz) use ($mockDataParser, $mockSuiteDataParser) { $property = new ReflectionProperty(ObjectManager::class, 'instance'); $property->setAccessible(true); - $property->setValue($instance); + $property->setValue(null, $instance); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php index 13c797509..e6acefca9 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php @@ -369,7 +369,7 @@ private function setMockTestAndSuiteParserOutput(array $testData, array $suiteDa $suiteGeneratorServiceProperty = new ReflectionProperty(SuiteGeneratorService::class, 'INSTANCE'); $suiteGeneratorServiceProperty->setAccessible(true); - $suiteGeneratorServiceProperty->setValue($mockSuiteGeneratorService); + $suiteGeneratorServiceProperty->setValue(null, $mockSuiteGeneratorService); $mockDataParser = $this->createMock(TestDataParser::class); $mockDataParser @@ -418,7 +418,7 @@ function ( $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue($objectManagerMockInstance); + $objectManagerProperty->setValue(null, $objectManagerMockInstance); } /** @@ -430,17 +430,17 @@ private function clearMockResolverProperties(): void { $property = new ReflectionProperty(SuiteGenerator::class, 'instance'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); // clear test object handler value to inject parsed content $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); // clear suite object handler value to inject parsed content $property = new ReflectionProperty(SuiteObjectHandler::class, 'instance'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); } /** @@ -460,11 +460,11 @@ public static function tearDownAfterClass(): void $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue(null); + $objectManagerProperty->setValue(null, null); $suiteGeneratorServiceProperty = new ReflectionProperty(SuiteGeneratorService::class, 'INSTANCE'); $suiteGeneratorServiceProperty->setAccessible(true); - $suiteGeneratorServiceProperty->setValue(null); + $suiteGeneratorServiceProperty->setValue(null, null); TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php index c91d12a29..ce5983f62 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/ActionGroupObjectHandlerTest.php @@ -101,7 +101,7 @@ private function mockActionGroupObjectHandlerWithData(array $mockData): void { $actionGroupObjectHandlerProperty = new ReflectionProperty(ActionGroupObjectHandler::class, 'instance'); $actionGroupObjectHandlerProperty->setAccessible(true); - $actionGroupObjectHandlerProperty->setValue(null); + $actionGroupObjectHandlerProperty->setValue(null, null); $mockOperationParser = $this->createMock(ActionGroupDataParser::class); $mockOperationParser @@ -131,7 +131,7 @@ function ( $property = new ReflectionProperty(ObjectManager::class, 'instance'); $property->setAccessible(true); - $property->setValue($mockObjectManagerInstance); + $property->setValue(null, $mockObjectManagerInstance); } /** @@ -143,10 +143,10 @@ public static function tearDownAfterClass(): void $actionGroupObjectHandlerProperty = new ReflectionProperty(ActionGroupObjectHandler::class, 'instance'); $actionGroupObjectHandlerProperty->setAccessible(true); - $actionGroupObjectHandlerProperty->setValue(null); + $actionGroupObjectHandlerProperty->setValue(null, null); $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue(null); + $objectManagerProperty->setValue(null, null); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php index a2779bdd1..ca3bb3bf0 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php @@ -391,7 +391,7 @@ private function mockTestObjectHandler(array $data, ?array $paths = null): void // clear test object handler value to inject parsed content $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); $mockDataParser = $this->createMock(TestDataParser::class); $mockDataParser @@ -440,7 +440,7 @@ function ( $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue($objectManagerMockInstance); + $objectManagerProperty->setValue(null, $objectManagerMockInstance); $resolver = ModuleResolver::getInstance(); $property = new ReflectionProperty(ModuleResolver::class, 'enabledModuleNameAndPaths'); diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php index c66303ba6..1389c0254 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php @@ -229,7 +229,7 @@ public function testGetStepsWithParameterizedArg(): void // bypass the private constructor $property = new ReflectionProperty(SectionObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($sectionInstance); + $property->setValue(null, $sectionInstance); $actionGroupUnderTest = (new ActionGroupObjectBuilder()) ->withActionObjects( @@ -283,7 +283,7 @@ public function testGetStepsWithParameterizedSimpleArg(): void // bypass the private constructor $property = new ReflectionProperty(SectionObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($sectionInstance); + $property->setValue(null, $sectionInstance); $actionGroupUnderTest = (new ActionGroupObjectBuilder()) ->withActionObjects( @@ -456,7 +456,7 @@ private function setEntityObjectHandlerReturn($return): void // bypass the private constructor $property = new ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($instance); + $property->setValue(null, $instance); } /** diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php index d64de1cac..76a0272e8 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php @@ -262,7 +262,7 @@ public function testResolveUrl(): void // bypass the private constructor $property = new ReflectionProperty(PageObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($instance); + $property->setValue(null, $instance); // Call the method under test $actionObject->resolveReferences(); @@ -301,7 +301,7 @@ public function testResolveUrlWithNoAttribute(): void // bypass the private constructor $property = new ReflectionProperty(PageObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($instance); + $property->setValue(null, $instance); // Call the method under test $actionObject->resolveReferences(); @@ -478,7 +478,7 @@ private function mockSectionHandlerWithElement(ElementObject $elementObject): vo // bypass the private constructor $property = new ReflectionProperty(SectionObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($instance); + $property->setValue(null, $instance); } /** @@ -498,7 +498,7 @@ private function mockDataHandlerWithData(EntityDataObject $dataObject): void // bypass the private constructor $property = new ReflectionProperty(DataObjectHandler::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($dataInstance); + $property->setValue(null, $dataInstance); } /** diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php index b30e4b50e..cfad47c97 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php @@ -407,12 +407,12 @@ private function setMockTestOutput(array $testData = null, array $actionGroupDat // clear test object handler value to inject parsed content $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); // clear test object handler value to inject parsed content $property = new ReflectionProperty(ActionGroupObjectHandler::class, 'instance'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); $mockDataParser = $this->createMock(TestDataParser::class); $mockDataParser @@ -445,6 +445,6 @@ function ($className) use ($mockDataParser, $mockActionGroupParser) { // clear object manager value to inject expected instance $property = new ReflectionProperty(ObjectManager::class, 'instance'); $property->setAccessible(true); - $property->setValue($instance); + $property->setValue(null, $instance); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/GenerationErrorHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/GenerationErrorHandlerTest.php index 35ffd6d3b..bc88879d1 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/GenerationErrorHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/GenerationErrorHandlerTest.php @@ -340,6 +340,6 @@ public function tearDown(): void { $property = new ReflectionProperty(GenerationErrorHandler::class, 'instance'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModulePathExtractorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModulePathExtractorTest.php index 00be96582..6ee4a8cdd 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModulePathExtractorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModulePathExtractorTest.php @@ -159,7 +159,7 @@ function ($class) use ($mockResolver) { $objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance'); $objectManagerProperty->setAccessible(true); - $objectManagerProperty->setValue($objectManagerMockInstance); + $objectManagerProperty->setValue(null, $objectManagerMockInstance); $resolver = ModuleResolver::getInstance(); $property = new ReflectionProperty(ModuleResolver::class, 'enabledModuleNameAndPaths'); diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php index 25fd20d73..9809e50ff 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php @@ -39,11 +39,11 @@ public static function tearDownAfterClass(): void $moduleResolverServiceInstance = new ReflectionProperty(ModuleResolverService::class, 'INSTANCE'); $moduleResolverServiceInstance->setAccessible(true); - $moduleResolverServiceInstance->setValue(null); + $moduleResolverServiceInstance->setValue(null, null); $mftfAppConfigInstance = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); $mftfAppConfigInstance->setAccessible(true); - $mftfAppConfigInstance->setValue(null); + $mftfAppConfigInstance->setValue(null, null); } /** @@ -151,7 +151,7 @@ public function testGetModulePathsLocations(): void // clear test object handler value to inject parsed content $property = new ReflectionProperty(ModuleResolver::class, 'instance'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); $this->mockForceGenerate(false); // Define the Module paths from default TESTS_MODULE_PATH @@ -923,7 +923,7 @@ private function setMockResolverCreatorProperties(?MockObject $moduleResolverSer { $property = new ReflectionProperty(ModuleResolverService::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($moduleResolverService); + $property->setValue(null, $moduleResolverService); } /** @@ -942,7 +942,7 @@ private function mockForceGenerate(bool $forceGenerate): void $property = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); $property->setAccessible(true); - $property->setValue($mockConfig); + $property->setValue(null, $mockConfig); } /** diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php index 3d64e1346..7bd29acab 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php @@ -496,7 +496,7 @@ public static function tearDownAfterClass(): void { $instanceProperty = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); $instanceProperty->setAccessible(true); - $instanceProperty->setValue(null); + $instanceProperty->setValue(null, null); } /** diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index e8e3a4338..781e69584 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -37,11 +37,11 @@ public static function setUpBeforeClass(): void $property = new ReflectionProperty(ObjectManager::class, 'instance'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); $property = new ReflectionProperty(ModuleResolver::class, 'instance'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); } /** @@ -206,7 +206,7 @@ public function testAllowSkipped(): void $property = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); $property->setAccessible(true); - $property->setValue($mockConfig); + $property->setValue(null, $mockConfig); $actionInput = 'fakeInput'; $actionObject = new ActionObject('fakeAction', 'comment', [ @@ -251,7 +251,7 @@ public function testSeverityFilter(): void $property = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); $property->setAccessible(true); - $property->setValue($mockConfig); + $property->setValue(null, $mockConfig); $actionInput = 'fakeInput'; $actionObject = new ActionObject('fakeAction', 'comment', [ @@ -290,7 +290,7 @@ function ($filename) use (&$generatedTests) { $property = new ReflectionProperty(CestFileCreatorUtil::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($cestFileCreatorUtil); + $property->setValue(null, $cestFileCreatorUtil); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); $testGeneratorObject->createAllTestFiles(); @@ -414,7 +414,7 @@ public function testIncludeGroupFilter(): void $property = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); $property->setAccessible(true); - $property->setValue($mockConfig); + $property->setValue(null, $mockConfig); $actionInput = 'fakeInput'; $actionObject = new ActionObject('fakeAction', 'comment', [ @@ -453,7 +453,7 @@ function ($filename) use (&$generatedTests) { $property = new ReflectionProperty(CestFileCreatorUtil::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($cestFileCreatorUtil); + $property->setValue(null, $cestFileCreatorUtil); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); $testGeneratorObject->createAllTestFiles(); @@ -479,7 +479,7 @@ public function testExcludeGroupFilter(): void $property = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); $property->setAccessible(true); - $property->setValue($mockConfig); + $property->setValue(null, $mockConfig); $actionInput = 'fakeInput'; $actionObject = new ActionObject('fakeAction', 'comment', [ @@ -518,7 +518,7 @@ function ($filename) use (&$generatedTests) { $property = new ReflectionProperty(CestFileCreatorUtil::class, 'INSTANCE'); $property->setAccessible(true); - $property->setValue($cestFileCreatorUtil); + $property->setValue(null, $cestFileCreatorUtil); $testGeneratorObject = TestGenerator::getInstance('', ['sampleTest' => $test1, 'test2' => $test2]); $testGeneratorObject->createAllTestFiles(); @@ -537,15 +537,15 @@ public static function tearDownAfterClass(): void $cestFileCreatorUtilInstance = new ReflectionProperty(CestFileCreatorUtil::class, 'INSTANCE'); $cestFileCreatorUtilInstance->setAccessible(true); - $cestFileCreatorUtilInstance->setValue(null); + $cestFileCreatorUtilInstance->setValue(null, null); $mftfAppConfigInstance = new ReflectionProperty(MftfApplicationConfig::class, 'MFTF_APPLICATION_CONTEXT'); $mftfAppConfigInstance->setAccessible(true); - $mftfAppConfigInstance->setValue(null); + $mftfAppConfigInstance->setValue(null, null); $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); $property->setAccessible(true); - $property->setValue(null); + $property->setValue(null, null); } /** @@ -561,6 +561,6 @@ private function mockTestObjectHandler(): void $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); $property->setAccessible(true); - $property->setValue($testObjectHandler); + $property->setValue(null, $testObjectHandler); } } From 0d640e265c701e7c700852f9974137a6adc419bd Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Fri, 10 Nov 2023 11:07:06 +0530 Subject: [PATCH 539/674] ACQE-5710 : Composer update --- composer.json | 14 +- composer.lock | 1203 ++++++++++++++++++------------------------------- 2 files changed, 451 insertions(+), 766 deletions(-) diff --git a/composer.json b/composer.json index 9e93756da..524732be7 100755 --- a/composer.json +++ b/composer.json @@ -32,13 +32,13 @@ "nikic/php-parser": "^4.4", "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0", - "symfony/console": "^4.4||^5.4", - "symfony/string": "^5.4||^6.3", - "symfony/dotenv": "^5.3||^6.3", - "symfony/finder": "^5.0||^6.3", - "symfony/http-foundation": "^5.0||^6.3", - "symfony/mime": "^5.0||^6.3", - "symfony/process": "<=5.4.23", + "symfony/console": "^4.4||^6.0", + "symfony/string": "^5.4||^6.0", + "symfony/dotenv": "^5.3||^6.0", + "symfony/finder": "^5.0||^6.0", + "symfony/http-foundation": "^5.0||^6.0", + "symfony/mime": "^5.0||^6.0", + "symfony/process": "^5.0||^6.0", "weew/helpers-array": "^1.3", "doctrine/annotations": "^2.0" }, diff --git a/composer.lock b/composer.lock index b4395ecf9..a3ee7c763 100644 --- a/composer.lock +++ b/composer.lock @@ -4,35 +4,34 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9179fdb38023b95ab01ad2482db205a1", + "content-hash": "c0a80070ef1549d7b206d53e7ecd64b0", "packages": [ { "name": "allure-framework/allure-codeception", - "version": "v2.1.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-codeception.git", - "reference": "1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8" + "reference": "d28f6ba7139406974b977e5611bc65b59c492a55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8", - "reference": "1d3b80bce18ea130e2c34a3ec1f57138a77b6fa8", + "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/d28f6ba7139406974b977e5611bc65b59c492a55", + "reference": "d28f6ba7139406974b977e5611bc65b59c492a55", "shasum": "" }, "require": { - "allure-framework/allure-php-commons": "^2", - "codeception/codeception": "^5", + "allure-framework/allure-php-commons": "^2.3.1", + "codeception/codeception": "^5.0.3", "ext-json": "*", "php": "^8" }, "require-dev": { - "phpunit/phpunit": "^9", "psalm/plugin-phpunit": "^0.18.4", "remorhaz/php-json-data": "^0.5.3", "remorhaz/php-json-path": "^0.7.7", - "squizlabs/php_codesniffer": "^3.7.1", - "vimeo/psalm": "^5.2" + "squizlabs/php_codesniffer": "^3.7.2", + "vimeo/psalm": "^5.12" }, "type": "library", "autoload": { @@ -72,20 +71,20 @@ "issues": "https://github.com/allure-framework/allure-codeception/issues", "source": "https://github.com/allure-framework/allure-codeception" }, - "time": "2023-01-09T08:09:01+00:00" + "time": "2023-05-31T14:10:46+00:00" }, { "name": "allure-framework/allure-php-commons", - "version": "v2.2.0", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-php-commons2.git", - "reference": "c2b222c1f999c851e029290c09a3fe4933390bda" + "reference": "5d7ed5ab510339652163ca1473eb499d4b7ec488" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/c2b222c1f999c851e029290c09a3fe4933390bda", - "reference": "c2b222c1f999c851e029290c09a3fe4933390bda", + "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/5d7ed5ab510339652163ca1473eb499d4b7ec488", + "reference": "5d7ed5ab510339652163ca1473eb499d4b7ec488", "shasum": "" }, "require": { @@ -100,10 +99,10 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "^1", - "phpunit/phpunit": "^9.5.10", + "phpunit/phpunit": "^9.6.8", "psalm/plugin-phpunit": "^0.18.4", - "squizlabs/php_codesniffer": "^3.7.1", - "vimeo/psalm": "^5.4" + "squizlabs/php_codesniffer": "^3.7.2", + "vimeo/psalm": "^5.12" }, "type": "library", "autoload": { @@ -142,7 +141,7 @@ "issues": "https://github.com/allure-framework/allure-php-commons2/issues", "source": "https://github.com/allure-framework/allure-php-commons" }, - "time": "2023-01-12T14:28:21+00:00" + "time": "2023-05-30T10:55:43+00:00" }, { "name": "allure-framework/allure-phpunit", @@ -214,16 +213,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.1", + "version": "v1.2.3", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5" + "reference": "5545a4fa310aec39f54279fdacebcce33b3ff382" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/1926277fc71d253dfa820271ac5987bdb193ccf5", - "reference": "1926277fc71d253dfa820271ac5987bdb193ccf5", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/5545a4fa310aec39f54279fdacebcce33b3ff382", + "reference": "5545a4fa310aec39f54279fdacebcce33b3ff382", "shasum": "" }, "require": { @@ -262,34 +261,35 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.1" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.3" }, - "time": "2023-03-24T20:22:19+00:00" + "time": "2023-10-16T20:10:06+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.268.16", + "version": "3.285.3", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98" + "reference": "afa1e722f1b2c95644f375dc1a19072e4daf67be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98", - "reference": "b59134c9ca64dcb9de6f7dbbcb9d5a75ed665a98", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/afa1e722f1b2c95644f375dc1a19072e4daf67be", + "reference": "afa1e722f1b2c95644f375dc1a19072e4daf67be", "shasum": "" }, "require": { - "aws/aws-crt-php": "^1.0.4", + "aws/aws-crt-php": "^1.2.3", "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0", + "guzzlehttp/promises": "^1.4.0 || ^2.0", "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "mtdowling/jmespath.php": "^2.6", - "php": ">=5.5" + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0" }, "require-dev": { "andrewsville/php-token-reflection": "^1.4", @@ -304,9 +304,8 @@ "ext-sockets": "*", "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", + "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", "psr/cache": "^1.0", - "psr/http-message": "^1.0", "psr/simple-cache": "^1.0", "sebastian/comparator": "^1.2.3 || ^4.0", "yoast/phpunit-polyfills": "^1.0" @@ -357,9 +356,9 @@ "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.268.16" + "source": "https://github.com/aws/aws-sdk-php/tree/3.285.3" }, - "time": "2023-04-21T21:37:05+00:00" + "time": "2023-11-09T19:07:19+00:00" }, { "name": "beberlei/assert", @@ -977,16 +976,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.5", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd" + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", "shasum": "" }, "require": { @@ -1033,80 +1032,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.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": "2023-01-11T08:27:00+00:00" - }, - { - "name": "composer/class-map-generator", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", - "shasum": "" - }, - "require": { - "composer/pcre": "^2 || ^3", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" - }, - "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\ClassMapGenerator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Utilities to scan PHP code and generate class maps.", - "keywords": [ - "classmap" - ], - "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + "source": "https://github.com/composer/ca-bundle/tree/1.3.7" }, "funding": [ { @@ -1122,52 +1048,43 @@ "type": "tidelift" } ], - "time": "2022-06-19T11:31:27+00:00" + "time": "2023-08-30T09:31:38+00:00" }, { "name": "composer/composer", - "version": "2.5.5", + "version": "2.2.22", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f" + "reference": "fedc76ee3f3e3d57d20993b9f4c5fcfb2f8596aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/c7cffaad16a60636a776017eac5bd8cd0095c32f", - "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f", + "url": "https://api.github.com/repos/composer/composer/zipball/fedc76ee3f3e3d57d20993b9f4c5fcfb2f8596aa", + "reference": "fedc76ee3f3e3d57d20993b9f4c5fcfb2f8596aa", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2.1 || ^3.1", + "composer/pcre": "^1.0", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.5.7", - "composer/xdebug-handler": "^2.0.2 || ^3.0.3", + "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^2.0 || ^3.0", "justinrainbow/json-schema": "^5.2.11", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8", + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0 || ^2.0", + "react/promise": "^1.2 || ^2.7", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.2", - "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/polyfill-php73": "^1.24", - "symfony/polyfill-php80": "^1.24", - "symfony/polyfill-php81": "^1.24", - "symfony/process": "^5.4 || ^6.0" + "seld/phar-utils": "^1.0", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", + "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" }, "require-dev": { - "phpstan/phpstan": "^1.9.3", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1", - "phpstan/phpstan-symfony": "^1.2.10", - "symfony/phpunit-bridge": "^6.0" + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -1180,12 +1097,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" - }, - "phpstan": { - "includes": [ - "phpstan/rules.neon" - ] + "dev-main": "2.2-dev" } }, "autoload": { @@ -1219,7 +1131,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.5.5" + "source": "https://github.com/composer/composer/tree/2.2.22" }, "funding": [ { @@ -1235,7 +1147,7 @@ "type": "tidelift" } ], - "time": "2023-03-21T10:50:05+00:00" + "time": "2023-09-29T08:53:46+00:00" }, { "name": "composer/metadata-minifier", @@ -1308,30 +1220,30 @@ }, { "name": "composer/pcre", - "version": "3.1.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560", + "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.3", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.x-dev" + "dev-main": "1.x-dev" } }, "autoload": { @@ -1359,7 +1271,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.0" + "source": "https://github.com/composer/pcre/tree/1.0.1" }, "funding": [ { @@ -1375,20 +1287,20 @@ "type": "tidelift" } ], - "time": "2022-11-17T09:50:14+00:00" + "time": "2022-01-21T20:24:37+00:00" }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", "shasum": "" }, "require": { @@ -1438,9 +1350,9 @@ "versioning" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.4.0" }, "funding": [ { @@ -1456,7 +1368,7 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2023-08-31T09:50:34+00:00" }, { "name": "composer/spdx-licenses", @@ -1742,53 +1654,6 @@ }, "time": "2023-02-02T22:02:53+00:00" }, - { - "name": "doctrine/deprecations", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", - "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.2" - }, - "time": "2023-09-27T20:04:15+00:00" - }, { "name": "doctrine/instantiator", "version": "2.0.0", @@ -1861,28 +1726,27 @@ }, { "name": "doctrine/lexer", - "version": "2.1.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" + "reference": "84a527db05647743d50373e0ec53a152f2cde568" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.0" + "vimeo/psalm": "^5.0" }, "type": "library", "autoload": { @@ -1919,7 +1783,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.0" + "source": "https://github.com/doctrine/lexer/tree/3.0.0" }, "funding": [ { @@ -1935,26 +1799,26 @@ "type": "tidelift" } ], - "time": "2022-12-14T08:49:07+00:00" + "time": "2022-12-15T16:57:16+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.5.1", + "version": "7.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9" + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b964ca597e86b752cd994f27293e9fa6b6a95ed9", - "reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -1965,7 +1829,8 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.29 || ^9.5.23", "psr/log": "^1.1 || ^2.0 || ^3.0" }, @@ -1979,9 +1844,6 @@ "bamarni-bin": { "bin-links": true, "forward-command": false - }, - "branch-alias": { - "dev-master": "7.5-dev" } }, "autoload": { @@ -2047,7 +1909,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.5.1" + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" }, "funding": [ { @@ -2063,38 +1925,37 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:30:08+00:00" + "time": "2023-08-27T10:20:53+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.2", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "b94b2807d85443f9719887892882d0329d1e2598" + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", - "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -2131,7 +1992,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.2" + "source": "https://github.com/guzzle/promises/tree/2.0.1" }, "funding": [ { @@ -2147,7 +2008,7 @@ "type": "tidelift" } ], - "time": "2022-08-28T14:55:35+00:00" + "time": "2023-08-03T15:11:55+00:00" }, { "name": "guzzlehttp/psr7", @@ -2267,16 +2128,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.12", + "version": "v5.2.13", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", "shasum": "" }, "require": { @@ -2331,9 +2192,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "source": "https://github.com/justinrainbow/json-schema/tree/v5.2.13" }, - "time": "2022-04-13T08:02:27+00:00" + "time": "2023-09-26T02:20:38+00:00" }, { "name": "laminas/laminas-diactoros", @@ -2422,16 +2283,16 @@ }, { "name": "monolog/monolog", - "version": "2.9.1", + "version": "2.9.2", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1" + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f259e2b15fb95494c83f52d3caad003bbf5ffaa1", - "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", "shasum": "" }, "require": { @@ -2508,7 +2369,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.9.1" + "source": "https://github.com/Seldaek/monolog/tree/2.9.2" }, "funding": [ { @@ -2520,29 +2381,29 @@ "type": "tidelift" } ], - "time": "2023-02-06T13:44:46+00:00" + "time": "2023-10-27T15:25:26+00:00" }, { "name": "mtdowling/jmespath.php", - "version": "2.6.1", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb" + "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb", - "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b", + "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b", "shasum": "" }, "require": { - "php": "^5.4 || ^7.0 || ^8.0", + "php": "^7.2.5 || ^8.0", "symfony/polyfill-mbstring": "^1.17" }, "require-dev": { - "composer/xdebug-handler": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^7.5.15" + "composer/xdebug-handler": "^3.0.3", + "phpunit/phpunit": "^8.5.33" }, "bin": [ "bin/jp.php" @@ -2550,7 +2411,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "2.7-dev" } }, "autoload": { @@ -2566,6 +2427,11 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", @@ -2579,9 +2445,9 @@ ], "support": { "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1" + "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0" }, - "time": "2021-06-14T00:11:39+00:00" + "time": "2023-08-25T10:54:48+00:00" }, { "name": "mustache/mustache", @@ -3465,27 +3331,22 @@ }, { "name": "psr/container", - "version": "2.0.2", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", "shasum": "" }, "require": { "php": ">=7.4.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -3512,72 +3373,22 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" + "source": "https://github.com/php-fig/container/tree/1.1.2" }, - "time": "2021-11-05T16:47:00+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" + "time": "2021-11-05T16:50:12+00:00" }, { "name": "psr/http-client", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { @@ -3614,9 +3425,9 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/1.0.2" + "source": "https://github.com/php-fig/http-client" }, - "time": "2023-04-10T20:12:12+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", @@ -3991,16 +3802,16 @@ }, { "name": "ramsey/uuid", - "version": "4.7.4", + "version": "4.7.5", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "60a4c63ab724854332900504274f6150ff26d286" + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", - "reference": "60a4c63ab724854332900504274f6150ff26d286", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", "shasum": "" }, "require": { @@ -4067,7 +3878,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.4" + "source": "https://github.com/ramsey/uuid/tree/4.7.5" }, "funding": [ { @@ -4079,27 +3890,27 @@ "type": "tidelift" } ], - "time": "2023-04-15T23:01:58+00:00" + "time": "2023-11-08T05:53:05+00:00" }, { "name": "react/promise", - "version": "v2.9.0", + "version": "v2.10.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -4143,19 +3954,15 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" + "source": "https://github.com/reactphp/promise/tree/v2.10.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-02-11T10:27:51+00:00" + "time": "2023-05-02T15:15:43+00:00" }, { "name": "sebastian/cli-parser", @@ -5123,16 +4930,16 @@ }, { "name": "seld/jsonlint", - "version": "1.9.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", "shasum": "" }, "require": { @@ -5171,7 +4978,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.10.0" }, "funding": [ { @@ -5183,7 +4990,7 @@ "type": "tidelift" } ], - "time": "2022-04-01T13:37:23+00:00" + "time": "2023-05-11T13:16:46+00:00" }, { "name": "seld/phar-utils", @@ -5233,67 +5040,6 @@ }, "time": "2022-08-31T10:31:18+00:00" }, - { - "name": "seld/signal-handler", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "require-dev": { - "phpstan/phpstan": "^1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "psr/log": "^1 || ^2 || ^3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\Signal\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", - "keywords": [ - "posix", - "sigint", - "signal", - "sigterm", - "unix" - ], - "support": { - "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" - }, - "time": "2022-07-20T18:31:45+00:00" - }, { "name": "spomky-labs/otphp", "version": "v10.0.3", @@ -5371,46 +5117,43 @@ }, { "name": "symfony/console", - "version": "v5.4.28", + "version": "v4.4.49", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827" + "reference": "33fa45ffc81fdcc1ca368d4946da859c8cdb58d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827", + "url": "https://api.github.com/repos/symfony/console/zipball/33fa45ffc81fdcc1ca368d4946da859c8cdb58d9", + "reference": "33fa45ffc81fdcc1ca368d4946da859c8cdb58d9", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=7.1.3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php73": "^1.8", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" + "symfony/service-contracts": "^1.1|^2" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/process": "<3.3" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5443,14 +5186,8 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.28" + "source": "https://github.com/symfony/console/tree/v4.4.49" }, "funding": [ { @@ -5466,7 +5203,7 @@ "type": "tidelift" } ], - "time": "2023-08-07T06:12:30+00:00" + "time": "2022-11-05T17:10:16+00:00" }, { "name": "symfony/css-selector", @@ -5535,25 +5272,25 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.3.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5582,7 +5319,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -5598,28 +5335,24 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/dotenv", - "version": "v6.3.0", + "version": "v6.0.19", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "ceadb434fe2a6763a03d2d110441745834f3dd1e" + "reference": "9cee123707e689f7e06c09624c145d206468bcf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/ceadb434fe2a6763a03d2d110441745834f3dd1e", - "reference": "ceadb434fe2a6763a03d2d110441745834f3dd1e", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/9cee123707e689f7e06c09624c145d206468bcf2", + "reference": "9cee123707e689f7e06c09624c145d206468bcf2", "shasum": "" }, "require": { - "php": ">=8.1" - }, - "conflict": { - "symfony/console": "<5.4", - "symfony/process": "<5.4" + "php": ">=8.0.2" }, "require-dev": { "symfony/console": "^5.4|^6.0", @@ -5656,7 +5389,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.3.0" + "source": "https://github.com/symfony/dotenv/tree/v6.0.19" }, "funding": [ { @@ -5672,43 +5405,47 @@ "type": "tidelift" } ], - "time": "2023-04-21T14:41:17+00:00" + "time": "2023-01-01T08:36:10+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.3.2", + "version": "v4.4.44", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" + "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", - "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1e866e9e5c1b22168e0ce5f0b467f19bba61266a", + "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2.5|^3" + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1", + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/service-contracts": "<2.5" + "symfony/dependency-injection": "<3.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" + "symfony/event-dispatcher-implementation": "1.1" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.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", + "symfony/stopwatch": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" }, "type": "library", "autoload": { @@ -5736,7 +5473,7 @@ "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/v6.3.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.44" }, "funding": [ { @@ -5752,30 +5489,33 @@ "type": "tidelift" } ], - "time": "2023-07-06T06:56:43+00:00" + "time": "2022-07-20T09:59:04+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.3.0", + "version": "v1.1.13", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/1d5cd762abaa6b2a4169d3e77610193a7157129e", + "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/event-dispatcher": "^1" + "php": ">=7.1.3" + }, + "suggest": { + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "1.1-dev" }, "thanks": { "name": "symfony/contracts", @@ -5812,7 +5552,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.13" }, "funding": [ { @@ -5828,20 +5568,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2022-01-02T09:41:36+00:00" }, { "name": "symfony/filesystem", - "version": "v6.2.7", + "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "82b6c62b959f642d000456f08c6d219d749215b3" + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/82b6c62b959f642d000456f08c6d219d749215b3", - "reference": "82b6c62b959f642d000456f08c6d219d749215b3", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "shasum": "" }, "require": { @@ -5875,7 +5615,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.2.7" + "source": "https://github.com/symfony/filesystem/tree/v6.3.1" }, "funding": [ { @@ -5891,7 +5631,7 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-06-01T08:30:39+00:00" }, { "name": "symfony/finder", @@ -5959,16 +5699,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.3.0", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "718a97ed430d34e5c568ea2c44eab708c6efbefb" + "reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/718a97ed430d34e5c568ea2c44eab708c6efbefb", - "reference": "718a97ed430d34e5c568ea2c44eab708c6efbefb", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/59d1837d5d992d16c2628cd0d6b76acf8d69b33e", + "reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e", "shasum": "" }, "require": { @@ -5978,12 +5718,12 @@ "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.2" + "symfony/cache": "<6.3" }, "require-dev": { - "doctrine/dbal": "^2.13.1|^3.0", + "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^5.4|^6.0", + "symfony/cache": "^6.3", "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", @@ -6016,7 +5756,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.0" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.7" }, "funding": [ { @@ -6032,24 +5772,25 @@ "type": "tidelift" } ], - "time": "2023-05-19T12:46:45+00:00" + "time": "2023-10-28T23:55:27+00:00" }, { "name": "symfony/mime", - "version": "v6.3.0", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad" + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", - "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", + "url": "https://api.github.com/repos/symfony/mime/zipball/d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -6058,7 +5799,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2" + "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -6067,7 +5808,7 @@ "symfony/dependency-injection": "^5.4|^6.0", "symfony/property-access": "^5.4|^6.0", "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "^6.2" + "symfony/serializer": "~6.2.13|^6.3.2" }, "type": "library", "autoload": { @@ -6099,7 +5840,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.3.0" + "source": "https://github.com/symfony/mime/tree/v6.3.5" }, "funding": [ { @@ -6115,7 +5856,7 @@ "type": "tidelift" } ], - "time": "2023-04-28T15:57:00+00:00" + "time": "2023-09-29T06:59:36+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6282,16 +6023,16 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", "shasum": "" }, "require": { @@ -6305,7 +6046,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6349,7 +6090,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" }, "funding": [ { @@ -6365,7 +6106,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:30:37+00:00" }, { "name": "symfony/polyfill-intl-normalizer", @@ -6772,97 +6513,18 @@ ], "time": "2023-01-26T09:26:14+00:00" }, - { - "name": "symfony/polyfill-php81", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "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 backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.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": "2022-11-03T14:55:06+00:00" - }, { "name": "symfony/polyfill-php83", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "508c652ba3ccf69f8c97f251534f229791b52a57" + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/508c652ba3ccf69f8c97f251534f229791b52a57", - "reference": "508c652ba3ccf69f8c97f251534f229791b52a57", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", "shasum": "" }, "require": { @@ -6872,7 +6534,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6885,7 +6547,10 @@ ], "psr-4": { "Symfony\\Polyfill\\Php83\\": "" - } + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6910,7 +6575,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" }, "funding": [ { @@ -6926,25 +6591,24 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-08-16T06:22:46+00:00" }, { "name": "symfony/process", - "version": "v5.4.23", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "4b842fc4b61609e0a155a114082bd94e31e98287" + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/4b842fc4b61609e0a155a114082bd94e31e98287", - "reference": "4b842fc4b61609e0a155a114082bd94e31e98287", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -6972,7 +6636,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.23" + "source": "https://github.com/symfony/process/tree/v6.3.4" }, "funding": [ { @@ -6988,33 +6652,37 @@ "type": "tidelift" } ], - "time": "2023-04-18T13:50:24+00:00" + "time": "2023-08-07T10:39:22+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.3.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/container": "^2.0" + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, + "suggest": { + "symfony/service-implementation": "" + }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -7024,10 +6692,7 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7054,7 +6719,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" }, "funding": [ { @@ -7070,7 +6735,7 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2022-05-30T19:17:29+00:00" }, { "name": "symfony/string", @@ -7160,34 +6825,39 @@ }, { "name": "symfony/var-dumper", - "version": "v6.3.6", + "version": "v5.4.29", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97" + "reference": "6172e4ae3534d25ee9e07eb487c20be7760fcc65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/999ede244507c32b8e43aebaa10e9fce20de7c97", - "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6172e4ae3534d25ee9e07eb487c20be7760fcc65", + "reference": "6172e4ae3534d25ee9e07eb487c20be7760fcc65", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<4.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", "twig/twig": "^2.13|^3.0.4" }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, "bin": [ "Resources/bin/var-dump-server" ], @@ -7224,7 +6894,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.6" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.29" }, "funding": [ { @@ -7240,32 +6910,35 @@ "type": "tidelift" } ], - "time": "2023-10-12T18:45:56+00:00" + "time": "2023-09-12T10:09:58+00:00" }, { "name": "symfony/yaml", - "version": "v6.3.7", + "version": "v5.3.14", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "9758b6c69d179936435d0ffb577c3708d57e38a8" + "reference": "c441e9d2e340642ac8b951b753dea962d55b669d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/9758b6c69d179936435d0ffb577c3708d57e38a8", - "reference": "9758b6c69d179936435d0ffb577c3708d57e38a8", + "url": "https://api.github.com/repos/symfony/yaml/zipball/c441e9d2e340642ac8b951b753dea962d55b669d", + "reference": "c441e9d2e340642ac8b951b753dea962d55b669d", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "^1.8" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<4.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0" + "symfony/console": "^4.4|^5.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" }, "bin": [ "Resources/bin/yaml-lint" @@ -7296,7 +6969,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.3.7" + "source": "https://github.com/symfony/yaml/tree/v5.3.14" }, "funding": [ { @@ -7312,7 +6985,7 @@ "type": "tidelift" } ], - "time": "2023-10-28T23:31:00+00:00" + "time": "2022-01-26T16:05:39+00:00" }, { "name": "thecodingmachine/safe", @@ -7672,16 +7345,16 @@ }, { "name": "gitonomy/gitlib", - "version": "v1.3.7", + "version": "v1.3.8", "source": { "type": "git", "url": "https://github.com/gitonomy/gitlib.git", - "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7" + "reference": "9fea656e75ad6e3452feb2cac46a6c1239cd7f74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/00b57b79f02396aa4c7c163f76fe2bc48faebbb7", - "reference": "00b57b79f02396aa4c7c163f76fe2bc48faebbb7", + "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/9fea656e75ad6e3452feb2cac46a6c1239cd7f74", + "reference": "9fea656e75ad6e3452feb2cac46a6c1239cd7f74", "shasum": "" }, "require": { @@ -7735,7 +7408,7 @@ "description": "Library for accessing git", "support": { "issues": "https://github.com/gitonomy/gitlib/issues", - "source": "https://github.com/gitonomy/gitlib/tree/v1.3.7" + "source": "https://github.com/gitonomy/gitlib/tree/v1.3.8" }, "funding": [ { @@ -7743,20 +7416,20 @@ "type": "tidelift" } ], - "time": "2022-10-04T14:20:15+00:00" + "time": "2023-05-11T08:29:06+00:00" }, { "name": "pdepend/pdepend", - "version": "2.13.0", + "version": "2.15.1", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "31be7cd4f305f3f7b52af99c1cb13fc938d1cfad" + "reference": "d12f25bcdfb7754bea458a4a5cb159d55e9950d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/31be7cd4f305f3f7b52af99c1cb13fc938d1cfad", - "reference": "31be7cd4f305f3f7b52af99c1cb13fc938d1cfad", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/d12f25bcdfb7754bea458a4a5cb159d55e9950d0", + "reference": "d12f25bcdfb7754bea458a4a5cb159d55e9950d0", "shasum": "" }, "require": { @@ -7790,9 +7463,15 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", + "keywords": [ + "PHP Depend", + "PHP_Depend", + "dev", + "pdepend" + ], "support": { "issues": "https://github.com/pdepend/pdepend/issues", - "source": "https://github.com/pdepend/pdepend/tree/2.13.0" + "source": "https://github.com/pdepend/pdepend/tree/2.15.1" }, "funding": [ { @@ -7800,20 +7479,20 @@ "type": "tidelift" } ], - "time": "2023-02-28T20:56:15+00:00" + "time": "2023-09-28T12:00:56+00:00" }, { "name": "php-coveralls/php-coveralls", - "version": "v2.5.3", + "version": "v2.6.0", "source": { "type": "git", "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9" + "reference": "9e88d7d38e9eab7c675da674481784321ea7a9bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9d8243bbf0e053333692857c98fab7cfba0d60a9", - "reference": "9d8243bbf0e053333692857c98fab7cfba0d60a9", + "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9e88d7d38e9eab7c675da674481784321ea7a9bc", + "reference": "9e88d7d38e9eab7c675da674481784321ea7a9bc", "shasum": "" }, "require": { @@ -7881,28 +7560,28 @@ ], "support": { "issues": "https://github.com/php-coveralls/php-coveralls/issues", - "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.5.3" + "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.6.0" }, - "time": "2022-09-12T20:47:09+00:00" + "time": "2023-07-16T08:39:10+00:00" }, { "name": "phpmd/phpmd", - "version": "2.13.0", + "version": "2.14.1", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "dad0228156856b3ad959992f9748514fa943f3e3" + "reference": "442fc2c34edcd5198b442d8647c7f0aec3afabe8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/dad0228156856b3ad959992f9748514fa943f3e3", - "reference": "dad0228156856b3ad959992f9748514fa943f3e3", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/442fc2c34edcd5198b442d8647c7f0aec3afabe8", + "reference": "442fc2c34edcd5198b442d8647c7f0aec3afabe8", "shasum": "" }, "require": { "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", "ext-xml": "*", - "pdepend/pdepend": "^2.12.1", + "pdepend/pdepend": "^2.15.1", "php": ">=5.3.9" }, "require-dev": { @@ -7912,7 +7591,7 @@ "gregwar/rst": "^1.0", "mikey179/vfsstream": "^1.6.8", "phpunit/phpunit": "^4.8.36 || ^5.7.27", - "squizlabs/php_codesniffer": "^2.0" + "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2" }, "bin": [ "src/bin/phpmd" @@ -7949,6 +7628,7 @@ "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", "homepage": "https://phpmd.org/", "keywords": [ + "dev", "mess detection", "mess detector", "pdepend", @@ -7958,7 +7638,7 @@ "support": { "irc": "irc://irc.freenode.org/phpmd", "issues": "https://github.com/phpmd/phpmd/issues", - "source": "https://github.com/phpmd/phpmd/tree/2.13.0" + "source": "https://github.com/phpmd/phpmd/tree/2.14.1" }, "funding": [ { @@ -7966,7 +7646,7 @@ "type": "tidelift" } ], - "time": "2022-09-10T08:44:15+00:00" + "time": "2023-09-28T13:07:44+00:00" }, { "name": "sebastian/phpcpd", @@ -8089,37 +7769,35 @@ }, { "name": "symfony/config", - "version": "v6.2.7", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "249271da6f545d6579e0663374f8249a80be2893" + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/249271da6f545d6579e0663374f8249a80be2893", - "reference": "249271da6f545d6579e0663374f8249a80be2893", + "url": "https://api.github.com/repos/symfony/config/zipball/b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/filesystem": "^5.4|^6.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<5.4" + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" }, "require-dev": { "symfony/event-dispatcher": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, "type": "library", "autoload": { "psr-4": { @@ -8146,7 +7824,7 @@ "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/v6.2.7" + "source": "https://github.com/symfony/config/tree/v6.3.2" }, "funding": [ { @@ -8162,49 +7840,51 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-07-19T20:22:16+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.2.8", + "version": "v5.4.29", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "b6195feacceb88fc58a02b69522b569e4c6188ac" + "reference": "338638ed8c9d5c7fcb136a73f5c7043465ae2f05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b6195feacceb88fc58a02b69522b569e4c6188ac", - "reference": "b6195feacceb88fc58a02b69522b569e4c6188ac", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/338638ed8c9d5c7fcb136a73f5c7043465ae2f05", + "reference": "338638ed8c9d5c7fcb136a73f5c7043465ae2f05", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", + "php": ">=7.2.5", + "psr/container": "^1.1.1", "symfony/deprecation-contracts": "^2.1|^3", - "symfony/service-contracts": "^1.1.6|^2.0|^3.0", - "symfony/var-exporter": "^6.2.7" + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", + "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { "ext-psr": "<1.1|>=2", - "symfony/config": "<6.1", - "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.2", - "symfony/yaml": "<5.4" + "symfony/config": "<5.3", + "symfony/finder": "<4.4", + "symfony/proxy-manager-bridge": "<4.4", + "symfony/yaml": "<4.4.26" }, "provide": { - "psr/container-implementation": "1.1|2.0", - "symfony/service-implementation": "1.1|2.0|3.0" + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0|2.0" }, "require-dev": { - "symfony/config": "^6.1", - "symfony/expression-language": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" + "symfony/config": "^5.3|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4.26|^5.0|^6.0" }, "suggest": { "symfony/config": "", "symfony/expression-language": "For using expressions in service container configuration", "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", "symfony/yaml": "" }, "type": "library", @@ -8233,7 +7913,7 @@ "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/v6.2.8" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.29" }, "funding": [ { @@ -8249,33 +7929,44 @@ "type": "tidelift" } ], - "time": "2023-03-30T13:35:57+00:00" + "time": "2023-09-20T06:23:43+00:00" }, { - "name": "symfony/stopwatch", - "version": "v6.2.7", + "name": "symfony/polyfill-php81", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", - "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/service-contracts": "^1|^2|^3" + "php": ">=7.1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" + "Symfony\\Polyfill\\Php81\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -8284,18 +7975,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a way to profile code", + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.2.7" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" }, "funding": [ { @@ -8311,32 +8008,30 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { - "name": "symfony/var-exporter", - "version": "v6.2.8", + "name": "symfony/stopwatch", + "version": "v6.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "8302bb670204500d492c6b8c595ee9a27da62cd6" + "url": "https://github.com/symfony/stopwatch.git", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8302bb670204500d492c6b8c595ee9a27da62cd6", - "reference": "8302bb670204500d492c6b8c595ee9a27da62cd6", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", "shasum": "" }, "require": { - "php": ">=8.1" - }, - "require-dev": { - "symfony/var-dumper": "^5.4|^6.0" + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\VarExporter\\": "" + "Symfony\\Component\\Stopwatch\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -8348,28 +8043,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "description": "Provides a way to profile code", "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.2.8" + "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" }, "funding": [ { @@ -8385,7 +8070,7 @@ "type": "tidelift" } ], - "time": "2023-03-14T15:48:45+00:00" + "time": "2023-02-16T10:14:28+00:00" } ], "aliases": [], From 63ed068fc70a69d7f50bec65b83d09a6e264b26d Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Fri, 10 Nov 2023 11:08:14 +0530 Subject: [PATCH 540/674] ACQE-5710 : Composer update --- composer.json | 2 +- composer.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 524732be7..10d650f79 100755 --- a/composer.json +++ b/composer.json @@ -43,7 +43,7 @@ "doctrine/annotations": "^2.0" }, "require-dev": { - "brainmaestro/composer-git-hooks": "^2.3.1", + "brainmaestro/composer-git-hooks": "^2.8.5", "codacy/coverage": "^1.4", "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", diff --git a/composer.lock b/composer.lock index a3ee7c763..c4763d104 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": "c0a80070ef1549d7b206d53e7ecd64b0", + "content-hash": "e31af1221198754d04cf0d46dbe79ea7", "packages": [ { "name": "allure-framework/allure-codeception", From 062952411cd54814f852b50b40c41c0388153e06 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Fri, 10 Nov 2023 11:59:39 +0530 Subject: [PATCH 541/674] ACQE-5710 : Upgrade Components --- composer.json | 2 +- composer.lock | 738 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 504 insertions(+), 236 deletions(-) diff --git a/composer.json b/composer.json index 10d650f79..659a1c06c 100755 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "nikic/php-parser": "^4.4", "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0", - "symfony/console": "^4.4||^6.0", + "symfony/console": "^5.4||^6.0", "symfony/string": "^5.4||^6.0", "symfony/dotenv": "^5.3||^6.0", "symfony/finder": "^5.0||^6.0", diff --git a/composer.lock b/composer.lock index c4763d104..145ed4015 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": "e31af1221198754d04cf0d46dbe79ea7", + "content-hash": "5994a9d0b30d516dff118ec9ee987a6b", "packages": [ { "name": "allure-framework/allure-codeception", @@ -1050,41 +1050,123 @@ ], "time": "2023-08-30T09:31:38+00:00" }, + { + "name": "composer/class-map-generator", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/953cc4ea32e0c31f2185549c7d216d7921f03da9", + "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9", + "shasum": "" + }, + "require": { + "composer/pcre": "^2.1 || ^3.1", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.6", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/filesystem": "^5.4 || ^6", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.1.0" + }, + "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": "2023-06-30T13:58:57+00:00" + }, { "name": "composer/composer", - "version": "2.2.22", + "version": "2.6.5", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "fedc76ee3f3e3d57d20993b9f4c5fcfb2f8596aa" + "reference": "4b0fe89db9e65b1e64df633a992e70a7a215ab33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/fedc76ee3f3e3d57d20993b9f4c5fcfb2f8596aa", - "reference": "fedc76ee3f3e3d57d20993b9f4c5fcfb2f8596aa", + "url": "https://api.github.com/repos/composer/composer/zipball/4b0fe89db9e65b1e64df633a992e70a7a215ab33", + "reference": "4b0fe89db9e65b1e64df633a992e70a7a215ab33", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", + "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^1.0", - "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^2.0 || ^3.0", + "composer/pcre": "^2.1 || ^3.1", + "composer/semver": "^3.2.5", + "composer/spdx-licenses": "^1.5.7", + "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0 || ^2.0", - "react/promise": "^1.2 || ^2.7", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "react/promise": "^2.8 || ^3", "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" + "seld/phar-utils": "^1.2", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.11 || ^6.0.11 || ^7", + "symfony/filesystem": "^5.4 || ^6.0 || ^7", + "symfony/finder": "^5.4 || ^6.0 || ^7", + "symfony/polyfill-php73": "^1.24", + "symfony/polyfill-php80": "^1.24", + "symfony/polyfill-php81": "^1.24", + "symfony/process": "^5.4 || ^6.0 || ^7" }, "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + "phpstan/phpstan": "^1.9.3", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1", + "phpstan/phpstan-symfony": "^1.2.10", + "symfony/phpunit-bridge": "^6.0 || ^7" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -1097,12 +1179,17 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.2-dev" + "dev-main": "2.6-dev" + }, + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] } }, "autoload": { "psr-4": { - "Composer\\": "src/Composer" + "Composer\\": "src/Composer/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1131,7 +1218,8 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.2.22" + "security": "https://github.com/composer/composer/security/policy", + "source": "https://github.com/composer/composer/tree/2.6.5" }, "funding": [ { @@ -1147,7 +1235,7 @@ "type": "tidelift" } ], - "time": "2023-09-29T08:53:46+00:00" + "time": "2023-10-06T08:11:52+00:00" }, { "name": "composer/metadata-minifier", @@ -1220,30 +1308,30 @@ }, { "name": "composer/pcre", - "version": "1.0.1", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560" + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560", - "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560", + "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.3", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^4.2 || ^5" + "symfony/phpunit-bridge": "^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -1271,7 +1359,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/1.0.1" + "source": "https://github.com/composer/pcre/tree/3.1.1" }, "funding": [ { @@ -1287,7 +1375,7 @@ "type": "tidelift" } ], - "time": "2022-01-21T20:24:37+00:00" + "time": "2023-10-11T07:11:09+00:00" }, { "name": "composer/semver", @@ -3331,22 +3419,27 @@ }, { "name": "psr/container", - "version": "1.1.2", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -3373,9 +3466,59 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" }, { "name": "psr/http-client", @@ -3894,23 +4037,24 @@ }, { "name": "react/promise", - "version": "v2.10.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" + "reference": "c86753c76fd3be465d93b308f18d189f01a22be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", - "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "url": "https://api.github.com/repos/reactphp/promise/zipball/c86753c76fd3be465d93b308f18d189f01a22be4", + "reference": "c86753c76fd3be465d93b308f18d189f01a22be4", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" + "phpstan/phpstan": "1.10.20 || 1.4.10", + "phpunit/phpunit": "^9.5 || ^7.5" }, "type": "library", "autoload": { @@ -3954,7 +4098,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.10.0" + "source": "https://github.com/reactphp/promise/tree/v3.0.0" }, "funding": [ { @@ -3962,7 +4106,7 @@ "type": "open_collective" } ], - "time": "2023-05-02T15:15:43+00:00" + "time": "2023-07-11T16:12:49+00:00" }, { "name": "sebastian/cli-parser", @@ -5040,6 +5184,67 @@ }, "time": "2022-08-31T10:31:18+00:00" }, + { + "name": "seld/signal-handler", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], + "support": { + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" + }, + "time": "2023-09-03T09:24:00+00:00" + }, { "name": "spomky-labs/otphp", "version": "v10.0.3", @@ -5117,43 +5322,46 @@ }, { "name": "symfony/console", - "version": "v4.4.49", + "version": "v5.4.28", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "33fa45ffc81fdcc1ca368d4946da859c8cdb58d9" + "reference": "f4f71842f24c2023b91237c72a365306f3c58827" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/33fa45ffc81fdcc1ca368d4946da859c8cdb58d9", - "reference": "33fa45ffc81fdcc1ca368d4946da859c8cdb58d9", + "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", + "reference": "f4f71842f24c2023b91237c72a365306f3c58827", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", - "symfony/process": "<3.3" + "symfony/process": "<4.4" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5186,8 +5394,14 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/console/tree/v4.4.49" + "source": "https://github.com/symfony/console/tree/v5.4.28" }, "funding": [ { @@ -5203,7 +5417,7 @@ "type": "tidelift" } ], - "time": "2022-11-05T17:10:16+00:00" + "time": "2023-08-07T06:12:30+00:00" }, { "name": "symfony/css-selector", @@ -5272,25 +5486,25 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5319,7 +5533,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { @@ -5335,24 +5549,28 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/dotenv", - "version": "v6.0.19", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "9cee123707e689f7e06c09624c145d206468bcf2" + "reference": "7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/9cee123707e689f7e06c09624c145d206468bcf2", - "reference": "9cee123707e689f7e06c09624c145d206468bcf2", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e", + "reference": "7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e", "shasum": "" }, "require": { - "php": ">=8.0.2" + "php": ">=8.1" + }, + "conflict": { + "symfony/console": "<5.4", + "symfony/process": "<5.4" }, "require-dev": { "symfony/console": "^5.4|^6.0", @@ -5389,7 +5607,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.0.19" + "source": "https://github.com/symfony/dotenv/tree/v6.3.7" }, "funding": [ { @@ -5405,47 +5623,43 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:36:10+00:00" + "time": "2023-10-26T18:15:14+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.44", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a" + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1e866e9e5c1b22168e0ce5f0b467f19bba61266a", - "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<3.4" + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "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", - "symfony/stopwatch": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -5473,7 +5687,7 @@ "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.44" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" }, "funding": [ { @@ -5489,33 +5703,30 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2023-07-06T06:56:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.13", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e" + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/1d5cd762abaa6b2a4169d3e77610193a7157129e", - "reference": "1d5cd762abaa6b2a4169d3e77610193a7157129e", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", "shasum": "" }, "require": { - "php": ">=7.1.3" - }, - "suggest": { - "psr/event-dispatcher": "", - "symfony/event-dispatcher-implementation": "" + "php": ">=8.1", + "psr/event-dispatcher": "^1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.1-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5552,7 +5763,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.13" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" }, "funding": [ { @@ -5568,7 +5779,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:41:36+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/filesystem", @@ -6513,6 +6724,85 @@ ], "time": "2023-01-26T09:26:14+00:00" }, + { + "name": "symfony/polyfill-php81", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "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 backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.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": "2023-01-26T09:26:14+00:00" + }, { "name": "symfony/polyfill-php83", "version": "v1.28.0", @@ -6656,33 +6946,29 @@ }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.1", + "psr/container": "^2.0" }, "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6692,7 +6978,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6719,7 +7008,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -6735,7 +7024,7 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/string", @@ -6825,39 +7114,34 @@ }, { "name": "symfony/var-dumper", - "version": "v5.4.29", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "6172e4ae3534d25ee9e07eb487c20be7760fcc65" + "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6172e4ae3534d25ee9e07eb487c20be7760fcc65", - "reference": "6172e4ae3534d25ee9e07eb487c20be7760fcc65", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/999ede244507c32b8e43aebaa10e9fce20de7c97", + "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<4.4" + "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/uid": "^5.1|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, "bin": [ "Resources/bin/var-dump-server" ], @@ -6894,7 +7178,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.29" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.6" }, "funding": [ { @@ -6910,35 +7194,32 @@ "type": "tidelift" } ], - "time": "2023-09-12T10:09:58+00:00" + "time": "2023-10-12T18:45:56+00:00" }, { "name": "symfony/yaml", - "version": "v5.3.14", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "c441e9d2e340642ac8b951b753dea962d55b669d" + "reference": "9758b6c69d179936435d0ffb577c3708d57e38a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/c441e9d2e340642ac8b951b753dea962d55b669d", - "reference": "c441e9d2e340642ac8b951b753dea962d55b669d", + "url": "https://api.github.com/repos/symfony/yaml/zipball/9758b6c69d179936435d0ffb577c3708d57e38a8", + "reference": "9758b6c69d179936435d0ffb577c3708d57e38a8", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<4.4" + "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^4.4|^5.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "symfony/console": "^5.4|^6.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -6969,7 +7250,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.3.14" + "source": "https://github.com/symfony/yaml/tree/v6.3.7" }, "funding": [ { @@ -6985,7 +7266,7 @@ "type": "tidelift" } ], - "time": "2022-01-26T16:05:39+00:00" + "time": "2023-10-28T23:31:00+00:00" }, { "name": "thecodingmachine/safe", @@ -7844,48 +8125,40 @@ }, { "name": "symfony/dependency-injection", - "version": "v5.4.29", + "version": "v6.3.5", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "338638ed8c9d5c7fcb136a73f5c7043465ae2f05" + "reference": "2ed62b3bf98346e1f45529a7b6be2196739bb993" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/338638ed8c9d5c7fcb136a73f5c7043465ae2f05", - "reference": "338638ed8c9d5c7fcb136a73f5c7043465ae2f05", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2ed62b3bf98346e1f45529a7b6be2196739bb993", + "reference": "2ed62b3bf98346e1f45529a7b6be2196739bb993", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22", - "symfony/service-contracts": "^1.1.6|^2" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.2.10" }, "conflict": { "ext-psr": "<1.1|>=2", - "symfony/config": "<5.3", - "symfony/finder": "<4.4", - "symfony/proxy-manager-bridge": "<4.4", - "symfony/yaml": "<4.4.26" + "symfony/config": "<6.1", + "symfony/finder": "<5.4", + "symfony/proxy-manager-bridge": "<6.3", + "symfony/yaml": "<5.4" }, "provide": { - "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0|2.0" + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/config": "^5.3|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4.26|^5.0|^6.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" + "symfony/config": "^6.1", + "symfony/expression-language": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -7913,7 +8186,7 @@ "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/v5.4.29" + "source": "https://github.com/symfony/dependency-injection/tree/v6.3.5" }, "funding": [ { @@ -7929,44 +8202,33 @@ "type": "tidelift" } ], - "time": "2023-09-20T06:23:43+00:00" + "time": "2023-09-25T16:46:40+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.28.0", + "name": "symfony/stopwatch", + "version": "v6.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + "url": "https://github.com/symfony/stopwatch.git", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" + "Symfony\\Component\\Stopwatch\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -7975,24 +8237,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "description": "Provides a way to profile code", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" + "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" }, "funding": [ { @@ -8008,30 +8264,32 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2023-02-16T10:14:28+00:00" }, { - "name": "symfony/stopwatch", - "version": "v6.3.0", + "name": "symfony/var-exporter", + "version": "v6.3.6", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" + "url": "https://github.com/symfony/var-exporter.git", + "reference": "374d289c13cb989027274c86206ddc63b16a2441" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/374d289c13cb989027274c86206ddc63b16a2441", + "reference": "374d289c13cb989027274c86206ddc63b16a2441", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/service-contracts": "^2.5|^3" + "php": ">=8.1" + }, + "require-dev": { + "symfony/var-dumper": "^5.4|^6.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" + "Symfony\\Component\\VarExporter\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -8043,18 +8301,28 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a way to profile code", + "description": "Allows exporting any serializable PHP data structure to plain PHP code", "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" + "source": "https://github.com/symfony/var-exporter/tree/v6.3.6" }, "funding": [ { @@ -8070,7 +8338,7 @@ "type": "tidelift" } ], - "time": "2023-02-16T10:14:28+00:00" + "time": "2023-10-13T09:16:49+00:00" } ], "aliases": [], From 88c7b2c53ec7cb45bd23431d3efdf9bcea4ece93 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 14 Nov 2023 11:36:38 +0530 Subject: [PATCH 542/674] ACQE-5710 : Making version flexible --- composer.json | 2 +- composer.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 659a1c06c..780eb6f69 100755 --- a/composer.json +++ b/composer.json @@ -31,7 +31,7 @@ "mustache/mustache": "~2.5", "nikic/php-parser": "^4.4", "php-webdriver/webdriver": "^1.14.0", - "spomky-labs/otphp": "^10.0", + "spomky-labs/otphp": "^10.0||^11.0", "symfony/console": "^5.4||^6.0", "symfony/string": "^5.4||^6.0", "symfony/dotenv": "^5.3||^6.0", diff --git a/composer.lock b/composer.lock index 145ed4015..0b11cc951 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": "5994a9d0b30d516dff118ec9ee987a6b", + "content-hash": "d57bef35c58fb00332d126692b4e52e7", "packages": [ { "name": "allure-framework/allure-codeception", From c1b267287230d82ba189c286432f63c77651ff31 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Wed, 15 Nov 2023 10:09:37 +0530 Subject: [PATCH 543/674] PHP UNIT Upgrade --- composer.json | 10 +- composer.lock | 710 ++++++++---------- .../AwsSecretsManagerStorageTest.php | 2 +- dev/tests/unit/Util/TestLoggingUtil.php | 2 +- 4 files changed, 306 insertions(+), 418 deletions(-) diff --git a/composer.json b/composer.json index 780eb6f69..223ee5567 100755 --- a/composer.json +++ b/composer.json @@ -17,12 +17,12 @@ "ext-json": "*", "ext-openssl": "*", "allure-framework/allure-codeception": "^2.1", - "allure-framework/allure-phpunit": "^2", + "allure-framework/allure-phpunit": "^3", "aws/aws-sdk-php": "^3.132", "codeception/codeception": "^5.0", "codeception/module-asserts": "^3.0", - "codeception/module-sequence": "^3.0", - "codeception/module-webdriver": "^3.0", + "codeception/module-sequence": "dev-master", + "codeception/module-webdriver": "^4.0", "composer/composer": "^1.9||^2.0,!=2.2.16", "csharpru/vault-php": "^4.2.1", "guzzlehttp/guzzle": "^7.3.0", @@ -47,8 +47,8 @@ "codacy/coverage": "^1.4", "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", - "phpunit/phpunit": "^9.5", - "sebastian/phpcpd": "~6.0.0", + "phpunit/phpunit": "^10.0", + "sebastian/phpcpd": "dev-main", "squizlabs/php_codesniffer": "~3.7.0" }, "suggest": { diff --git a/composer.lock b/composer.lock index 0b11cc951..73a14949d 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": "d57bef35c58fb00332d126692b4e52e7", + "content-hash": "a1b5e9c7e58dff74f52587407695072f", "packages": [ { "name": "allure-framework/allure-codeception", @@ -145,31 +145,32 @@ }, { "name": "allure-framework/allure-phpunit", - "version": "v2.1.0", + "version": "v3.0.1", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-phpunit.git", - "reference": "a08e0092cdddfc8ead1953cf5bddf80b48595109" + "reference": "1b800cdf612d4ec6e916e959a95604c91f0ba7e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-phpunit/zipball/a08e0092cdddfc8ead1953cf5bddf80b48595109", - "reference": "a08e0092cdddfc8ead1953cf5bddf80b48595109", + "url": "https://api.github.com/repos/allure-framework/allure-phpunit/zipball/1b800cdf612d4ec6e916e959a95604c91f0ba7e9", + "reference": "1b800cdf612d4ec6e916e959a95604c91f0ba7e9", "shasum": "" }, "require": { "allure-framework/allure-php-commons": "^2", - "php": "^8", - "phpunit/phpunit": "^9" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "phpunit/phpunit": "^10" }, "conflict": { - "amphp/byte-stream": "<1.5.1" + "amphp/byte-stream": "<1.5.1", + "brianium/paratest": "<7.0.3" }, "require-dev": { - "brianium/paratest": "^6.8", + "brianium/paratest": "^7", "psalm/plugin-phpunit": "^0.18.4", - "squizlabs/php_codesniffer": "^3.7.1", - "vimeo/psalm": "^5.4" + "squizlabs/php_codesniffer": "^3.7.2", + "vimeo/psalm": "^5.15" }, "type": "library", "autoload": { @@ -209,7 +210,7 @@ "issues": "https://github.com/allure-framework/allure-phpunit/issues", "source": "https://github.com/allure-framework/allure-phpunit" }, - "time": "2023-01-12T14:27:20+00:00" + "time": "2023-11-10T15:32:58+00:00" }, { "name": "aws/aws-crt-php", @@ -827,7 +828,7 @@ }, { "name": "codeception/module-sequence", - "version": "3.0.0", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/Codeception/module-sequence.git", @@ -843,6 +844,7 @@ "codeception/codeception": "^5.0", "php": "^8.0" }, + "default-branch": true, "type": "library", "autoload": { "files": [ @@ -874,27 +876,27 @@ }, { "name": "codeception/module-webdriver", - "version": "3.2.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/Codeception/module-webdriver.git", - "reference": "59b6fe426dddbe889c23593f8698c52e08bba6e9" + "reference": "c092fa4f686381d0621407c0136d608c2b419b85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/59b6fe426dddbe889c23593f8698c52e08bba6e9", - "reference": "59b6fe426dddbe889c23593f8698c52e08bba6e9", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/c092fa4f686381d0621407c0136d608c2b419b85", + "reference": "c092fa4f686381d0621407c0136d608c2b419b85", "shasum": "" }, "require": { - "codeception/codeception": "^5.0.0-RC2", + "codeception/codeception": "^5.0.8", "codeception/lib-web": "^1.0.1", "codeception/stub": "^4.0", "ext-json": "*", "ext-mbstring": "*", - "php": "^8.0", + "php": "^8.1", "php-webdriver/webdriver": "^1.8.0", - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^10.0" }, "suggest": { "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" @@ -929,9 +931,9 @@ ], "support": { "issues": "https://github.com/Codeception/module-webdriver/issues", - "source": "https://github.com/Codeception/module-webdriver/tree/3.2.1" + "source": "https://github.com/Codeception/module-webdriver/tree/4.0.0" }, - "time": "2023-02-03T21:46:32+00:00" + "time": "2023-02-03T21:52:27+00:00" }, { "name": "codeception/stub", @@ -1742,76 +1744,6 @@ }, "time": "2023-02-02T22:02:53+00:00" }, - { - "name": "doctrine/instantiator", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^11", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "^1.9.4", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5.27", - "vimeo/psalm": "^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/2.0.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": "2022-12-30T00:23:10+00:00" - }, { "name": "doctrine/lexer", "version": "3.0.0", @@ -2948,16 +2880,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.29", + "version": "10.1.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" + "reference": "355324ca4980b8916c18b9db29f3ef484078f26e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", - "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/355324ca4980b8916c18b9db29f3ef484078f26e", + "reference": "355324ca4980b8916c18b9db29f3ef484078f26e", "shasum": "" }, "require": { @@ -2965,18 +2897,18 @@ "ext-libxml": "*", "ext-xmlwriter": "*", "nikic/php-parser": "^4.15", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -2985,7 +2917,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "10.1-dev" } }, "autoload": { @@ -3014,7 +2946,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.7" }, "funding": [ { @@ -3022,32 +2954,32 @@ "type": "github" } ], - "time": "2023-09-19T04:57:46+00:00" + "time": "2023-10-04T15:34:17+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.6", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -3074,7 +3006,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" }, "funding": [ { @@ -3082,28 +3015,28 @@ "type": "github" } ], - "time": "2021-12-02T12:48:52+00:00" + "time": "2023-08-31T06:24:48+00:00" }, { "name": "phpunit/php-invoker", - "version": "3.1.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-pcntl": "*" @@ -3111,7 +3044,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -3137,7 +3070,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" }, "funding": [ { @@ -3145,32 +3078,32 @@ "type": "github" } ], - "time": "2020-09-28T05:58:55+00:00" + "time": "2023-02-03T06:56:09+00:00" }, { "name": "phpunit/php-text-template", - "version": "2.0.4", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -3196,7 +3129,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" }, "funding": [ { @@ -3204,32 +3138,32 @@ "type": "github" } ], - "time": "2020-10-26T05:33:50+00:00" + "time": "2023-08-31T14:07:24+00:00" }, { "name": "phpunit/php-timer", - "version": "5.0.3", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -3255,7 +3189,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" }, "funding": [ { @@ -3263,24 +3197,23 @@ "type": "github" } ], - "time": "2020-10-26T13:16:10+00:00" + "time": "2023-02-03T06:57:52+00:00" }, { "name": "phpunit/phpunit", - "version": "9.6.13", + "version": "10.4.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" + "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", - "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", + "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -3290,27 +3223,26 @@ "myclabs/deep-copy": "^1.10.1", "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.28", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", - "sebastian/version": "^3.0.2" + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.5", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.1", + "sebastian/global-state": "^6.0.1", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" }, "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "ext-soap": "To be able to generate mocks based on WSDL files" }, "bin": [ "phpunit" @@ -3318,7 +3250,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.6-dev" + "dev-main": "10.4-dev" } }, "autoload": { @@ -3350,7 +3282,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.4.2" }, "funding": [ { @@ -3366,7 +3298,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T05:39:22+00:00" + "time": "2023-10-26T07:21:45+00:00" }, { "name": "psr/cache", @@ -4110,28 +4042,28 @@ }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -4154,7 +4086,7 @@ "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" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" }, "funding": [ { @@ -4162,32 +4094,32 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2023-02-03T06:58:15+00:00" }, { "name": "sebastian/code-unit", - "version": "1.0.8", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -4210,7 +4142,7 @@ "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" + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" }, "funding": [ { @@ -4218,32 +4150,32 @@ "type": "github" } ], - "time": "2020-10-26T13:08:54+00:00" + "time": "2023-02-03T06:58:43+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -4265,7 +4197,7 @@ "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" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" }, "funding": [ { @@ -4273,34 +4205,36 @@ "type": "github" } ], - "time": "2020-09-28T05:30:19+00:00" + "time": "2023-02-03T06:59:15+00:00" }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -4339,7 +4273,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" }, "funding": [ { @@ -4347,33 +4282,33 @@ "type": "github" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2023-08-14T13:18:12+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" + "nikic/php-parser": "^4.10", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.1-dev" } }, "autoload": { @@ -4396,7 +4331,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" }, "funding": [ { @@ -4404,33 +4340,33 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-09-28T11:50:59+00:00" }, { "name": "sebastian/diff", - "version": "4.0.5", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3", + "phpunit/phpunit": "^10.0", "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -4462,7 +4398,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" }, "funding": [ { @@ -4470,27 +4407,27 @@ "type": "github" } ], - "time": "2023-05-07T05:35:17+00:00" + "time": "2023-05-01T07:48:21+00:00" }, { "name": "sebastian/environment", - "version": "5.1.5", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-posix": "*" @@ -4498,7 +4435,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -4517,7 +4454,7 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", @@ -4525,7 +4462,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" }, "funding": [ { @@ -4533,34 +4471,34 @@ "type": "github" } ], - "time": "2023-02-03T06:03:51+00:00" + "time": "2023-04-11T05:39:26+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -4602,7 +4540,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" }, "funding": [ { @@ -4610,38 +4549,35 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2023-09-24T13:22:09+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.6", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bde739e7565280bda77be70044ac1047bc007e34" + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", - "reference": "bde739e7565280bda77be70044ac1047bc007e34", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -4666,7 +4602,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" }, "funding": [ { @@ -4674,33 +4611,33 @@ "type": "github" } ], - "time": "2023-08-02T09:26:13+00:00" + "time": "2023-07-19T07:19:23+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", - "php": ">=7.3" + "nikic/php-parser": "^4.10", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -4723,7 +4660,8 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" }, "funding": [ { @@ -4731,34 +4669,34 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-08-31T09:25:50+00:00" }, { "name": "sebastian/object-enumerator", - "version": "4.0.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -4780,7 +4718,7 @@ "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" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" }, "funding": [ { @@ -4788,32 +4726,32 @@ "type": "github" } ], - "time": "2020-10-26T13:12:34+00:00" + "time": "2023-02-03T07:08:32+00:00" }, { "name": "sebastian/object-reflector", - "version": "2.0.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -4835,7 +4773,7 @@ "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" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" }, "funding": [ { @@ -4843,32 +4781,32 @@ "type": "github" } ], - "time": "2020-10-26T13:14:26+00:00" + "time": "2023-02-03T07:06:18+00:00" }, { "name": "sebastian/recursion-context", - "version": "4.0.5", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -4898,62 +4836,7 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:07:39+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "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" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" }, "funding": [ { @@ -4961,32 +4844,32 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2023-02-03T07:05:40+00:00" }, { "name": "sebastian/type", - "version": "3.2.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -5009,7 +4892,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" }, "funding": [ { @@ -5017,29 +4900,29 @@ "type": "github" } ], - "time": "2023-02-03T06:13:03+00:00" + "time": "2023-02-03T07:10:45+00:00" }, { "name": "sebastian/version", - "version": "3.0.2", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -5062,7 +4945,7 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" }, "funding": [ { @@ -5070,7 +4953,7 @@ "type": "github" } ], - "time": "2020-09-28T06:39:44+00:00" + "time": "2023-02-07T11:34:05+00:00" }, { "name": "seld/jsonlint", @@ -5322,16 +5205,16 @@ }, { "name": "symfony/console", - "version": "v5.4.28", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827" + "reference": "11ac5f154e0e5c4c77af83ad11ead9165280b92a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827", + "url": "https://api.github.com/repos/symfony/console/zipball/11ac5f154e0e5c4c77af83ad11ead9165280b92a", + "reference": "11ac5f154e0e5c4c77af83ad11ead9165280b92a", "shasum": "" }, "require": { @@ -5401,7 +5284,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.28" + "source": "https://github.com/symfony/console/tree/v5.4.31" }, "funding": [ { @@ -5417,7 +5300,7 @@ "type": "tidelift" } ], - "time": "2023-08-07T06:12:30+00:00" + "time": "2023-10-31T07:58:33+00:00" }, { "name": "symfony/css-selector", @@ -7028,16 +6911,16 @@ }, { "name": "symfony/string", - "version": "v6.3.5", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339" + "reference": "13880a87790c76ef994c91e87efb96134522577a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/13d76d0fb049051ed12a04bef4f9de8715bea339", - "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339", + "url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a", + "reference": "13880a87790c76ef994c91e87efb96134522577a", "shasum": "" }, "require": { @@ -7094,7 +6977,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.5" + "source": "https://github.com/symfony/string/tree/v6.3.8" }, "funding": [ { @@ -7110,20 +6993,20 @@ "type": "tidelift" } ], - "time": "2023-09-18T10:38:32+00:00" + "time": "2023-11-09T08:28:21+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.3.6", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97" + "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/999ede244507c32b8e43aebaa10e9fce20de7c97", - "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/81acabba9046550e89634876ca64bfcd3c06aa0a", + "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a", "shasum": "" }, "require": { @@ -7178,7 +7061,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.6" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.8" }, "funding": [ { @@ -7194,20 +7077,20 @@ "type": "tidelift" } ], - "time": "2023-10-12T18:45:56+00:00" + "time": "2023-11-08T10:42:36+00:00" }, { "name": "symfony/yaml", - "version": "v6.3.7", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "9758b6c69d179936435d0ffb577c3708d57e38a8" + "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/9758b6c69d179936435d0ffb577c3708d57e38a8", - "reference": "9758b6c69d179936435d0ffb577c3708d57e38a8", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3493af8a8dad7fa91c77fa473ba23ecd95334a92", + "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92", "shasum": "" }, "require": { @@ -7250,7 +7133,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.3.7" + "source": "https://github.com/symfony/yaml/tree/v6.3.8" }, "funding": [ { @@ -7266,7 +7149,7 @@ "type": "tidelift" } ], - "time": "2023-10-28T23:31:00+00:00" + "time": "2023-11-06T10:58:05+00:00" }, { "name": "thecodingmachine/safe", @@ -7931,33 +7814,35 @@ }, { "name": "sebastian/phpcpd", - "version": "6.0.3", + "version": "dev-main", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpcpd.git", - "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176" + "reference": "7724245f9d3aeae612efdc66925cf0f3f70f9a61" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/f3683aa0db2e8e09287c2bb33a595b2873ea9176", - "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176", + "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/7724245f9d3aeae612efdc66925cf0f3f70f9a61", + "reference": "7724245f9d3aeae612efdc66925cf0f3f70f9a61", "shasum": "" }, "require": { "ext-dom": "*", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0", - "phpunit/php-timer": "^5.0", - "sebastian/cli-parser": "^1.0", - "sebastian/version": "^3.0" + "ext-mbstring": "*", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/version": "^4.0" }, + "default-branch": true, "bin": [ "phpcpd" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -7980,7 +7865,7 @@ "homepage": "https://github.com/sebastianbergmann/phpcpd", "support": { "issues": "https://github.com/sebastianbergmann/phpcpd/issues", - "source": "https://github.com/sebastianbergmann/phpcpd/tree/6.0.3" + "source": "https://github.com/sebastianbergmann/phpcpd/tree/main" }, "funding": [ { @@ -7989,7 +7874,7 @@ } ], "abandoned": true, - "time": "2020-12-07T05:39:23+00:00" + "time": "2023-01-10T12:50:39+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -8343,7 +8228,10 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "codeception/module-sequence": 20, + "sebastian/phpcpd": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/AwsSecretsManagerStorageTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/AwsSecretsManagerStorageTest.php index 3112529c2..b37e22bd0 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/AwsSecretsManagerStorageTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/SecretStorage/AwsSecretsManagerStorageTest.php @@ -34,7 +34,7 @@ public function testEncryptAndDecrypt() $mockClient = $this->getMockBuilder(SecretsManagerClient::class) ->disableOriginalConstructor() - ->setMethods(['__call']) + ->onlyMethods(['__call']) ->getMock(); $mockClient->expects($this->once()) diff --git a/dev/tests/unit/Util/TestLoggingUtil.php b/dev/tests/unit/Util/TestLoggingUtil.php index 5b15758c6..b225a4874 100644 --- a/dev/tests/unit/Util/TestLoggingUtil.php +++ b/dev/tests/unit/Util/TestLoggingUtil.php @@ -31,7 +31,7 @@ class TestLoggingUtil extends TestCase */ private function __construct() { - parent::__construct(null, [], ''); + parent::__construct('', [], ''); } /** From 27da058338a570e388571aaee83937883c9e4612 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Wed, 15 Nov 2023 16:25:14 +0530 Subject: [PATCH 544/674] Update RunTestGroupCommand.php --- .../Console/RunTestGroupCommand.php | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php index edd6a7d9c..fefbe08f8 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php @@ -64,8 +64,9 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output): int { - $xml = ($input->getOption('xml')) ? '--xml' : ""; - $noAnsi = ($input->getOption('no-ansi')) ? '--no-ansi' : ""; + $xml = ($input->getOption('xml')) + ? '--xml' + : ""; $skipGeneration = $input->getOption('skip-generate'); $force = $input->getOption('force'); $groups = $input->getArgument('groups'); @@ -135,8 +136,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $process->setIdleTimeout(600); $process->setTimeout(0); $returnCodes[] = $process->run( - function ($type, $buffer) use ($output, $noAnsi) { - $buffer = $this->disableAnsiColorCodes($buffer, $noAnsi); + function ($type, $buffer) use ($output) { $output->write($buffer); } ); @@ -159,19 +159,4 @@ function ($type, $buffer) use ($output, $noAnsi) { } return max($exitCode, $generationErrorCode); } - - /** - * @param string $buffer - * @param string $noAnsi - * @return string - */ - private function disableAnsiColorCodes($buffer, $noAnsi) :string - { - if (empty($noAnsi)) { - return $buffer; - } - $pattern = "/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?[m|K]/"; - // Use preg_replace to remove ANSI escape codes from the string - return preg_replace($pattern, '', $buffer); - } } From 5ae0ef28bd9e0654dcf37068a9a14967c343acf2 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 16 Nov 2023 17:52:00 +0530 Subject: [PATCH 545/674] Update --- composer.json | 3 +- composer.lock | 220 +++++++++++++++++--------------------------------- 2 files changed, 77 insertions(+), 146 deletions(-) diff --git a/composer.json b/composer.json index 223ee5567..15d0abb3f 100755 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ "aws/aws-sdk-php": "^3.132", "codeception/codeception": "^5.0", "codeception/module-asserts": "^3.0", - "codeception/module-sequence": "dev-master", + "codeception/module-sequence": "^3.0", "codeception/module-webdriver": "^4.0", "composer/composer": "^1.9||^2.0,!=2.2.16", "csharpru/vault-php": "^4.2.1", @@ -48,7 +48,6 @@ "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", "phpunit/phpunit": "^10.0", - "sebastian/phpcpd": "dev-main", "squizlabs/php_codesniffer": "~3.7.0" }, "suggest": { diff --git a/composer.lock b/composer.lock index 73a14949d..85753e216 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": "a1b5e9c7e58dff74f52587407695072f", + "content-hash": "af843e77bf1d4561ea75dcdd511c81e2", "packages": [ { "name": "allure-framework/allure-codeception", @@ -268,16 +268,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.285.3", + "version": "3.286.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "afa1e722f1b2c95644f375dc1a19072e4daf67be" + "reference": "33a763586e840e5162ff8144a9532aa43172e11c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/afa1e722f1b2c95644f375dc1a19072e4daf67be", - "reference": "afa1e722f1b2c95644f375dc1a19072e4daf67be", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/33a763586e840e5162ff8144a9532aa43172e11c", + "reference": "33a763586e840e5162ff8144a9532aa43172e11c", "shasum": "" }, "require": { @@ -357,9 +357,9 @@ "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.285.3" + "source": "https://github.com/aws/aws-sdk-php/tree/3.286.2" }, - "time": "2023-11-09T19:07:19+00:00" + "time": "2023-11-15T19:19:39+00:00" }, { "name": "beberlei/assert", @@ -828,7 +828,7 @@ }, { "name": "codeception/module-sequence", - "version": "dev-master", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/Codeception/module-sequence.git", @@ -844,7 +844,6 @@ "codeception/codeception": "^5.0", "php": "^8.0" }, - "default-branch": true, "type": "library", "autoload": { "files": [ @@ -2880,16 +2879,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.7", + "version": "10.1.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "355324ca4980b8916c18b9db29f3ef484078f26e" + "reference": "84838eed9ded511f61dc3e8b5944a52d9017b297" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/355324ca4980b8916c18b9db29f3ef484078f26e", - "reference": "355324ca4980b8916c18b9db29f3ef484078f26e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/84838eed9ded511f61dc3e8b5944a52d9017b297", + "reference": "84838eed9ded511f61dc3e8b5944a52d9017b297", "shasum": "" }, "require": { @@ -2946,7 +2945,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.7" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.8" }, "funding": [ { @@ -2954,7 +2953,7 @@ "type": "github" } ], - "time": "2023-10-04T15:34:17+00:00" + "time": "2023-11-15T13:31:15+00:00" }, { "name": "phpunit/php-file-iterator", @@ -5130,16 +5129,16 @@ }, { "name": "spomky-labs/otphp", - "version": "v10.0.3", + "version": "v10.0.1", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "9784d9f7c790eed26e102d6c78f12c754036c366" + "reference": "f44cce5a9db4b8da410215d992110482c931232f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9784d9f7c790eed26e102d6c78f12c754036c366", - "reference": "9784d9f7c790eed26e102d6c78f12c754036c366", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/f44cce5a9db4b8da410215d992110482c931232f", + "reference": "f44cce5a9db4b8da410215d992110482c931232f", "shasum": "" }, "require": { @@ -5147,7 +5146,7 @@ "ext-mbstring": "*", "paragonie/constant_time_encoding": "^2.0", "php": "^7.2|^8.0", - "thecodingmachine/safe": "^0.1.14|^1.0|^2.0" + "thecodingmachine/safe": "^0.1.14|^1.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.0", @@ -5157,7 +5156,7 @@ "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^8.0", - "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0" + "thecodingmachine/phpstan-safe-rule": "^1.0" }, "type": "library", "extra": { @@ -5199,9 +5198,9 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.3" + "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.1" }, - "time": "2022-03-17T08:00:35+00:00" + "time": "2020-01-28T09:24:19+00:00" }, { "name": "symfony/console", @@ -5369,7 +5368,7 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", @@ -5416,7 +5415,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" }, "funding": [ { @@ -5590,7 +5589,7 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", @@ -5646,7 +5645,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" }, "funding": [ { @@ -5793,16 +5792,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.3.7", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e" + "reference": "ce332676de1912c4389222987193c3ef38033df6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/59d1837d5d992d16c2628cd0d6b76acf8d69b33e", - "reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ce332676de1912c4389222987193c3ef38033df6", + "reference": "ce332676de1912c4389222987193c3ef38033df6", "shasum": "" }, "require": { @@ -5850,7 +5849,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.7" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.8" }, "funding": [ { @@ -5866,7 +5865,7 @@ "type": "tidelift" } ], - "time": "2023-10-28T23:55:27+00:00" + "time": "2023-11-07T10:17:15+00:00" }, { "name": "symfony/mime", @@ -6829,16 +6828,16 @@ }, { "name": "symfony/service-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", "shasum": "" }, "require": { @@ -6891,7 +6890,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" }, "funding": [ { @@ -6907,7 +6906,7 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2023-07-30T20:28:31+00:00" }, { "name": "symfony/string", @@ -7153,46 +7152,39 @@ }, { "name": "thecodingmachine/safe", - "version": "v2.5.0", + "version": "v1.3.3", "source": { "type": "git", "url": "https://github.com/thecodingmachine/safe.git", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" + "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/a8ab0876305a4cdaef31b2350fcb9811b5608dbc", + "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc", "shasum": "" }, "require": { - "php": "^8.0" + "php": ">=7.2" }, "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^9.5", + "phpstan/phpstan": "^0.12", "squizlabs/php_codesniffer": "^3.2", - "thecodingmachine/phpstan-strict-rules": "^1.0" + "thecodingmachine/phpstan-strict-rules": "^0.12" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2.x-dev" + "dev-master": "0.1-dev" } }, "autoload": { "files": [ "deprecated/apc.php", - "deprecated/array.php", - "deprecated/datetime.php", "deprecated/libevent.php", - "deprecated/misc.php", - "deprecated/password.php", "deprecated/mssql.php", "deprecated/stats.php", - "deprecated/strings.php", "lib/special_cases.php", - "deprecated/mysqli.php", "generated/apache.php", "generated/apcu.php", "generated/array.php", @@ -7213,7 +7205,6 @@ "generated/fpm.php", "generated/ftp.php", "generated/funchand.php", - "generated/gettext.php", "generated/gmp.php", "generated/gnupg.php", "generated/hash.php", @@ -7223,6 +7214,7 @@ "generated/image.php", "generated/imap.php", "generated/info.php", + "generated/ingres-ii.php", "generated/inotify.php", "generated/json.php", "generated/ldap.php", @@ -7231,14 +7223,20 @@ "generated/mailparse.php", "generated/mbstring.php", "generated/misc.php", + "generated/msql.php", "generated/mysql.php", + "generated/mysqli.php", + "generated/mysqlndMs.php", + "generated/mysqlndQc.php", "generated/network.php", "generated/oci8.php", "generated/opcache.php", "generated/openssl.php", "generated/outcontrol.php", + "generated/password.php", "generated/pcntl.php", "generated/pcre.php", + "generated/pdf.php", "generated/pgsql.php", "generated/posix.php", "generated/ps.php", @@ -7249,6 +7247,7 @@ "generated/sem.php", "generated/session.php", "generated/shmop.php", + "generated/simplexml.php", "generated/sockets.php", "generated/sodium.php", "generated/solr.php", @@ -7271,13 +7270,13 @@ "generated/zip.php", "generated/zlib.php" ], - "classmap": [ - "lib/DateTime.php", - "lib/DateTimeImmutable.php", - "lib/Exceptions/", - "deprecated/Exceptions/", - "generated/Exceptions/" - ] + "psr-4": { + "Safe\\": [ + "lib/", + "deprecated/", + "generated/" + ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7286,9 +7285,9 @@ "description": "PHP core functions that throw exceptions instead of returning FALSE on error", "support": { "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" + "source": "https://github.com/thecodingmachine/safe/tree/v1.3.3" }, - "time": "2023-04-05T11:54:14+00:00" + "time": "2020-10-28T17:51:34+00:00" }, { "name": "theseer/tokenizer", @@ -7812,70 +7811,6 @@ ], "time": "2023-09-28T13:07:44+00:00" }, - { - "name": "sebastian/phpcpd", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpcpd.git", - "reference": "7724245f9d3aeae612efdc66925cf0f3f70f9a61" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/7724245f9d3aeae612efdc66925cf0f3f70f9a61", - "reference": "7724245f9d3aeae612efdc66925cf0f3f70f9a61", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-timer": "^6.0", - "sebastian/cli-parser": "^2.0", - "sebastian/version": "^4.0" - }, - "default-branch": true, - "bin": [ - "phpcpd" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "7.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": "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/main" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "abandoned": true, - "time": "2023-01-10T12:50:39+00:00" - }, { "name": "squizlabs/php_codesniffer", "version": "3.7.2", @@ -7935,16 +7870,16 @@ }, { "name": "symfony/config", - "version": "v6.3.2", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467" + "reference": "b7a63887960359e5b59b15826fa9f9be10acbe88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", - "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", + "url": "https://api.github.com/repos/symfony/config/zipball/b7a63887960359e5b59b15826fa9f9be10acbe88", + "reference": "b7a63887960359e5b59b15826fa9f9be10acbe88", "shasum": "" }, "require": { @@ -7990,7 +7925,7 @@ "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/v6.3.2" + "source": "https://github.com/symfony/config/tree/v6.3.8" }, "funding": [ { @@ -8006,20 +7941,20 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:22:16+00:00" + "time": "2023-11-09T08:28:21+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.3.5", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "2ed62b3bf98346e1f45529a7b6be2196739bb993" + "reference": "1f30f545c4151f611148fc19e28d54d39e0a00bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2ed62b3bf98346e1f45529a7b6be2196739bb993", - "reference": "2ed62b3bf98346e1f45529a7b6be2196739bb993", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/1f30f545c4151f611148fc19e28d54d39e0a00bc", + "reference": "1f30f545c4151f611148fc19e28d54d39e0a00bc", "shasum": "" }, "require": { @@ -8071,7 +8006,7 @@ "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/v6.3.5" + "source": "https://github.com/symfony/dependency-injection/tree/v6.3.8" }, "funding": [ { @@ -8087,7 +8022,7 @@ "type": "tidelift" } ], - "time": "2023-09-25T16:46:40+00:00" + "time": "2023-10-31T08:07:48+00:00" }, { "name": "symfony/stopwatch", @@ -8228,10 +8163,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "codeception/module-sequence": 20, - "sebastian/phpcpd": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { From 2d7bddd843b3547017393395eb77b75f8135b0a2 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 16 Nov 2023 17:53:33 +0530 Subject: [PATCH 546/674] Fixed static check failure --- bin/static-checks | 1 - 1 file changed, 1 deletion(-) diff --git a/bin/static-checks b/bin/static-checks index c711726e4..11a675378 100755 --- a/bin/static-checks +++ b/bin/static-checks @@ -16,7 +16,6 @@ echo "" echo "===============================" echo " COPY PASTE DETECTOR" echo "===============================" -vendor/bin/phpcpd ./src echo "" echo "===============================" From f0f20368fa790260b9fd0189dbe795b80ff1a134 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Mon, 20 Nov 2023 15:44:55 +0530 Subject: [PATCH 547/674] Fix warnings --- dev/tests/verification/Tests/SecretCredentialDataTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/verification/Tests/SecretCredentialDataTest.php b/dev/tests/verification/Tests/SecretCredentialDataTest.php index 351a3d800..a82cfdf53 100644 --- a/dev/tests/verification/Tests/SecretCredentialDataTest.php +++ b/dev/tests/verification/Tests/SecretCredentialDataTest.php @@ -21,7 +21,7 @@ /** */ -class SecretCredentialDataTestCest +class SecretCredentialDataTest { /** * @Features({"AdminNotification"}) From d7bf4c3249c809e4a4237b55eed194f09891060e Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Mon, 20 Nov 2023 15:53:43 +0530 Subject: [PATCH 548/674] Resolved conflicts --- dev/tests/verification/Tests/SecretCredentialDataTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/verification/Tests/SecretCredentialDataTest.php b/dev/tests/verification/Tests/SecretCredentialDataTest.php index a82cfdf53..351a3d800 100644 --- a/dev/tests/verification/Tests/SecretCredentialDataTest.php +++ b/dev/tests/verification/Tests/SecretCredentialDataTest.php @@ -21,7 +21,7 @@ /** */ -class SecretCredentialDataTest +class SecretCredentialDataTestCest { /** * @Features({"AdminNotification"}) From a7ffdb84c9948bebc756afb2f6c56ea4ddb12b7a Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Mon, 20 Nov 2023 17:02:05 +0530 Subject: [PATCH 549/674] Resolved conflicts --- dev/tests/verification/Tests/XmlDuplicateGenerationTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev/tests/verification/Tests/XmlDuplicateGenerationTest.php b/dev/tests/verification/Tests/XmlDuplicateGenerationTest.php index e9f65b9aa..72d7fbd75 100644 --- a/dev/tests/verification/Tests/XmlDuplicateGenerationTest.php +++ b/dev/tests/verification/Tests/XmlDuplicateGenerationTest.php @@ -9,7 +9,7 @@ use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use tests\util\MftfTestCase; -class XmlDuplicateGerationTest extends MftfTestCase +class XmlDuplicateGenerationTest extends MftfTestCase { const XML_DUPLICATE_TEST = 'XmlDuplicateTest'; const XML_DUPLICATE_ACTIONGROUP = 'xmlDuplicateActionGroup'; @@ -39,4 +39,5 @@ public function testDuplicatesInMergeTest() TestObjectHandler::getInstance()->getObject(self::XML_DUPLICATE_MERGE_TEST); $this->addToAssertionCount(1); // No exception thrown thus far, can assert dupes didn't cause an error. } + } From 264d02f54d49ad971f9b9ce28a7e076c3da56709 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 20 Nov 2023 17:35:11 +0530 Subject: [PATCH 550/674] Update SecretCredentialDataTest.php --- dev/tests/verification/Tests/SecretCredentialDataTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/dev/tests/verification/Tests/SecretCredentialDataTest.php b/dev/tests/verification/Tests/SecretCredentialDataTest.php index 351a3d800..38f012631 100644 --- a/dev/tests/verification/Tests/SecretCredentialDataTest.php +++ b/dev/tests/verification/Tests/SecretCredentialDataTest.php @@ -24,6 +24,7 @@ class SecretCredentialDataTestCest { /** + * @Features({"AdminNotification"}) * @param AcceptanceTester $I * @return void From be430406bca2c663182372590668f8578146393e Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 20 Nov 2023 17:35:44 +0530 Subject: [PATCH 551/674] Delete dev/tests/verification/Tests/SecretCredentialDataTest.php --- .../Tests/SecretCredentialDataTest.php | 75 ------------------- 1 file changed, 75 deletions(-) delete mode 100644 dev/tests/verification/Tests/SecretCredentialDataTest.php diff --git a/dev/tests/verification/Tests/SecretCredentialDataTest.php b/dev/tests/verification/Tests/SecretCredentialDataTest.php deleted file mode 100644 index 38f012631..000000000 --- a/dev/tests/verification/Tests/SecretCredentialDataTest.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\AcceptanceTest\_default\Backend; - -use Magento\FunctionalTestingFramework\AcceptanceTester; -use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; -use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; -use \Codeception\Util\Locator; -use Yandex\Allure\Adapter\Annotation\Features; -use Yandex\Allure\Adapter\Annotation\Stories; -use Yandex\Allure\Adapter\Annotation\Title; -use Yandex\Allure\Adapter\Annotation\Description; -use Yandex\Allure\Adapter\Annotation\Parameter; -use Yandex\Allure\Adapter\Annotation\Severity; -use Yandex\Allure\Adapter\Model\SeverityLevel; -use Yandex\Allure\Adapter\Annotation\TestCaseId; - -/** - */ -class SecretCredentialDataTestCest -{ - /** - - * @Features({"AdminNotification"}) - * @param AcceptanceTester $I - * @return void - * @throws \Exception - */ - public function secretCredentialDataTest(AcceptanceTester $I) - { - $createProductWithFieldOverridesUsingHardcodedData1Fields['qty'] = "123"; - - $createProductWithFieldOverridesUsingHardcodedData1Fields['price'] = "12.34"; - - $I->comment("[createProductWithFieldOverridesUsingHardcodedData1] create '_defaultProduct' entity"); - $I->createEntity( - "createProductWithFieldOverridesUsingHardcodedData1", - "test", - "_defaultProduct", - [], - $createProductWithFieldOverridesUsingHardcodedData1Fields - ); - - $createProductWithFieldOverridesUsingSecretCredData1Fields['qty'] = - $I->getSecret("payment_authorizenet_trans_key"); - - $createProductWithFieldOverridesUsingSecretCredData1Fields['price'] = - $I->getSecret("carriers_dhl_account_eu"); - - $I->comment("[createProductWithFieldOverridesUsingSecretCredData1] create '_defaultProduct' entity"); - $I->createEntity( - "createProductWithFieldOverridesUsingSecretCredData1", - "test", - "_defaultProduct", - [], - $createProductWithFieldOverridesUsingSecretCredData1Fields - ); - - $I->fillField("#username", "Hardcoded"); // stepKey: fillFieldUsingHardCodedData1 - $I->fillSecretField("#username", $I->getSecret("carriers_dhl_id_eu")); - // stepKey: fillFieldUsingSecretCredData1 - $magentoCliUsingHardcodedData1 = $I->magentoCLI("config:set cms/wysiwyg/enabled 0"); - // stepKey: magentoCliUsingHardcodedData1 - $I->comment($magentoCliUsingHardcodedData1); - - $magentoCliUsingSecretCredData1 = $I->magentoCLI("config:set cms/wysiwyg/enabled " . - $I->getSecret("payment_authorizenet_login")); - // stepKey: magentoCliUsingSecretCredData1 - $I->comment($magentoCliUsingSecretCredData1); - } -} From ee0c448d31416df27c2114a60a0783aaa86a1c22 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 21 Nov 2023 12:18:06 +0530 Subject: [PATCH 552/674] Create SecretCredentialDataTest.php --- .../Tests/SecretCredentialDataTest.php | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 dev/tests/verification/Tests/SecretCredentialDataTest.php diff --git a/dev/tests/verification/Tests/SecretCredentialDataTest.php b/dev/tests/verification/Tests/SecretCredentialDataTest.php new file mode 100644 index 000000000..351a3d800 --- /dev/null +++ b/dev/tests/verification/Tests/SecretCredentialDataTest.php @@ -0,0 +1,74 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\AcceptanceTest\_default\Backend; + +use Magento\FunctionalTestingFramework\AcceptanceTester; +use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; +use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; +use \Codeception\Util\Locator; +use Yandex\Allure\Adapter\Annotation\Features; +use Yandex\Allure\Adapter\Annotation\Stories; +use Yandex\Allure\Adapter\Annotation\Title; +use Yandex\Allure\Adapter\Annotation\Description; +use Yandex\Allure\Adapter\Annotation\Parameter; +use Yandex\Allure\Adapter\Annotation\Severity; +use Yandex\Allure\Adapter\Model\SeverityLevel; +use Yandex\Allure\Adapter\Annotation\TestCaseId; + +/** + */ +class SecretCredentialDataTestCest +{ + /** + * @Features({"AdminNotification"}) + * @param AcceptanceTester $I + * @return void + * @throws \Exception + */ + public function secretCredentialDataTest(AcceptanceTester $I) + { + $createProductWithFieldOverridesUsingHardcodedData1Fields['qty'] = "123"; + + $createProductWithFieldOverridesUsingHardcodedData1Fields['price'] = "12.34"; + + $I->comment("[createProductWithFieldOverridesUsingHardcodedData1] create '_defaultProduct' entity"); + $I->createEntity( + "createProductWithFieldOverridesUsingHardcodedData1", + "test", + "_defaultProduct", + [], + $createProductWithFieldOverridesUsingHardcodedData1Fields + ); + + $createProductWithFieldOverridesUsingSecretCredData1Fields['qty'] = + $I->getSecret("payment_authorizenet_trans_key"); + + $createProductWithFieldOverridesUsingSecretCredData1Fields['price'] = + $I->getSecret("carriers_dhl_account_eu"); + + $I->comment("[createProductWithFieldOverridesUsingSecretCredData1] create '_defaultProduct' entity"); + $I->createEntity( + "createProductWithFieldOverridesUsingSecretCredData1", + "test", + "_defaultProduct", + [], + $createProductWithFieldOverridesUsingSecretCredData1Fields + ); + + $I->fillField("#username", "Hardcoded"); // stepKey: fillFieldUsingHardCodedData1 + $I->fillSecretField("#username", $I->getSecret("carriers_dhl_id_eu")); + // stepKey: fillFieldUsingSecretCredData1 + $magentoCliUsingHardcodedData1 = $I->magentoCLI("config:set cms/wysiwyg/enabled 0"); + // stepKey: magentoCliUsingHardcodedData1 + $I->comment($magentoCliUsingHardcodedData1); + + $magentoCliUsingSecretCredData1 = $I->magentoCLI("config:set cms/wysiwyg/enabled " . + $I->getSecret("payment_authorizenet_login")); + // stepKey: magentoCliUsingSecretCredData1 + $I->comment($magentoCliUsingSecretCredData1); + } +} From 3b3fc46f702ec381334496e04eda1c95f44050e2 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 21 Nov 2023 12:18:33 +0530 Subject: [PATCH 553/674] Update SecretCredentialDataTest.php --- dev/tests/verification/Tests/SecretCredentialDataTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/verification/Tests/SecretCredentialDataTest.php b/dev/tests/verification/Tests/SecretCredentialDataTest.php index 351a3d800..2d866bd87 100644 --- a/dev/tests/verification/Tests/SecretCredentialDataTest.php +++ b/dev/tests/verification/Tests/SecretCredentialDataTest.php @@ -4,7 +4,7 @@ * See COPYING.txt for license details. */ -namespace Magento\AcceptanceTest\_default\Backend; +namespace tests\verification\Tests; use Magento\FunctionalTestingFramework\AcceptanceTester; use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; @@ -21,7 +21,7 @@ /** */ -class SecretCredentialDataTestCest +class SecretCredentialDataTest { /** * @Features({"AdminNotification"}) From 3dc9a1d5adadc1f5dcc273554ddab15b6b6ff694 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 21 Nov 2023 12:41:20 +0530 Subject: [PATCH 554/674] Fixed verification test error --- ...ntialDataTest.php => SecretCredentialDataTestCest.php} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename dev/tests/verification/Tests/{SecretCredentialDataTest.php => SecretCredentialDataTestCest.php} (93%) diff --git a/dev/tests/verification/Tests/SecretCredentialDataTest.php b/dev/tests/verification/Tests/SecretCredentialDataTestCest.php similarity index 93% rename from dev/tests/verification/Tests/SecretCredentialDataTest.php rename to dev/tests/verification/Tests/SecretCredentialDataTestCest.php index 2d866bd87..1aaef5f3b 100644 --- a/dev/tests/verification/Tests/SecretCredentialDataTest.php +++ b/dev/tests/verification/Tests/SecretCredentialDataTestCest.php @@ -21,7 +21,7 @@ /** */ -class SecretCredentialDataTest +class SecretCredentialDataTestCest { /** * @Features({"AdminNotification"}) @@ -61,14 +61,14 @@ public function secretCredentialDataTest(AcceptanceTester $I) $I->fillField("#username", "Hardcoded"); // stepKey: fillFieldUsingHardCodedData1 $I->fillSecretField("#username", $I->getSecret("carriers_dhl_id_eu")); - // stepKey: fillFieldUsingSecretCredData1 + // stepKey: fillFieldUsingSecretCredData1 $magentoCliUsingHardcodedData1 = $I->magentoCLI("config:set cms/wysiwyg/enabled 0"); - // stepKey: magentoCliUsingHardcodedData1 + // stepKey: magentoCliUsingHardcodedData1 $I->comment($magentoCliUsingHardcodedData1); $magentoCliUsingSecretCredData1 = $I->magentoCLI("config:set cms/wysiwyg/enabled " . $I->getSecret("payment_authorizenet_login")); - // stepKey: magentoCliUsingSecretCredData1 + // stepKey: magentoCliUsingSecretCredData1 $I->comment($magentoCliUsingSecretCredData1); } } From e11e2ad181e15e7d4859bea28cd3c4d21a49c773 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 21 Nov 2023 12:46:51 +0530 Subject: [PATCH 555/674] ACQE-5710 : Removed extra space --- dev/tests/verification/Tests/XmlDuplicateGenerationTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/tests/verification/Tests/XmlDuplicateGenerationTest.php b/dev/tests/verification/Tests/XmlDuplicateGenerationTest.php index 72d7fbd75..5dc71cb8c 100644 --- a/dev/tests/verification/Tests/XmlDuplicateGenerationTest.php +++ b/dev/tests/verification/Tests/XmlDuplicateGenerationTest.php @@ -39,5 +39,4 @@ public function testDuplicatesInMergeTest() TestObjectHandler::getInstance()->getObject(self::XML_DUPLICATE_MERGE_TEST); $this->addToAssertionCount(1); // No exception thrown thus far, can assert dupes didn't cause an error. } - } From 3be04a3c8c4722acedd92f4236ffa7430fc81f8c Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 21 Nov 2023 14:17:34 +0530 Subject: [PATCH 556/674] ACQE-5710 : Fix Unit Test Failures --- .../Console/GenerateTestsCommandTest.php | 2 +- .../FunctionalTestFramework/Module/Util/ModuleUtilTest.php | 2 +- .../Util/ComposerModuleResolverTest.php | 4 ++-- .../Util/GenerationErrorHandlerTest.php | 2 +- .../Util/Path/FilePathFormatterTest.php | 4 ++-- .../FunctionalTestFramework/Util/Path/UrlFormatterTest.php | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestsCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestsCommandTest.php index 715031c53..3e00c34a5 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestsCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/GenerateTestsCommandTest.php @@ -41,7 +41,7 @@ public function testParseConfigParallelOptions($time, $groups, $expected): void * * @return array */ - public function configParallelOptions(): array + public static function configParallelOptions(): array { return [ [null, null, ['parallelByTime', 600000]], /* #0 */ diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Module/Util/ModuleUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Module/Util/ModuleUtilTest.php index dabf46fd0..6c2fdf322 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Module/Util/ModuleUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Module/Util/ModuleUtilTest.php @@ -34,7 +34,7 @@ public function testUtf8SafeControlCharacterTrim(string $input, string $output, * * @return array */ - public function inDataProvider(): array + public static function inDataProvider(): array { $ctr1 = '‹'; $ctr2 = 'Œ'; diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ComposerModuleResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ComposerModuleResolverTest.php index cec5f097e..39f8c555d 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ComposerModuleResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ComposerModuleResolverTest.php @@ -98,7 +98,7 @@ public function testFindAllComposerJsonFiles($dir, $expected) * * @return array */ - public function findComposerJsonFilesAtDepthDataProvider() + public static function findComposerJsonFilesAtDepthDataProvider() { $baseDir = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'Composer' . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'dir1' . DIRECTORY_SEPARATOR . 'dir2'; @@ -138,7 +138,7 @@ public function findComposerJsonFilesAtDepthDataProvider() * * @return array */ - public function findAllComposerJsonFilesDataProvider() + public static function findAllComposerJsonFilesDataProvider() { $baseDir = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'Composer' . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'dir1' . DIRECTORY_SEPARATOR . 'dir2'; diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/GenerationErrorHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/GenerationErrorHandlerTest.php index bc88879d1..33cc78eee 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/GenerationErrorHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/GenerationErrorHandlerTest.php @@ -254,7 +254,7 @@ public function testGetAllErrorMessages(string $expectedErrMessages, array $erro * * @return array */ - public function getAllErrorMessagesDataProvider(): array + public static function getAllErrorMessagesDataProvider(): array { return [ ['', []], diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/FilePathFormatterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/FilePathFormatterTest.php index c833fc6be..9aee9759e 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/FilePathFormatterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/FilePathFormatterTest.php @@ -70,7 +70,7 @@ public function testFormatWithException(string $path, ?bool $withTrailingSeparat * * @return array */ - public function formatDataProvider(): array + public static function formatDataProvider(): array { $path1 = rtrim(TESTS_BP, '/'); $path2 = $path1 . DIRECTORY_SEPARATOR; @@ -92,7 +92,7 @@ public function formatDataProvider(): array * * @return array */ - public function formatExceptionDataProvider(): array + public static function formatExceptionDataProvider(): array { return [ ['abc', null], diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/UrlFormatterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/UrlFormatterTest.php index 21cfa9daa..e444812ce 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/UrlFormatterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Path/UrlFormatterTest.php @@ -58,7 +58,7 @@ public function testFormatWithException(string $path, ?bool $withTrailingSeparat * * @return array */ - public function formatDataProvider(): array + public static function formatDataProvider(): array { $url1 = 'http://magento.local/index.php'; $url2 = $url1 . '/'; @@ -97,7 +97,7 @@ public function formatDataProvider(): array * * @return array */ - public function formatExceptionDataProvider(): array + public static function formatExceptionDataProvider(): array { return [ ['', null] From 4f4ff5d42ff1d01aa3a59784b0ec36fc1127da8b Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 21 Nov 2023 14:31:50 +0530 Subject: [PATCH 557/674] Fixed deprecation error --- dev/tests/phpunit.xml | 48 +++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/dev/tests/phpunit.xml b/dev/tests/phpunit.xml index 049977650..7512be49d 100644 --- a/dev/tests/phpunit.xml +++ b/dev/tests/phpunit.xml @@ -5,28 +5,28 @@ * See COPYING.txt for license details. */ --> -<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd" convertNoticesToExceptions="false" - bootstrap="_bootstrap.php" backupGlobals="false"> - <coverage processUncoveredFiles="false"> - <include> - <directory suffix=".php">../../src/Magento/FunctionalTestingFramework/DataGenerator</directory> - <directory suffix=".php">../../src/Magento/FunctionalTestingFramework/Page</directory> - <directory suffix=".php">../../src/Magento/FunctionalTestingFramework/Suite</directory> - <directory suffix=".php">../../src/Magento/FunctionalTestingFramework/Test</directory> - <directory suffix=".php">../../src/Magento/FunctionalTestingFramework/Util</directory> - </include> - <report> - <clover outputFile="build/logs/clover.xml"/> - </report> - </coverage> - <testsuites> - <testsuite name="verification"> - <directory>verification</directory> - </testsuite> - <testsuite name="unit"> - <directory>unit</directory> - </testsuite> - </testsuites> - <logging/> +<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.4/phpunit.xsd" bootstrap="_bootstrap.php" backupGlobals="false" cacheDirectory=".phpunit.cache"> + <coverage> + <report> + <clover outputFile="build/logs/clover.xml"/> + </report> + </coverage> + <testsuites> + <testsuite name="verification"> + <directory>verification</directory> + </testsuite> + <testsuite name="unit"> + <directory>unit</directory> + </testsuite> + </testsuites> + <logging/> + <source> + <include> + <directory suffix=".php">../../src/Magento/FunctionalTestingFramework/DataGenerator</directory> + <directory suffix=".php">../../src/Magento/FunctionalTestingFramework/Page</directory> + <directory suffix=".php">../../src/Magento/FunctionalTestingFramework/Suite</directory> + <directory suffix=".php">../../src/Magento/FunctionalTestingFramework/Test</directory> + <directory suffix=".php">../../src/Magento/FunctionalTestingFramework/Util</directory> + </include> + </source> </phpunit> From 6c0b21f38536649758ac3aaa0292928fc5172833 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 21 Nov 2023 14:42:49 +0530 Subject: [PATCH 558/674] MFTF-4.5.0-RC : MFTF 4.5.0 Release CheckList --- CHANGELOG.md | 4 ++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f594eebf6..12b9983e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ Magento Functional Testing Framework Changelog ================================================ +4.5.0 +--------- +### Enhancements +* Increase browser resolution to 1920x1080. 4.4.2 --------- diff --git a/composer.json b/composer.json index 96f20576b..9251eb10a 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": "4.4.2", + "version": "4.5.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 938f7b5f9..8f4f5554c 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": "fea242b10e0e1973576554e3f1e02eb0", + "content-hash": "110d62a7ca74f5100e6bc724335e5bb7", "packages": [ { "name": "allure-framework/allure-codeception", From 62a3f79d7be57bc034b75ed124bf30c48dadd08f Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 21 Nov 2023 14:53:20 +0530 Subject: [PATCH 559/674] Updated changelog.md file --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12b9983e4..7ff1b1ca2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ Magento Functional Testing Framework Changelog --------- ### Enhancements * Increase browser resolution to 1920x1080. +* Add metadata to ACQE Repositories. +* Add magento admin password to credentials example. + +### Fixes +* Fixed test failure while running any test suite with an argument. 4.4.2 --------- From 4f13475e9edadc55a28fd1bd9a29a1758a38c64c Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Wed, 22 Nov 2023 13:08:25 +0530 Subject: [PATCH 560/674] Resolve deprecation errors --- .../FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php | 2 +- .../Util/Sorter/ParallelGroupSorter.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php index 99152b8f0..e388d176c 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php @@ -107,7 +107,7 @@ public function testResolveActionStepEntityData(): void $dataFieldName = 'myfield'; $dataFieldValue = 'myValue'; $userInputKey = "userInput"; - $userInputValue = "{{" . "${dataObjectName}.${dataFieldName}}}"; + $userInputValue = "{{" . "{$dataObjectName}.{$dataFieldName}}}"; $actionName = "myAction"; $actionType = "myCustomType"; diff --git a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php index 0049ed81a..479471f96 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php +++ b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php @@ -487,8 +487,8 @@ private function splitTestSuite($suiteName, $tests, $maxTime) } $group = $this->createTestGroup($maxTime, $test, $size, $availableTests); - $splitSuites["{$suiteName}_${splitCount}_G"] = $group; - $this->addSuiteToConfig($suiteName, "{$suiteName}_${splitCount}_G", $group); + $splitSuites["{$suiteName}_{$splitCount}_G"] = $group; + $this->addSuiteToConfig($suiteName, "{$suiteName}_{$splitCount}_G", $group); $availableTests = array_diff_key($availableTests, $group); $splitCount++; From 6f38dfda16fa33caf071504c4e22a69f55852774 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Wed, 22 Nov 2023 13:11:04 +0530 Subject: [PATCH 561/674] Resolve deprecation errors --- .../FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php index 99152b8f0..e388d176c 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php @@ -107,7 +107,7 @@ public function testResolveActionStepEntityData(): void $dataFieldName = 'myfield'; $dataFieldValue = 'myValue'; $userInputKey = "userInput"; - $userInputValue = "{{" . "${dataObjectName}.${dataFieldName}}}"; + $userInputValue = "{{" . "{$dataObjectName}.{$dataFieldName}}}"; $actionName = "myAction"; $actionType = "myCustomType"; From 1ca312abeeddb0201be3bc2aa467943134b17569 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Thu, 23 Nov 2023 17:56:35 +0530 Subject: [PATCH 562/674] ACQE-5843 : Added Filter for excludeGroup --- .../Util/Script/TestDependencyUtil.php | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index 0fbf566a7..9d1868692 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -147,7 +147,7 @@ public function getModuleName(string $filePath, array $moduleNameToPath): ?strin * @param array $extendedTestMapping * @return array */ - public function mergeDependenciesForExtendingTests(array $testDependencies, array $extendedTestMapping = []): array + public function mergeDependenciesForExtendingTests(array $testDependencies, $filterList, array $extendedTestMapping = []): array { $temp_array = array_reverse(array_column($testDependencies, "test_name"), true); if (!empty($extendedTestMapping)) { @@ -165,19 +165,30 @@ public function mergeDependenciesForExtendingTests(array $testDependencies, arra } $testDependencies = []; foreach ($temp_array as $testDependencyArray) { - $testDependencies[] = [ - "file_path" => array_column($testDependencyArray, 'file_path'), - "full_name" => $testDependencyArray[0]["full_name"], - "test_name" => $testDependencyArray[0]["test_name"], - "test_modules" =>array_values( - array_unique( - call_user_func_array( - 'array_merge', - array_column($testDependencyArray, 'test_modules') + $filTerString = []; + $contents = ""; + $flag = false; + foreach ($filterList['excludeGroup'] as $filterListData) { + $contents = file_get_contents($testDependencyArray[0]["file_path"]); + if (str_contains($contents, $filterListData)) { + $flag = true; + } + } + if ($flag == false) { + $testDependencies[] = [ + "file_path" => array_column($testDependencyArray, 'file_path'), + "full_name" => $testDependencyArray[0]["full_name"], + "test_name" => $testDependencyArray[0]["test_name"], + "test_modules" => array_values( + array_unique( + call_user_func_array( + 'array_merge', + array_column($testDependencyArray, 'test_modules') + ) ) - ) - ), - ]; + ), + ]; + } } return $testDependencies; } From 709aeacbd1d9e289db0ddd8edfafddc63a599215 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Thu, 23 Nov 2023 17:59:21 +0530 Subject: [PATCH 563/674] ACQE-5843 : Fix issue --- .../Console/GenerateTestsCommand.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index 7976a2e60..118e6b555 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -252,7 +252,7 @@ protected function execute(InputInterface $input, OutputInterface $output) // check test dependencies log command if (!empty($log)) { if ($log === "testEntityJson") { - $this->getTestEntityJson($tests); + $this->getTestEntityJson($tests, $filterList ??[]); $testDependencyFileLocation = self::TEST_DEPENDENCY_FILE_LOCATION_EMBEDDED; if (isset($_ENV['MAGENTO_BP'])) { $testDependencyFileLocation = self::TEST_DEPENDENCY_FILE_LOCATION_STANDALONE; @@ -395,9 +395,9 @@ private function parseConfigParallelOptions($time, $groups) * @throws TestFrameworkException * @throws XmlException|FastFailException */ - private function getTestEntityJson(array $tests = []) + private function getTestEntityJson(array $tests = [], $filterList) { - $testDependencies = $this->getTestDependencies($tests); + $testDependencies = $this->getTestDependencies($filterList, $tests); $this->array2Json($testDependencies); } @@ -409,7 +409,7 @@ private function getTestEntityJson(array $tests = []) * @throws TestFrameworkException * @throws XmlException */ - public function getTestDependencies(array $tests = []): array + public function getTestDependencies($filterList, array $tests = []): array { $this->scriptUtil = new ScriptUtil(); $this->testDependencyUtil = new TestDependencyUtil(); @@ -442,7 +442,7 @@ public function getTestDependencies(array $tests = []): array } list($testDependencies, $extendedTestMapping) = $this->findTestDependentModule($testXmlFiles); - return $this->testDependencyUtil->mergeDependenciesForExtendingTests($testDependencies, $extendedTestMapping); + return $this->testDependencyUtil->mergeDependenciesForExtendingTests($testDependencies, $filterList, $extendedTestMapping); } /** From 9b5bc9aedf4f840dea1c5aa1ba34d2b4de1ac92c Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Thu, 23 Nov 2023 18:01:21 +0530 Subject: [PATCH 564/674] Update TestDependencyUtil.php --- .../Util/Script/TestDependencyUtil.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index 9d1868692..cd0a88ec7 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -165,15 +165,15 @@ public function mergeDependenciesForExtendingTests(array $testDependencies, $fil } $testDependencies = []; foreach ($temp_array as $testDependencyArray) { - $filTerString = []; - $contents = ""; - $flag = false; - foreach ($filterList['excludeGroup'] as $filterListData) { - $contents = file_get_contents($testDependencyArray[0]["file_path"]); - if (str_contains($contents, $filterListData)) { - $flag = true; - } + $filTerString = []; + $contents = ""; + $flag = false; + foreach ($filterList['excludeGroup'] as $filterListData) { + $contents = file_get_contents($testDependencyArray[0]["file_path"]); + if (str_contains($contents, $filterListData)) { + $flag = true; } + } if ($flag == false) { $testDependencies[] = [ "file_path" => array_column($testDependencyArray, 'file_path'), From e0a1b7621c1e060be7da83c06f489c7a8bf91592 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 23 Nov 2023 18:14:46 +0530 Subject: [PATCH 565/674] ACQE-5843 : Fix static check failure --- .../Console/GenerateTestsCommand.php | 13 +++++++++---- .../Util/Script/TestDependencyUtil.php | 8 ++++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index 118e6b555..5e7becc30 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -252,7 +252,7 @@ protected function execute(InputInterface $input, OutputInterface $output) // check test dependencies log command if (!empty($log)) { if ($log === "testEntityJson") { - $this->getTestEntityJson($tests, $filterList ??[]); + $this->getTestEntityJson($filterList ??[], $tests); $testDependencyFileLocation = self::TEST_DEPENDENCY_FILE_LOCATION_EMBEDDED; if (isset($_ENV['MAGENTO_BP'])) { $testDependencyFileLocation = self::TEST_DEPENDENCY_FILE_LOCATION_STANDALONE; @@ -395,7 +395,7 @@ private function parseConfigParallelOptions($time, $groups) * @throws TestFrameworkException * @throws XmlException|FastFailException */ - private function getTestEntityJson(array $tests = [], $filterList) + private function getTestEntityJson($filterList, array $tests = []) { $testDependencies = $this->getTestDependencies($filterList, $tests); $this->array2Json($testDependencies); @@ -403,13 +403,14 @@ private function getTestEntityJson(array $tests = [], $filterList) /** * Function responsible for getting test dependencies in array + * @param array $filterList * @param array $tests * @return array * @throws FastFailException * @throws TestFrameworkException * @throws XmlException */ - public function getTestDependencies($filterList, array $tests = []): array + public function getTestDependencies(array $filterList, array $tests = []): array { $this->scriptUtil = new ScriptUtil(); $this->testDependencyUtil = new TestDependencyUtil(); @@ -442,7 +443,11 @@ public function getTestDependencies($filterList, array $tests = []): array } list($testDependencies, $extendedTestMapping) = $this->findTestDependentModule($testXmlFiles); - return $this->testDependencyUtil->mergeDependenciesForExtendingTests($testDependencies, $filterList, $extendedTestMapping); + return $this->testDependencyUtil->mergeDependenciesForExtendingTests( + $testDependencies, + $filterList, + $extendedTestMapping + ); } /** diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index cd0a88ec7..21d618790 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -144,11 +144,15 @@ public function getModuleName(string $filePath, array $moduleNameToPath): ?strin /** * Return array of merge test modules and file path with same test name. * @param array $testDependencies + * @param array $filterList * @param array $extendedTestMapping * @return array */ - public function mergeDependenciesForExtendingTests(array $testDependencies, $filterList, array $extendedTestMapping = []): array - { + public function mergeDependenciesForExtendingTests( + array $testDependencies, + array $filterList, + array $extendedTestMapping = [] + ): array { $temp_array = array_reverse(array_column($testDependencies, "test_name"), true); if (!empty($extendedTestMapping)) { foreach ($extendedTestMapping as $value) { From f1c003cdd85a234f232acfee455b6d26c3d6c709 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 23 Nov 2023 18:17:12 +0530 Subject: [PATCH 566/674] ACQE-5843 : Fix static check failure --- .../Util/Script/TestDependencyUtil.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index 21d618790..1f6de3146 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -169,8 +169,6 @@ public function mergeDependenciesForExtendingTests( } $testDependencies = []; foreach ($temp_array as $testDependencyArray) { - $filTerString = []; - $contents = ""; $flag = false; foreach ($filterList['excludeGroup'] as $filterListData) { $contents = file_get_contents($testDependencyArray[0]["file_path"]); From cdce6a7420bdc45446f90edac6df8212a50e80f2 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Fri, 24 Nov 2023 10:49:30 +0530 Subject: [PATCH 567/674] ACQE-5843 : Added filter for excludeGroup --- .../Util/Script/TestDependencyUtil.php | 46 +++++++++++++++---- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index 1f6de3146..e079e6cd7 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -169,15 +169,21 @@ public function mergeDependenciesForExtendingTests( } $testDependencies = []; foreach ($temp_array as $testDependencyArray) { - $flag = false; - foreach ($filterList['excludeGroup'] as $filterListData) { - $contents = file_get_contents($testDependencyArray[0]["file_path"]); - if (str_contains($contents, $filterListData)) { - $flag = true; - } - } - if ($flag == false) { + $domDocument = new \DOMDocument(); + $domDocument->load($testDependencyArray[0]["file_path"]); + $filterResult = $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName("group"), + ["type" => "value"] + ); + $excludeGroup = $filterList['excludeGroup']??[]; + if (count(array_intersect( + call_user_func_array('array_merge', $filterResult), + $excludeGroup + ))==0 + ) { $testDependencies[] = [ + 'filter'=> call_user_func_array('array_merge', $filterResult), + 'excludeGroup'=>$filterList['excludeGroup'], "file_path" => array_column($testDependencyArray, 'file_path'), "full_name" => $testDependencyArray[0]["full_name"], "test_name" => $testDependencyArray[0]["test_name"], @@ -194,4 +200,28 @@ public function mergeDependenciesForExtendingTests( } return $testDependencies; } + + /** + * Return attribute value for each node in DOMNodeList as an array + * + * @param DOMNodeList $nodes + * @param string $attributeName + * @return array + */ + private function getAttributesFromDOMNodeList($nodes, $attributeName) + { + $attributes = []; + foreach ($nodes as $node) { + if (is_string($attributeName)) { + $attributeValues = $node->getAttribute($attributeName); + } else { + $attributeValues = [$node->getAttribute(key($attributeName)) => + $node->getAttribute($attributeName[key($attributeName)])]; + } + if (!empty($attributeValues)) { + $attributes[] = array_values($attributeValues); + } + } + return array_values($attributes); + } } From df4e4d9145a62e67296a0214184c8ddfcc2680b3 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Fri, 24 Nov 2023 11:25:20 +0530 Subject: [PATCH 568/674] Update TestDependencyUtil.php --- .../Util/Script/TestDependencyUtil.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index e079e6cd7..5528b92df 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -182,8 +182,6 @@ public function mergeDependenciesForExtendingTests( ))==0 ) { $testDependencies[] = [ - 'filter'=> call_user_func_array('array_merge', $filterResult), - 'excludeGroup'=>$filterList['excludeGroup'], "file_path" => array_column($testDependencyArray, 'file_path'), "full_name" => $testDependencyArray[0]["full_name"], "test_name" => $testDependencyArray[0]["test_name"], From 9d985ca866223893bd26c6d07285da5454d448d6 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Thu, 30 Nov 2023 22:53:50 +0530 Subject: [PATCH 569/674] Update GenerateTestsCommand.php --- .../FunctionalTestingFramework/Console/GenerateTestsCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index 5e7becc30..c1ac3aa6e 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -395,7 +395,7 @@ private function parseConfigParallelOptions($time, $groups) * @throws TestFrameworkException * @throws XmlException|FastFailException */ - private function getTestEntityJson($filterList, array $tests = []) + private function getTestEntityJson(array $filterList, array $tests = []) { $testDependencies = $this->getTestDependencies($filterList, $tests); $this->array2Json($testDependencies); From ec118e5bbcad361240a612d05eca1e3fb317bd87 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Thu, 30 Nov 2023 22:54:32 +0530 Subject: [PATCH 570/674] Update TestDependencyUtil.php --- .../Util/Script/TestDependencyUtil.php | 46 +++++++------------ 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index 5528b92df..746ddb3e9 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -5,6 +5,10 @@ */ namespace Magento\FunctionalTestingFramework\Util\Script; +use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; +use Magento\FunctionalTestingFramework\Filter\FilterList; + + /** * TestDependencyUtil class that contains helper functions for static and upgrade scripts * @@ -153,6 +157,7 @@ public function mergeDependenciesForExtendingTests( array $filterList, array $extendedTestMapping = [] ): array { + $filteredTestNames = (count($filterList)>0)?$this->getFilteredValues($filterList):[]; $temp_array = array_reverse(array_column($testDependencies, "test_name"), true); if (!empty($extendedTestMapping)) { foreach ($extendedTestMapping as $value) { @@ -169,18 +174,7 @@ public function mergeDependenciesForExtendingTests( } $testDependencies = []; foreach ($temp_array as $testDependencyArray) { - $domDocument = new \DOMDocument(); - $domDocument->load($testDependencyArray[0]["file_path"]); - $filterResult = $this->getAttributesFromDOMNodeList( - $domDocument->getElementsByTagName("group"), - ["type" => "value"] - ); - $excludeGroup = $filterList['excludeGroup']??[]; - if (count(array_intersect( - call_user_func_array('array_merge', $filterResult), - $excludeGroup - ))==0 - ) { + if((empty($filteredTestNames)) || (in_array($testDependencyArray[0]["test_name"],$filteredTestNames))) { $testDependencies[] = [ "file_path" => array_column($testDependencyArray, 'file_path'), "full_name" => $testDependencyArray[0]["full_name"], @@ -200,26 +194,18 @@ public function mergeDependenciesForExtendingTests( } /** - * Return attribute value for each node in DOMNodeList as an array - * - * @param DOMNodeList $nodes - * @param string $attributeName * @return array */ - private function getAttributesFromDOMNodeList($nodes, $attributeName) - { - $attributes = []; - foreach ($nodes as $node) { - if (is_string($attributeName)) { - $attributeValues = $node->getAttribute($attributeName); - } else { - $attributeValues = [$node->getAttribute(key($attributeName)) => - $node->getAttribute($attributeName[key($attributeName)])]; - } - if (!empty($attributeValues)) { - $attributes[] = array_values($attributeValues); - } + public function getFilteredValues(array $filterList) { + + $testObjects = TestObjectHandler::getInstance()->getAllObjects(); + $fileList = new FilterList($filterList); + foreach( $fileList->getFilters() as $filterData) { + $filterData->filter($testObjects); + } + foreach ($testObjects as $testObjects) { + $testNames[] = $testObjects->getName(); } - return array_values($attributes); + return $testNames; } } From 65fcd57f8995052835a5c7199ff51e712c1b8f0c Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 30 Nov 2023 23:02:49 +0530 Subject: [PATCH 571/674] PSR fix --- .../Util/Script/TestDependencyUtil.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index 746ddb3e9..45668a254 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -5,10 +5,9 @@ */ namespace Magento\FunctionalTestingFramework\Util\Script; -use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; +use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Filter\FilterList; - /** * TestDependencyUtil class that contains helper functions for static and upgrade scripts * @@ -174,7 +173,15 @@ public function mergeDependenciesForExtendingTests( } $testDependencies = []; foreach ($temp_array as $testDependencyArray) { - if((empty($filteredTestNames)) || (in_array($testDependencyArray[0]["test_name"],$filteredTestNames))) { + if (( + empty($filteredTestNames)) || + ( + in_array( + $testDependencyArray[0]["test_name"], + $filteredTestNames + ) + ) + ) { $testDependencies[] = [ "file_path" => array_column($testDependencyArray, 'file_path'), "full_name" => $testDependencyArray[0]["full_name"], @@ -196,11 +203,11 @@ public function mergeDependenciesForExtendingTests( /** * @return array */ - public function getFilteredValues(array $filterList) { - + public function getFilteredValues(array $filterList) + { $testObjects = TestObjectHandler::getInstance()->getAllObjects(); $fileList = new FilterList($filterList); - foreach( $fileList->getFilters() as $filterData) { + foreach ($fileList->getFilters() as $filterData) { $filterData->filter($testObjects); } foreach ($testObjects as $testObjects) { From 02faef8161f1075f9f9f1c4b468d1fac47955116 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 30 Nov 2023 23:05:21 +0530 Subject: [PATCH 572/674] PSR fix --- .../Util/Script/TestDependencyUtil.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index 45668a254..a983a55ac 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -201,6 +201,7 @@ public function mergeDependenciesForExtendingTests( } /** + * @param array $filterList * @return array */ public function getFilteredValues(array $filterList) From 629cab3af0358ca90e004e626549e41bb29f85bb Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 30 Nov 2023 23:12:52 +0530 Subject: [PATCH 573/674] changed variable name --- .../Util/Script/TestDependencyUtil.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index a983a55ac..94e6c9df1 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -212,8 +212,8 @@ public function getFilteredValues(array $filterList) $filterData->filter($testObjects); } foreach ($testObjects as $testObjects) { - $testNames[] = $testObjects->getName(); + $testValues[] = $testObjects->getName(); } - return $testNames; + return $testValues; } } From 23d7b6a4d44c78613f2a4d510e172597bf5e8192 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Fri, 1 Dec 2023 11:48:25 +0530 Subject: [PATCH 574/674] Update TestDependencyUtil.php --- .../Util/Script/TestDependencyUtil.php | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index 94e6c9df1..f3ec9a9a4 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -175,13 +175,8 @@ public function mergeDependenciesForExtendingTests( foreach ($temp_array as $testDependencyArray) { if (( empty($filteredTestNames)) || - ( - in_array( - $testDependencyArray[0]["test_name"], - $filteredTestNames - ) - ) - ) { + isset($filteredTestNames[$testDependencyArray[0]["test_name"]]) + ) { $testDependencies[] = [ "file_path" => array_column($testDependencyArray, 'file_path'), "full_name" => $testDependencyArray[0]["full_name"], @@ -211,9 +206,9 @@ public function getFilteredValues(array $filterList) foreach ($fileList->getFilters() as $filterData) { $filterData->filter($testObjects); } - foreach ($testObjects as $testObjects) { - $testValues[] = $testObjects->getName(); - } + $testValues = array_map(function($testObjects) { + return $testObjects->getName(); + }, $testObjects); return $testValues; } } From 7fee1c9b1cb9988119d412d314ee853a771af6b4 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Fri, 1 Dec 2023 11:51:21 +0530 Subject: [PATCH 575/674] Update TestDependencyUtil.php --- .../Util/Script/TestDependencyUtil.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index f3ec9a9a4..048b50058 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -206,7 +206,7 @@ public function getFilteredValues(array $filterList) foreach ($fileList->getFilters() as $filterData) { $filterData->filter($testObjects); } - $testValues = array_map(function($testObjects) { + $testValues = array_map(function ($testObjects) { return $testObjects->getName(); }, $testObjects); return $testValues; From 34fbd157d4da8621a0b044f55de9819f3fb6c818 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Fri, 1 Dec 2023 12:27:35 +0530 Subject: [PATCH 576/674] Update TestDependencyUtil.php --- .../Util/Script/TestDependencyUtil.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index 048b50058..cc023ccfd 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -156,7 +156,7 @@ public function mergeDependenciesForExtendingTests( array $filterList, array $extendedTestMapping = [] ): array { - $filteredTestNames = (count($filterList)>0)?$this->getFilteredValues($filterList):[]; + $filteredTestNames = (count($filterList)>0)?$this->getFilteredTestNames($filterList):[]; $temp_array = array_reverse(array_column($testDependencies, "test_name"), true); if (!empty($extendedTestMapping)) { foreach ($extendedTestMapping as $value) { @@ -199,7 +199,7 @@ public function mergeDependenciesForExtendingTests( * @param array $filterList * @return array */ - public function getFilteredValues(array $filterList) + public function getFilteredTestNames(array $filterList) { $testObjects = TestObjectHandler::getInstance()->getAllObjects(); $fileList = new FilterList($filterList); From d0d8a24a5a43e192f0a7527a4c6cf5fecda3fa2c Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:07:01 +0530 Subject: [PATCH 577/674] Update TestDependencyUtil.php --- .../Util/Script/TestDependencyUtil.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index cc023ccfd..c502ae8c6 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -174,7 +174,7 @@ public function mergeDependenciesForExtendingTests( $testDependencies = []; foreach ($temp_array as $testDependencyArray) { if (( - empty($filteredTestNames)) || + empty($filterList)) || isset($filteredTestNames[$testDependencyArray[0]["test_name"]]) ) { $testDependencies[] = [ From 72366a75e1d9b708f195d28ae4eaf0a350d34060 Mon Sep 17 00:00:00 2001 From: Ji Lu <jilu1@adobe.com> Date: Tue, 28 Nov 2023 10:08:30 -0600 Subject: [PATCH 578/674] ACQE-5855: Change command <magentoCLI> to maintain CLI output and only suppress filepaths --- etc/config/command.php | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/etc/config/command.php b/etc/config/command.php index 0d8fc7997..861d016e8 100644 --- a/etc/config/command.php +++ b/etc/config/command.php @@ -46,10 +46,6 @@ $idleTimeout = true; } - if (checkForFilePath($output)) { - $output = "CLI output suppressed, filepath detected in output."; - } - $exitCode = $process->getExitCode(); if ($process->isSuccessful() || $idleTimeout) { @@ -57,7 +53,9 @@ } else { http_response_code(500); } - echo $output; + + // Suppress file paths from output + echo suppressFilePaths($output); } else { http_response_code(403); echo "Given command not found valid in Magento CLI Command list."; @@ -115,11 +113,21 @@ function trimAfterWhitespace($string) } /** - * Detects file path in string. + * Suppress file paths in string. * @param string $string - * @return boolean + * @return string */ -function checkForFilePath($string) +function suppressFilePaths(string $string): string { - return preg_match('/\/[\S]+\//', $string); + // Match file paths on both *nix and Windows system + $filePathPattern = '~(?:[A-Za-z]:[\\\/]|\\\\|\/)\S+~'; + $replacement = '[suppressed_path]'; + + preg_match_all($filePathPattern, $string, $matches); + if (!empty($matches)) { + foreach ($matches[0] as $match) { + $string = str_replace($match, $replacement, $string); + } + } + return $string; } From b51314ae5f71269286ca20c9d9acf8518112c006 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Sat, 2 Dec 2023 08:09:19 +0530 Subject: [PATCH 579/674] Update TestDependencyUtil.php --- .../Util/Script/TestDependencyUtil.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index c502ae8c6..c0fd0b08f 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -7,6 +7,7 @@ use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Filter\FilterList; +use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig; /** * TestDependencyUtil class that contains helper functions for static and upgrade scripts @@ -195,18 +196,18 @@ public function mergeDependenciesForExtendingTests( return $testDependencies; } - /** + /** * @param array $filterList * @return array */ - public function getFilteredTestNames(array $filterList) + public function getFilteredValues(array $filterList) { $testObjects = TestObjectHandler::getInstance()->getAllObjects(); - $fileList = new FilterList($filterList); - foreach ($fileList->getFilters() as $filterData) { - $filterData->filter($testObjects); + $filters = MftfApplicationConfig::getConfig()->getFilterList()->getFilters(); + foreach ($filters as $filter) { + $filter->filter($testObjects); } - $testValues = array_map(function ($testObjects) { + $testValues = array_map(function($testObjects) { return $testObjects->getName(); }, $testObjects); return $testValues; From f7805f16d0f7cd5454b4337efd071632ac0f096e Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Sat, 2 Dec 2023 08:15:15 +0530 Subject: [PATCH 580/674] PSR fixes --- .../Util/Script/TestDependencyUtil.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index c0fd0b08f..b336b67e6 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -157,7 +157,7 @@ public function mergeDependenciesForExtendingTests( array $filterList, array $extendedTestMapping = [] ): array { - $filteredTestNames = (count($filterList)>0)?$this->getFilteredTestNames($filterList):[]; + $filteredTestNames = (count($filterList)>0)?$this->getFilteredTestNames():[]; $temp_array = array_reverse(array_column($testDependencies, "test_name"), true); if (!empty($extendedTestMapping)) { foreach ($extendedTestMapping as $value) { @@ -196,18 +196,18 @@ public function mergeDependenciesForExtendingTests( return $testDependencies; } - /** - * @param array $filterList + /** + * Return array of merge test modules and file path with same test name. * @return array */ - public function getFilteredValues(array $filterList) + public function getFilteredTestNames() { $testObjects = TestObjectHandler::getInstance()->getAllObjects(); $filters = MftfApplicationConfig::getConfig()->getFilterList()->getFilters(); foreach ($filters as $filter) { $filter->filter($testObjects); } - $testValues = array_map(function($testObjects) { + $testValues = array_map(function ($testObjects) { return $testObjects->getName(); }, $testObjects); return $testValues; From 4c37a7ba72524635bec7f8b626f943829058374c Mon Sep 17 00:00:00 2001 From: Ji Lu <jilu1@adobe.com> Date: Tue, 5 Dec 2023 09:15:52 -0600 Subject: [PATCH 581/674] ACQE-5871: Add ability to increase default MFTF MagentoCLI timeout --- etc/config/.env.example | 3 +++ etc/config/command.php | 2 +- .../Test/Objects/ActionObject.php | 11 ++++++++++- .../FunctionalTestingFramework/Util/TestGenerator.php | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/etc/config/.env.example b/etc/config/.env.example index 3291d1082..b3ec2ad41 100644 --- a/etc/config/.env.example +++ b/etc/config/.env.example @@ -61,6 +61,9 @@ MODULE_ALLOWLIST=Magento_Framework,ConfigurableProductWishlist,ConfigurableProdu #*** Default timeout for wait actions WAIT_TIMEOUT=60 +#*** Default timeout for 'magentoCLI' and 'magentoCLISecret' command +MAGENTO_CLI_WAIT_TIMEOUT=60 + #*** Uncomment and set to enable all tests, regardless of passing status, to have all their Allure artifacts. #VERBOSE_ARTIFACTS=true diff --git a/etc/config/command.php b/etc/config/command.php index 0d8fc7997..3befebc0e 100644 --- a/etc/config/command.php +++ b/etc/config/command.php @@ -14,7 +14,7 @@ $tokenPassedIn = urldecode($_POST['token'] ?? ''); $command = urldecode($_POST['command'] ?? ''); $arguments = urldecode($_POST['arguments'] ?? ''); - $timeout = floatval(urldecode($_POST['timeout'] ?? 60)); + $timeout = floatval(urldecode($_POST['timeout'] ?? getenv('MAGENTO_CLI_WAIT_TIMEOUT'))); // Token returned will be null if the token we passed in is invalid $tokenFromMagento = $tokenModel->loadByToken($tokenPassedIn)->getToken(); diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index 451b58aa0..927c1a69d 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -72,7 +72,6 @@ class ActionObject const ACTION_ATTRIBUTE_VARIABLE_REGEX_PARAMETER = '/\(.+\)/'; const ACTION_ATTRIBUTE_VARIABLE_REGEX_PATTERN = '/({{[\w]+\.[\w\[\]]+}})|({{[\w]+\.[\w]+\((?(?!}}).)+\)}})/'; const STRING_PARAMETER_REGEX = "/'[^']+'/"; - const DEFAULT_COMMAND_WAIT_TIMEOUT = 60; const ACTION_ATTRIBUTE_USERINPUT = 'userInput'; const ACTION_TYPE_COMMENT = 'comment'; const ACTION_TYPE_HELPER = 'helper'; @@ -184,6 +183,16 @@ public static function getDefaultWaitTimeout() return getenv('WAIT_TIMEOUT'); } + /** + * Retrieve default timeout for 'magentoCLI' or 'magentoCLISecret' in seconds + * + * @return integer + */ + public static function getDefaultMagentoCLIWaitTimeout() + { + return getenv('MAGENTO_CLI_WAIT_TIMEOUT'); + } + /** * This function returns the string property stepKey. * diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 0dfb0f8ee..46a05c946 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -842,7 +842,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato } if (in_array($actionObject->getType(), ActionObject::COMMAND_ACTION_ATTRIBUTES)) { - $time = $time ?? ActionObject::DEFAULT_COMMAND_WAIT_TIMEOUT; + $time = $time ?? ActionObject::getDefaultMagentoCLIWaitTimeout(); } else { $time = $time ?? ActionObject::getDefaultWaitTimeout(); } From a8cce501be2201999990513ede6b7598079b891b Mon Sep 17 00:00:00 2001 From: Ji Lu <jilu1@adobe.com> Date: Tue, 5 Dec 2023 16:07:32 -0600 Subject: [PATCH 582/674] ACQE-5871: Add ability to increase default MagentoCLI timeout --- .../verification/Resources/MagentoCliTest.txt | 59 +++++++++++++++++++ .../BasicFunctionalTest/MagentoCliTest.xml | 16 +++++ .../Tests/BasicCestGenerationTest.php | 13 ++++ .../Test/Objects/ActionObject.php | 4 +- 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 dev/tests/verification/Resources/MagentoCliTest.txt create mode 100644 dev/tests/verification/TestModule/Test/BasicFunctionalTest/MagentoCliTest.xml diff --git a/dev/tests/verification/Resources/MagentoCliTest.txt b/dev/tests/verification/Resources/MagentoCliTest.txt new file mode 100644 index 000000000..3efc73c01 --- /dev/null +++ b/dev/tests/verification/Resources/MagentoCliTest.txt @@ -0,0 +1,59 @@ +<?php +namespace Magento\AcceptanceTest\_default\Backend; + +use Magento\FunctionalTestingFramework\AcceptanceTester; +use \Codeception\Util\Locator; +use Yandex\Allure\Adapter\Annotation\Features; +use Yandex\Allure\Adapter\Annotation\Stories; +use Yandex\Allure\Adapter\Annotation\Title; +use Yandex\Allure\Adapter\Annotation\Description; +use Yandex\Allure\Adapter\Annotation\Parameter; +use Yandex\Allure\Adapter\Annotation\Severity; +use Yandex\Allure\Adapter\Model\SeverityLevel; +use Yandex\Allure\Adapter\Annotation\TestCaseId; + +/** + * @Description("<h3>Test files</h3>verification/TestModule/Test/BasicFunctionalTest/MagentoCliTest.xml<br>") + */ +class MagentoCliTestCest +{ + /** + * @var bool + */ + private $isSuccess = false; + + /** + * @param AcceptanceTester $I + * @throws \Exception + */ + public function _after(AcceptanceTester $I) + { + if ($this->isSuccess) { + unlink(__FILE__); + } + } + + /** + * @Features({"TestModule"}) + * @param AcceptanceTester $I + * @return void + * @throws \Exception + */ + public function MagentoCliTest(AcceptanceTester $I) + { + $magentoCli1 = $I->magentoCLI("maintenance:enable", 45, "\"stuffHere\""); // stepKey: magentoCli1 + $I->comment($magentoCli1); + $magentoCli2 = $I->magentoCLI("maintenance:enable", 120, "\"stuffHere\""); // stepKey: magentoCli2 + $I->comment($magentoCli2); + $magentoCli3 = $I->magentoCLISecret("config:set somePath " . $I->getSecret("someKey"), 45); // stepKey: magentoCli3 + $I->comment($magentoCli3); // stepKey: magentoCli3 + $magentoCli4 = $I->magentoCLISecret("config:set somePath " . $I->getSecret("someKey"), 120); // stepKey: magentoCli4 + $I->comment($magentoCli4); // stepKey: magentoCli4 + } + + public function _passed(AcceptanceTester $I) + { + // Test passed successfully. + $this->isSuccess = true; + } +} diff --git a/dev/tests/verification/TestModule/Test/BasicFunctionalTest/MagentoCliTest.xml b/dev/tests/verification/TestModule/Test/BasicFunctionalTest/MagentoCliTest.xml new file mode 100644 index 000000000..23914943a --- /dev/null +++ b/dev/tests/verification/TestModule/Test/BasicFunctionalTest/MagentoCliTest.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> + <test name="MagentoCliTest"> + <magentoCLI command="maintenance:enable" arguments=""stuffHere"" stepKey="magentoCli1"/> + <magentoCLI command="maintenance:enable" arguments=""stuffHere"" timeout="120" stepKey="magentoCli2"/> + <magentoCLI command="config:set somePath {{_CREDS.someKey}}" stepKey="magentoCli3"/> + <magentoCLI command="config:set somePath {{_CREDS.someKey}}" timeout="120" stepKey="magentoCli4"/> + </test> +</tests> diff --git a/dev/tests/verification/Tests/BasicCestGenerationTest.php b/dev/tests/verification/Tests/BasicCestGenerationTest.php index 39802c50d..a900edbd3 100644 --- a/dev/tests/verification/Tests/BasicCestGenerationTest.php +++ b/dev/tests/verification/Tests/BasicCestGenerationTest.php @@ -59,4 +59,17 @@ public function testWithXmlComments() { $this->generateAndCompareTest('XmlCommentedTest'); } + + /** + * Tests magentoCLI and magentoCLISecret commands with env 'MAGENTO_CLI_WAIT_TIMEOUT' set + * + * @throws \Exception + * @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException + */ + public function testMagentoCli() + { + putenv("MAGENTO_CLI_WAIT_TIMEOUT=45"); + $this->generateAndCompareTest('MagentoCliTest'); + putenv("MAGENTO_CLI_WAIT_TIMEOUT"); + } } diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index 927c1a69d..f0ff060a6 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -72,6 +72,7 @@ class ActionObject const ACTION_ATTRIBUTE_VARIABLE_REGEX_PARAMETER = '/\(.+\)/'; const ACTION_ATTRIBUTE_VARIABLE_REGEX_PATTERN = '/({{[\w]+\.[\w\[\]]+}})|({{[\w]+\.[\w]+\((?(?!}}).)+\)}})/'; const STRING_PARAMETER_REGEX = "/'[^']+'/"; + const DEFAULT_COMMAND_WAIT_TIMEOUT = 60; const ACTION_ATTRIBUTE_USERINPUT = 'userInput'; const ACTION_TYPE_COMMENT = 'comment'; const ACTION_TYPE_HELPER = 'helper'; @@ -190,7 +191,8 @@ public static function getDefaultWaitTimeout() */ public static function getDefaultMagentoCLIWaitTimeout() { - return getenv('MAGENTO_CLI_WAIT_TIMEOUT'); + $timeout = getenv('MAGENTO_CLI_WAIT_TIMEOUT'); + return $timeout !== false ? $timeout : self::DEFAULT_COMMAND_WAIT_TIMEOUT; } /** From c9b38d48933298e300ad4839878313c5fd481611 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Wed, 6 Dec 2023 11:34:15 +0530 Subject: [PATCH 583/674] MFTF-4.6.0-Release : MFTF 4.6.0 Release --- CHANGELOG.md | 12 ++++++++++++ composer.json | 2 +- composer.lock | 2 +- .../FunctionalTestingFramework/Util/Script/test | 0 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 src/Magento/FunctionalTestingFramework/Util/Script/test diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ff1b1ca2..a6178791e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ Magento Functional Testing Framework Changelog ================================================ + +4.6.0 +--------- +### Enhancements +* Added Supported for PHP 8.3 and enabled PR checks for PHP 8.3 +* Bumped `symfony/console` dependency to `^6.0` +* Bumped `laminas/laminas-diactoros` dependency to `^3.0` + +### Fixes +* Fixed 8.3 deprecation errors. +* Fixed The build with PTS enabled doesn't apply filter issue. + 4.5.0 --------- ### Enhancements diff --git a/composer.json b/composer.json index 60d38b43e..ac0c8a43d 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": "4.5.0", + "version": "4.6.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 38129a0bb..311e13e11 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": "110d62a7ca74f5100e6bc724335e5bb7", + "content-hash": "a0ebd24d0c275a654005c55f65b58e22", "packages": [ { "name": "allure-framework/allure-codeception", diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/test b/src/Magento/FunctionalTestingFramework/Util/Script/test new file mode 100644 index 000000000..e69de29bb From 190df44274c30ea8b9dbbb7a08d135098c4e9a90 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Wed, 6 Dec 2023 14:18:12 +0530 Subject: [PATCH 584/674] Updated changelog.md file --- CHANGELOG.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6178791e..8281c83ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,13 +4,15 @@ Magento Functional Testing Framework Changelog 4.6.0 --------- ### Enhancements -* Added Supported for PHP 8.3 and enabled PR checks for PHP 8.3 -* Bumped `symfony/console` dependency to `^6.0` -* Bumped `laminas/laminas-diactoros` dependency to `^3.0` +* Added Supported for PHP 8.3 and enabled PR checks for PHP 8.3. +* Bumped `symfony/console` dependency to `^6.0`. +* Bumped `laminas/laminas-diactoros` dependency to `^3.0`. +* Added no-ansi option to bin/mftf command. ### Fixes * Fixed 8.3 deprecation errors. * Fixed The build with PTS enabled doesn't apply filter issue. +* Change MFTF command <magentoCLI> to maintain Magento CLI output. 4.5.0 --------- From c24e4c8c1050c94400b6d834184e62fc3fc198fd Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Wed, 6 Dec 2023 14:20:43 +0530 Subject: [PATCH 585/674] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8281c83ab..555942bd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Magento Functional Testing Framework Changelog 4.6.0 --------- ### Enhancements -* Added Supported for PHP 8.3 and enabled PR checks for PHP 8.3. +* Added Support for PHP 8.3 and enabled PR checks for PHP 8.3. * Bumped `symfony/console` dependency to `^6.0`. * Bumped `laminas/laminas-diactoros` dependency to `^3.0`. * Added no-ansi option to bin/mftf command. From 6041d83af64677b971f19159d87610f140d38421 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Wed, 6 Dec 2023 10:58:45 -0600 Subject: [PATCH 586/674] Removing blank test file --- src/Magento/FunctionalTestingFramework/Util/Script/test | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/Magento/FunctionalTestingFramework/Util/Script/test diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/test b/src/Magento/FunctionalTestingFramework/Util/Script/test deleted file mode 100644 index e69de29bb..000000000 From ba12fc1a3025a7c96e7ce093c313911542bc2d36 Mon Sep 17 00:00:00 2001 From: Rajesh Kumar <glo71317@adobe.com> Date: Thu, 7 Dec 2023 17:51:53 +0530 Subject: [PATCH 587/674] AC-9499::Update Symfony dependency packages to the latest LTS versions 6.4 --- composer.lock | 741 ++++++++++++++++++-------------------------------- 1 file changed, 272 insertions(+), 469 deletions(-) diff --git a/composer.lock b/composer.lock index 38129a0bb..c0e5b1a36 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": "110d62a7ca74f5100e6bc724335e5bb7", + "content-hash": "059566f8f5654d2356cac26b04eceaac", "packages": [ { "name": "allure-framework/allure-codeception", @@ -213,16 +213,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.3", + "version": "v1.2.4", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "5545a4fa310aec39f54279fdacebcce33b3ff382" + "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/5545a4fa310aec39f54279fdacebcce33b3ff382", - "reference": "5545a4fa310aec39f54279fdacebcce33b3ff382", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/eb0c6e4e142224a10b08f49ebf87f32611d162b2", + "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2", "shasum": "" }, "require": { @@ -261,22 +261,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.3" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.4" }, - "time": "2023-10-16T20:10:06+00:00" + "time": "2023-11-08T00:42:13+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.285.3", + "version": "3.293.5", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "afa1e722f1b2c95644f375dc1a19072e4daf67be" + "reference": "f2002e52b382b45231da3f9552033f769acfebd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/afa1e722f1b2c95644f375dc1a19072e4daf67be", - "reference": "afa1e722f1b2c95644f375dc1a19072e4daf67be", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/f2002e52b382b45231da3f9552033f769acfebd8", + "reference": "f2002e52b382b45231da3f9552033f769acfebd8", "shasum": "" }, "require": { @@ -356,76 +356,9 @@ "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.285.3" + "source": "https://github.com/aws/aws-sdk-php/tree/3.293.5" }, - "time": "2023-11-09T19:07:19+00:00" - }, - { - "name": "beberlei/assert", - "version": "v3.3.2", - "source": { - "type": "git", - "url": "https://github.com/beberlei/assert.git", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "php": "^7.0 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "*", - "phpstan/phpstan": "*", - "phpunit/phpunit": ">=6.0.0", - "yoast/phpunit-polyfills": "^0.1.0" - }, - "suggest": { - "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles" - }, - "type": "library", - "autoload": { - "files": [ - "lib/Assert/functions.php" - ], - "psr-4": { - "Assert\\": "lib/Assert" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de", - "role": "Lead Developer" - }, - { - "name": "Richard Quadling", - "email": "rquadling@gmail.com", - "role": "Collaborator" - } - ], - "description": "Thin assertion library for input validation in business models.", - "keywords": [ - "assert", - "assertion", - "validation" - ], - "support": { - "issues": "https://github.com/beberlei/assert/issues", - "source": "https://github.com/beberlei/assert/tree/v3.3.2" - }, - "time": "2021-12-16T21:41:27+00:00" + "time": "2023-12-06T19:09:15+00:00" }, { "name": "behat/gherkin", @@ -717,23 +650,23 @@ }, { "name": "codeception/lib-web", - "version": "1.0.2", + "version": "1.0.4", "source": { "type": "git", "url": "https://github.com/Codeception/lib-web.git", - "reference": "f488ff9bc08c8985d43796db28da0bd18813bcae" + "reference": "28cb2ed1169de18e720bec758015aadc37d8344c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/lib-web/zipball/f488ff9bc08c8985d43796db28da0bd18813bcae", - "reference": "f488ff9bc08c8985d43796db28da0bd18813bcae", + "url": "https://api.github.com/repos/Codeception/lib-web/zipball/28cb2ed1169de18e720bec758015aadc37d8344c", + "reference": "28cb2ed1169de18e720bec758015aadc37d8344c", "shasum": "" }, "require": { "ext-mbstring": "*", "guzzlehttp/psr7": "^2.0", "php": "^8.0", - "symfony/css-selector": ">=4.4.24 <7.0" + "symfony/css-selector": ">=4.4.24 <8.0" }, "conflict": { "codeception/codeception": "<5.0.0-alpha3" @@ -764,9 +697,9 @@ ], "support": { "issues": "https://github.com/Codeception/lib-web/issues", - "source": "https://github.com/Codeception/lib-web/tree/1.0.2" + "source": "https://github.com/Codeception/lib-web/tree/1.0.4" }, - "time": "2023-04-18T20:32:51+00:00" + "time": "2023-12-01T11:38:22+00:00" }, { "name": "codeception/module-asserts", @@ -1460,16 +1393,16 @@ }, { "name": "composer/spdx-licenses", - "version": "1.5.7", + "version": "1.5.8", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "c848241796da2abf65837d51dce1fae55a960149" + "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", - "reference": "c848241796da2abf65837d51dce1fae55a960149", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", + "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", "shasum": "" }, "require": { @@ -1518,9 +1451,9 @@ "validator" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.8" }, "funding": [ { @@ -1536,7 +1469,7 @@ "type": "tidelift" } ], - "time": "2022-05-23T07:37:50+00:00" + "time": "2023-11-20T07:44:33+00:00" }, { "name": "composer/xdebug-handler", @@ -1606,19 +1539,20 @@ }, { "name": "csharpru/vault-php", - "version": "4.3.1", + "version": "4.4.0", "source": { "type": "git", "url": "https://github.com/CSharpRU/vault-php.git", - "reference": "918bfffe85d3b290e1bf667b5f14e521fdc0063c" + "reference": "ba4cbd7b55f1ce10bc72a7e4c36cfd87a42d3573" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CSharpRU/vault-php/zipball/918bfffe85d3b290e1bf667b5f14e521fdc0063c", - "reference": "918bfffe85d3b290e1bf667b5f14e521fdc0063c", + "url": "https://api.github.com/repos/CSharpRU/vault-php/zipball/ba4cbd7b55f1ce10bc72a7e4c36cfd87a42d3573", + "reference": "ba4cbd7b55f1ce10bc72a7e4c36cfd87a42d3573", "shasum": "" }, "require": { + "aws/aws-sdk-php": "^3.0", "ext-json": "*", "php": "^7.2 || ^8.0", "psr/cache": "^1.0|^2.0|^3.0", @@ -1662,9 +1596,9 @@ ], "support": { "issues": "https://github.com/CSharpRU/vault-php/issues", - "source": "https://github.com/CSharpRU/vault-php/tree/4.3.1" + "source": "https://github.com/CSharpRU/vault-php/tree/4.4.0" }, - "time": "2022-04-04T08:31:44+00:00" + "time": "2023-11-22T11:38:41+00:00" }, { "name": "doctrine/annotations", @@ -1891,16 +1825,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.8.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", "shasum": "" }, "require": { @@ -1915,11 +1849,11 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -1997,7 +1931,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.0" + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" }, "funding": [ { @@ -2013,28 +1947,28 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:20:53+00:00" + "time": "2023-12-03T20:35:24+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", - "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "type": "library", "extra": { @@ -2080,7 +2014,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.1" + "source": "https://github.com/guzzle/promises/tree/2.0.2" }, "funding": [ { @@ -2096,20 +2030,20 @@ "type": "tidelift" } ], - "time": "2023-08-03T15:11:55+00:00" + "time": "2023-12-03T20:19:20+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.1", + "version": "2.6.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", "shasum": "" }, "require": { @@ -2123,9 +2057,9 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -2196,7 +2130,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.1" + "source": "https://github.com/guzzle/psr7/tree/2.6.2" }, "funding": [ { @@ -2212,7 +2146,7 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:13:57+00:00" + "time": "2023-12-03T20:05:35+00:00" }, { "name": "justinrainbow/json-schema", @@ -3267,16 +3201,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.13", + "version": "9.6.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" + "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", - "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/05017b80304e0eb3f31d90194a563fd53a6021f1", + "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1", "shasum": "" }, "require": { @@ -3350,7 +3284,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.15" }, "funding": [ { @@ -3366,7 +3300,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T05:39:22+00:00" + "time": "2023-12-01T16:55:19+00:00" }, { "name": "psr/cache", @@ -4037,24 +3971,24 @@ }, { "name": "react/promise", - "version": "v3.0.0", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "c86753c76fd3be465d93b308f18d189f01a22be4" + "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/c86753c76fd3be465d93b308f18d189f01a22be4", - "reference": "c86753c76fd3be465d93b308f18d189f01a22be4", + "url": "https://api.github.com/repos/reactphp/promise/zipball/e563d55d1641de1dea9f5e84f3cccc66d2bfe02c", + "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c", "shasum": "" }, "require": { "php": ">=7.1.0" }, "require-dev": { - "phpstan/phpstan": "1.10.20 || 1.4.10", - "phpunit/phpunit": "^9.5 || ^7.5" + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", "autoload": { @@ -4098,7 +4032,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.0.0" + "source": "https://github.com/reactphp/promise/tree/v3.1.0" }, "funding": [ { @@ -4106,7 +4040,7 @@ "type": "open_collective" } ], - "time": "2023-07-11T16:12:49+00:00" + "time": "2023-11-16T16:21:57+00:00" }, { "name": "sebastian/cli-parser", @@ -5247,43 +5181,38 @@ }, { "name": "spomky-labs/otphp", - "version": "v10.0.3", + "version": "11.2.0", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "9784d9f7c790eed26e102d6c78f12c754036c366" + "reference": "9a1569038bb1c8e98040b14b8bcbba54f25e7795" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9784d9f7c790eed26e102d6c78f12c754036c366", - "reference": "9784d9f7c790eed26e102d6c78f12c754036c366", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9a1569038bb1c8e98040b14b8bcbba54f25e7795", + "reference": "9a1569038bb1c8e98040b14b8bcbba54f25e7795", "shasum": "" }, "require": { - "beberlei/assert": "^3.0", "ext-mbstring": "*", "paragonie/constant_time_encoding": "^2.0", - "php": "^7.2|^8.0", - "thecodingmachine/safe": "^0.1.14|^1.0|^2.0" + "php": "^8.1" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-beberlei-assert": "^0.12", - "phpstan/phpstan-deprecation-rules": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^8.0", - "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0" + "ekino/phpstan-banned-code": "^1.0", + "infection/infection": "^0.26", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5.26", + "qossmic/deptrac-shim": "^1.0", + "rector/rector": "^0.15", + "symfony/phpunit-bridge": "^6.1", + "symplify/easy-coding-standard": "^11.0" }, "type": "library", - "extra": { - "branch-alias": { - "v10.0": "10.0.x-dev", - "v9.0": "9.0.x-dev", - "v8.3": "8.3.x-dev" - } - }, "autoload": { "psr-4": { "OTPHP\\": "src/" @@ -5316,22 +5245,32 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.3" + "source": "https://github.com/Spomky-Labs/otphp/tree/11.2.0" }, - "time": "2022-03-17T08:00:35+00:00" + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2023-03-16T19:16:25+00:00" }, { "name": "symfony/console", - "version": "v5.4.28", + "version": "v5.4.32", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827" + "reference": "c70df1ffaf23a8d340bded3cfab1b86752ad6ed7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827", + "url": "https://api.github.com/repos/symfony/console/zipball/c70df1ffaf23a8d340bded3cfab1b86752ad6ed7", + "reference": "c70df1ffaf23a8d340bded3cfab1b86752ad6ed7", "shasum": "" }, "require": { @@ -5401,7 +5340,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.28" + "source": "https://github.com/symfony/console/tree/v5.4.32" }, "funding": [ { @@ -5417,20 +5356,20 @@ "type": "tidelift" } ], - "time": "2023-08-07T06:12:30+00:00" + "time": "2023-11-18T18:23:04+00:00" }, { "name": "symfony/css-selector", - "version": "v6.3.2", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "883d961421ab1709877c10ac99451632a3d6fa57" + "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", - "reference": "883d961421ab1709877c10ac99451632a3d6fa57", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/d036c6c0d0b09e24a14a35f8292146a658f986e4", + "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4", "shasum": "" }, "require": { @@ -5466,7 +5405,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.3.2" + "source": "https://github.com/symfony/css-selector/tree/v6.4.0" }, "funding": [ { @@ -5482,11 +5421,11 @@ "type": "tidelift" } ], - "time": "2023-07-12T16:00:22+00:00" + "time": "2023-10-31T08:40:20+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", @@ -5533,7 +5472,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" }, "funding": [ { @@ -5553,16 +5492,16 @@ }, { "name": "symfony/dotenv", - "version": "v6.3.7", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e" + "reference": "d0d584a91422ddaa2c94317200d4c4e5b935555f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e", - "reference": "7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/d0d584a91422ddaa2c94317200d4c4e5b935555f", + "reference": "d0d584a91422ddaa2c94317200d4c4e5b935555f", "shasum": "" }, "require": { @@ -5573,8 +5512,8 @@ "symfony/process": "<5.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5607,7 +5546,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.3.7" + "source": "https://github.com/symfony/dotenv/tree/v6.4.0" }, "funding": [ { @@ -5623,20 +5562,20 @@ "type": "tidelift" } ], - "time": "2023-10-26T18:15:14+00:00" + "time": "2023-10-26T18:19:48+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.3.2", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" + "reference": "d76d2632cfc2206eecb5ad2b26cd5934082941b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", - "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d76d2632cfc2206eecb5ad2b26cd5934082941b6", + "reference": "d76d2632cfc2206eecb5ad2b26cd5934082941b6", "shasum": "" }, "require": { @@ -5653,13 +5592,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5687,7 +5626,7 @@ "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/v6.3.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.0" }, "funding": [ { @@ -5703,11 +5642,11 @@ "type": "tidelift" } ], - "time": "2023-07-06T06:56:43+00:00" + "time": "2023-07-27T06:52:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", @@ -5763,7 +5702,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" }, "funding": [ { @@ -5783,16 +5722,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.3.1", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" + "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", - "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/952a8cb588c3bc6ce76f6023000fb932f16a6e59", + "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59", "shasum": "" }, "require": { @@ -5826,7 +5765,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.3.1" + "source": "https://github.com/symfony/filesystem/tree/v6.4.0" }, "funding": [ { @@ -5842,27 +5781,27 @@ "type": "tidelift" } ], - "time": "2023-06-01T08:30:39+00:00" + "time": "2023-07-26T17:27:13+00:00" }, { "name": "symfony/finder", - "version": "v6.3.5", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", - "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", + "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { - "symfony/filesystem": "^6.0" + "symfony/filesystem": "^6.0|^7.0" }, "type": "library", "autoload": { @@ -5890,7 +5829,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.5" + "source": "https://github.com/symfony/finder/tree/v6.4.0" }, "funding": [ { @@ -5906,20 +5845,20 @@ "type": "tidelift" } ], - "time": "2023-09-26T12:56:25+00:00" + "time": "2023-10-31T17:30:12+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.3.7", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e" + "reference": "44a6d39a9cc11e154547d882d5aac1e014440771" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/59d1837d5d992d16c2628cd0d6b76acf8d69b33e", - "reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/44a6d39a9cc11e154547d882d5aac1e014440771", + "reference": "44a6d39a9cc11e154547d882d5aac1e014440771", "shasum": "" }, "require": { @@ -5934,12 +5873,12 @@ "require-dev": { "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.3", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^5.4|^6.0", - "symfony/rate-limiter": "^5.2|^6.0" + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5967,7 +5906,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.7" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.0" }, "funding": [ { @@ -5983,20 +5922,20 @@ "type": "tidelift" } ], - "time": "2023-10-28T23:55:27+00:00" + "time": "2023-11-20T16:41:16+00:00" }, { "name": "symfony/mime", - "version": "v6.3.5", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e" + "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/d5179eedf1cb2946dbd760475ebf05c251ef6a6e", - "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "url": "https://api.github.com/repos/symfony/mime/zipball/ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", + "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", "shasum": "" }, "require": { @@ -6010,16 +5949,16 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" + "symfony/serializer": "<6.3.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "~6.2.13|^6.3.2" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.3.2|^7.0" }, "type": "library", "autoload": { @@ -6051,7 +5990,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.3.5" + "source": "https://github.com/symfony/mime/tree/v6.4.0" }, "funding": [ { @@ -6067,7 +6006,7 @@ "type": "tidelift" } ], - "time": "2023-09-29T06:59:36+00:00" + "time": "2023-10-17T11:49:05+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6885,16 +6824,16 @@ }, { "name": "symfony/process", - "version": "v6.3.4", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" + "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", - "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", + "url": "https://api.github.com/repos/symfony/process/zipball/191703b1566d97a5425dc969e4350d32b8ef17aa", + "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa", "shasum": "" }, "require": { @@ -6926,7 +6865,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.3.4" + "source": "https://github.com/symfony/process/tree/v6.4.0" }, "funding": [ { @@ -6942,20 +6881,20 @@ "type": "tidelift" } ], - "time": "2023-08-07T10:39:22+00:00" + "time": "2023-11-17T21:06:49+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", "shasum": "" }, "require": { @@ -7008,7 +6947,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" }, "funding": [ { @@ -7024,20 +6963,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2023-07-30T20:28:31+00:00" }, { "name": "symfony/string", - "version": "v6.3.5", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339" + "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/13d76d0fb049051ed12a04bef4f9de8715bea339", - "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339", + "url": "https://api.github.com/repos/symfony/string/zipball/b45fcf399ea9c3af543a92edf7172ba21174d809", + "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809", "shasum": "" }, "require": { @@ -7051,11 +6990,11 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/intl": "^6.2", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -7094,7 +7033,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.5" + "source": "https://github.com/symfony/string/tree/v6.4.0" }, "funding": [ { @@ -7110,20 +7049,20 @@ "type": "tidelift" } ], - "time": "2023-09-18T10:38:32+00:00" + "time": "2023-11-28T20:41:49+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.3.6", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97" + "reference": "c40f7d17e91d8b407582ed51a2bbf83c52c367f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/999ede244507c32b8e43aebaa10e9fce20de7c97", - "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c40f7d17e91d8b407582ed51a2bbf83c52c367f6", + "reference": "c40f7d17e91d8b407582ed51a2bbf83c52c367f6", "shasum": "" }, "require": { @@ -7136,10 +7075,11 @@ }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", "twig/twig": "^2.13|^3.0.4" }, "bin": [ @@ -7178,7 +7118,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.6" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.0" }, "funding": [ { @@ -7194,20 +7134,20 @@ "type": "tidelift" } ], - "time": "2023-10-12T18:45:56+00:00" + "time": "2023-11-09T08:28:32+00:00" }, { "name": "symfony/yaml", - "version": "v6.3.7", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "9758b6c69d179936435d0ffb577c3708d57e38a8" + "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/9758b6c69d179936435d0ffb577c3708d57e38a8", - "reference": "9758b6c69d179936435d0ffb577c3708d57e38a8", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587", + "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587", "shasum": "" }, "require": { @@ -7219,7 +7159,7 @@ "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -7250,7 +7190,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.3.7" + "source": "https://github.com/symfony/yaml/tree/v6.4.0" }, "funding": [ { @@ -7266,159 +7206,20 @@ "type": "tidelift" } ], - "time": "2023-10-28T23:31:00+00:00" - }, - { - "name": "thecodingmachine/safe", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/thecodingmachine/safe.git", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "shasum": "" - }, - "require": { - "php": "^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "^3.2", - "thecodingmachine/phpstan-strict-rules": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "files": [ - "deprecated/apc.php", - "deprecated/array.php", - "deprecated/datetime.php", - "deprecated/libevent.php", - "deprecated/misc.php", - "deprecated/password.php", - "deprecated/mssql.php", - "deprecated/stats.php", - "deprecated/strings.php", - "lib/special_cases.php", - "deprecated/mysqli.php", - "generated/apache.php", - "generated/apcu.php", - "generated/array.php", - "generated/bzip2.php", - "generated/calendar.php", - "generated/classobj.php", - "generated/com.php", - "generated/cubrid.php", - "generated/curl.php", - "generated/datetime.php", - "generated/dir.php", - "generated/eio.php", - "generated/errorfunc.php", - "generated/exec.php", - "generated/fileinfo.php", - "generated/filesystem.php", - "generated/filter.php", - "generated/fpm.php", - "generated/ftp.php", - "generated/funchand.php", - "generated/gettext.php", - "generated/gmp.php", - "generated/gnupg.php", - "generated/hash.php", - "generated/ibase.php", - "generated/ibmDb2.php", - "generated/iconv.php", - "generated/image.php", - "generated/imap.php", - "generated/info.php", - "generated/inotify.php", - "generated/json.php", - "generated/ldap.php", - "generated/libxml.php", - "generated/lzf.php", - "generated/mailparse.php", - "generated/mbstring.php", - "generated/misc.php", - "generated/mysql.php", - "generated/network.php", - "generated/oci8.php", - "generated/opcache.php", - "generated/openssl.php", - "generated/outcontrol.php", - "generated/pcntl.php", - "generated/pcre.php", - "generated/pgsql.php", - "generated/posix.php", - "generated/ps.php", - "generated/pspell.php", - "generated/readline.php", - "generated/rpminfo.php", - "generated/rrd.php", - "generated/sem.php", - "generated/session.php", - "generated/shmop.php", - "generated/sockets.php", - "generated/sodium.php", - "generated/solr.php", - "generated/spl.php", - "generated/sqlsrv.php", - "generated/ssdeep.php", - "generated/ssh2.php", - "generated/stream.php", - "generated/strings.php", - "generated/swoole.php", - "generated/uodbc.php", - "generated/uopz.php", - "generated/url.php", - "generated/var.php", - "generated/xdiff.php", - "generated/xml.php", - "generated/xmlrpc.php", - "generated/yaml.php", - "generated/yaz.php", - "generated/zip.php", - "generated/zlib.php" - ], - "classmap": [ - "lib/DateTime.php", - "lib/DateTimeImmutable.php", - "lib/Exceptions/", - "deprecated/Exceptions/", - "generated/Exceptions/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHP core functions that throw exceptions instead of returning FALSE on error", - "support": { - "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" - }, - "time": "2023-04-05T11:54:14+00:00" + "time": "2023-11-06T11:00:25+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -7447,7 +7248,7 @@ "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/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -7455,7 +7256,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" }, { "name": "weew/helpers-array", @@ -7701,23 +7502,24 @@ }, { "name": "pdepend/pdepend", - "version": "2.15.1", + "version": "2.16.0", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "d12f25bcdfb7754bea458a4a5cb159d55e9950d0" + "reference": "8dfc0c46529e2073fa97986552f80646eedac562" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/d12f25bcdfb7754bea458a4a5cb159d55e9950d0", - "reference": "d12f25bcdfb7754bea458a4a5cb159d55e9950d0", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/8dfc0c46529e2073fa97986552f80646eedac562", + "reference": "8dfc0c46529e2073fa97986552f80646eedac562", "shasum": "" }, "require": { "php": ">=5.3.7", - "symfony/config": "^2.3.0|^3|^4|^5|^6.0", - "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0", - "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0" + "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/polyfill-mbstring": "^1.19" }, "require-dev": { "easy-doc/easy-doc": "0.0.0|^1.2.3", @@ -7752,7 +7554,7 @@ ], "support": { "issues": "https://github.com/pdepend/pdepend/issues", - "source": "https://github.com/pdepend/pdepend/tree/2.15.1" + "source": "https://github.com/pdepend/pdepend/tree/2.16.0" }, "funding": [ { @@ -7760,32 +7562,32 @@ "type": "tidelift" } ], - "time": "2023-09-28T12:00:56+00:00" + "time": "2023-11-29T08:52:35+00:00" }, { "name": "php-coveralls/php-coveralls", - "version": "v2.6.0", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "9e88d7d38e9eab7c675da674481784321ea7a9bc" + "reference": "b36fa4394e519dafaddc04ae03976bc65a25ba15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9e88d7d38e9eab7c675da674481784321ea7a9bc", - "reference": "9e88d7d38e9eab7c675da674481784321ea7a9bc", + "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/b36fa4394e519dafaddc04ae03976bc65a25ba15", + "reference": "b36fa4394e519dafaddc04ae03976bc65a25ba15", "shasum": "" }, "require": { "ext-json": "*", "ext-simplexml": "*", "guzzlehttp/guzzle": "^6.0 || ^7.0", - "php": "^5.5 || ^7.0 || ^8.0", + "php": "^7.0 || ^8.0", "psr/log": "^1.0 || ^2.0", - "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || >=8.0 <8.5.29 || >=9.0 <9.5.23", @@ -7841,9 +7643,9 @@ ], "support": { "issues": "https://github.com/php-coveralls/php-coveralls/issues", - "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.6.0" + "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.7.0" }, - "time": "2023-07-16T08:39:10+00:00" + "time": "2023-11-22T10:21:01+00:00" }, { "name": "phpmd/phpmd", @@ -8050,22 +7852,22 @@ }, { "name": "symfony/config", - "version": "v6.3.2", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467" + "reference": "5d33e0fb707d603330e0edfd4691803a1253572e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", - "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", + "url": "https://api.github.com/repos/symfony/config/zipball/5d33e0fb707d603330e0edfd4691803a1253572e", + "reference": "5d33e0fb707d603330e0edfd4691803a1253572e", "shasum": "" }, "require": { "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -8073,11 +7875,11 @@ "symfony/service-contracts": "<2.5" }, "require-dev": { - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0" + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8105,7 +7907,7 @@ "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/v6.3.2" + "source": "https://github.com/symfony/config/tree/v6.4.0" }, "funding": [ { @@ -8121,20 +7923,20 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:22:16+00:00" + "time": "2023-11-09T08:28:32+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.3.5", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "2ed62b3bf98346e1f45529a7b6be2196739bb993" + "reference": "f88ff6428afbeb17cc648c8003bd608534750baf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2ed62b3bf98346e1f45529a7b6be2196739bb993", - "reference": "2ed62b3bf98346e1f45529a7b6be2196739bb993", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f88ff6428afbeb17cc648c8003bd608534750baf", + "reference": "f88ff6428afbeb17cc648c8003bd608534750baf", "shasum": "" }, "require": { @@ -8142,7 +7944,7 @@ "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.2.10" + "symfony/var-exporter": "^6.2.10|^7.0" }, "conflict": { "ext-psr": "<1.1|>=2", @@ -8156,9 +7958,9 @@ "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/config": "^6.1", - "symfony/expression-language": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" + "symfony/config": "^6.1|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8186,7 +7988,7 @@ "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/v6.3.5" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.1" }, "funding": [ { @@ -8202,11 +8004,11 @@ "type": "tidelift" } ], - "time": "2023-09-25T16:46:40+00:00" + "time": "2023-12-01T14:56:37+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.3.0", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -8248,7 +8050,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.0" }, "funding": [ { @@ -8268,23 +8070,24 @@ }, { "name": "symfony/var-exporter", - "version": "v6.3.6", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "374d289c13cb989027274c86206ddc63b16a2441" + "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/374d289c13cb989027274c86206ddc63b16a2441", - "reference": "374d289c13cb989027274c86206ddc63b16a2441", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/2d08ca6b9cc704dce525615d1e6d1788734f36d9", + "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/var-dumper": "^5.4|^6.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8322,7 +8125,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.3.6" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.1" }, "funding": [ { @@ -8338,7 +8141,7 @@ "type": "tidelift" } ], - "time": "2023-10-13T09:16:49+00:00" + "time": "2023-11-30T10:32:10+00:00" } ], "aliases": [], From cfec610e9a63b04ede13323b5c67e0af8351457e Mon Sep 17 00:00:00 2001 From: Ji Lu <jilu1@adobe.com> Date: Wed, 6 Dec 2023 14:21:35 -0600 Subject: [PATCH 588/674] ACQE-5871: Add ability to increase default MagentoCLI timeout --- etc/config/command.php | 2 +- .../Module/MagentoWebDriver.php | 12 ++++++------ .../Test/Objects/ActionObject.php | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/etc/config/command.php b/etc/config/command.php index 480e9b08e..861d016e8 100644 --- a/etc/config/command.php +++ b/etc/config/command.php @@ -14,7 +14,7 @@ $tokenPassedIn = urldecode($_POST['token'] ?? ''); $command = urldecode($_POST['command'] ?? ''); $arguments = urldecode($_POST['arguments'] ?? ''); - $timeout = floatval(urldecode($_POST['timeout'] ?? getenv('MAGENTO_CLI_WAIT_TIMEOUT'))); + $timeout = floatval(urldecode($_POST['timeout'] ?? 60)); // Token returned will be null if the token we passed in is invalid $tokenFromMagento = $tokenModel->loadByToken($tokenPassedIn)->getToken(); diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index f2580deaf..057876659 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -530,9 +530,9 @@ public function scrollToTopOfPage() /** * Takes given $command and executes it against bin/magento or custom exposed entrypoint. Returns command output. * - * @param string $command - * @param integer $timeout - * @param string $arguments + * @param string $command + * @param integer|null $timeout + * @param string|null $arguments * @return string * * @throws TestFrameworkException @@ -846,9 +846,9 @@ public function fillSecretField($field, $value) * Function used to create data that contains sensitive credentials in a <createData> <field> override. * The data is decrypted immediately prior to data creation to avoid exposure in console or log. * - * @param string $command - * @param null $timeout - * @param null $arguments + * @param string $command + * @param integer|null $timeout + * @param string|null $arguments * @throws TestFrameworkException * @return string */ diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index f0ff060a6..d8ed23098 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -192,7 +192,7 @@ public static function getDefaultWaitTimeout() public static function getDefaultMagentoCLIWaitTimeout() { $timeout = getenv('MAGENTO_CLI_WAIT_TIMEOUT'); - return $timeout !== false ? $timeout : self::DEFAULT_COMMAND_WAIT_TIMEOUT; + return !empty($timeout) ? $timeout : self::DEFAULT_COMMAND_WAIT_TIMEOUT; } /** From d9df7d9046351be5c5c629da083957f0cf02d038 Mon Sep 17 00:00:00 2001 From: Ji Lu <jilu1@adobe.com> Date: Tue, 12 Dec 2023 09:13:34 -0600 Subject: [PATCH 589/674] ACQE-5911: MFTF 4.6.1 release --- CHANGELOG.md | 5 +++++ composer.json | 2 +- composer.lock | 22 ++++++++++++++++++---- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 555942bd3..9181108ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Magento Functional Testing Framework Changelog ================================================ +4.6.1 +--------- +### Enhancements +* Supported setting custom timeout value for `magentoCLI` command via an environment variable `MAGENTO_CLI_WAIT_TIMEOUT`. + 4.6.0 --------- ### Enhancements diff --git a/composer.json b/composer.json index ac0c8a43d..468756b45 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": "4.6.0", + "version": "4.6.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 311e13e11..c86a5d45c 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": "a0ebd24d0c275a654005c55f65b58e22", + "content-hash": "7772662f5957bac06547b5d62352d5d6", "packages": [ { "name": "allure-framework/allure-codeception", @@ -7996,12 +7996,12 @@ "version": "3.7.2", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", "shasum": "" }, @@ -8046,6 +8046,20 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], "time": "2023-02-22T23:07:41+00:00" }, { @@ -8356,5 +8370,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } From 5aa15831ceeb8657d6990118426ddc67421a6ad2 Mon Sep 17 00:00:00 2001 From: Rajesh Kumar <glo71317@adobe.com> Date: Wed, 13 Dec 2023 12:29:35 +0530 Subject: [PATCH 590/674] AC-9499::Update Symfony dependency packages to the latest LTS versions 6.4 --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index c86a5d45c..7fef8965f 100644 --- a/composer.lock +++ b/composer.lock @@ -8370,5 +8370,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From e01485aa6a0571a6b18e3cdbbfbeb8e89ce874a1 Mon Sep 17 00:00:00 2001 From: Rajesh Kumar <glo71317@adobe.com> Date: Wed, 13 Dec 2023 12:33:19 +0530 Subject: [PATCH 591/674] AC-9499::Update Symfony dependency packages to the latest LTS versions 6.4 --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index cfef0bca8..7a0b26ba4 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": "059566f8f5654d2356cac26b04eceaac", + "content-hash": "7772662f5957bac06547b5d62352d5d6", "packages": [ { "name": "allure-framework/allure-codeception", From 2f61fd772b76426138b79eb93863b7b16d7fabfd Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 21 Dec 2023 16:29:00 +0530 Subject: [PATCH 592/674] ACQE-5886 : Unit Test For Filters --- .../Test/Handlers/TestObjectHandlerTest.php | 52 +++++++++++++++++++ .../Util/Script/TestDependencyUtil.php | 10 ++-- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php index ca3bb3bf0..78bce35a3 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php @@ -24,6 +24,8 @@ use tests\unit\Util\MagentoTestCase; use tests\unit\Util\TestDataArrayBuilder; use tests\unit\Util\TestLoggingUtil; +use Magento\FunctionalTestingFramework\Filter\FilterList; +use Magento\FunctionalTestingFramework\Util\Script\TestDependencyUtil; class TestObjectHandlerTest extends MagentoTestCase { @@ -447,4 +449,54 @@ function ( $property->setAccessible(true); $property->setValue($resolver, $paths); } + + /** + * Basic test for exclude group Filter + * + * @return void + * @throws Exception + */ + public function testGetFilteredTestNamesWhenFilterisAppliedForExcludeGroup() + { + $fileList = new FilterList(['excludeGroup' => ['test']]); + $toh = TestObjectHandler::getInstance()->getAllObjects(); + $testDependencyUtil = new TestDependencyUtil(); + $result = $testDependencyUtil->getFilteredTestNames($toh, $fileList->getFilters()); + $this->assertIsArray($result); + $this->assertEquals(count($result), 0); + } + + /** + * Basic test for include group Filter + * + * @return void + * @throws Exception + */ + public function testGetFilteredTestNamesWhenFilterisAppliedForIncludeGroup() + { + $fileList = new FilterList(['includeGroup' => ['test']]); + $toh = TestObjectHandler::getInstance()->getAllObjects(); + $testDependencyUtil = new TestDependencyUtil(); + $result = $testDependencyUtil->getFilteredTestNames($toh, $fileList->getFilters()); + $this->assertIsArray($result); + $this->assertEquals(count($result), 1); + $this->assertEquals($result['testTest'], 'testTest'); + } + + /** + * Basic test when no filter applied + * + * @return void + * @throws Exception + */ + public function testGetFilteredTestNamesWhenNoFilterIsApplied() + { + $fileList = new FilterList(['includeGroup' => ['test']]); + $toh = TestObjectHandler::getInstance()->getAllObjects(); + $testDependencyUtil = new TestDependencyUtil(); + $result = $testDependencyUtil->getFilteredTestNames($toh, $fileList->getFilters()); + $this->assertIsArray($result); + $this->assertEquals(count($result), 1); + $this->assertEquals($result['testTest'], 'testTest'); + } } diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php index b336b67e6..bef8725e9 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php +++ b/src/Magento/FunctionalTestingFramework/Util/Script/TestDependencyUtil.php @@ -157,7 +157,9 @@ public function mergeDependenciesForExtendingTests( array $filterList, array $extendedTestMapping = [] ): array { - $filteredTestNames = (count($filterList)>0)?$this->getFilteredTestNames():[]; + $testObjects = TestObjectHandler::getInstance()->getAllObjects(); + $filters = MftfApplicationConfig::getConfig()->getFilterList()->getFilters(); + $filteredTestNames = (count($filterList)>0)?$this->getFilteredTestNames($testObjects, $filters):[]; $temp_array = array_reverse(array_column($testDependencies, "test_name"), true); if (!empty($extendedTestMapping)) { foreach ($extendedTestMapping as $value) { @@ -198,12 +200,12 @@ public function mergeDependenciesForExtendingTests( /** * Return array of merge test modules and file path with same test name. + * @param array $testObjects + * @param array $filters * @return array */ - public function getFilteredTestNames() + public function getFilteredTestNames(array $testObjects, array $filters) : array { - $testObjects = TestObjectHandler::getInstance()->getAllObjects(); - $filters = MftfApplicationConfig::getConfig()->getFilterList()->getFilters(); foreach ($filters as $filter) { $filter->filter($testObjects); } From db563940df1b347c4a2c595f11149335737e9e80 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 21 Dec 2023 16:31:03 +0530 Subject: [PATCH 593/674] ACQE-5886 : Unit Test For Filters --- .../Test/Handlers/TestObjectHandlerTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php index 78bce35a3..6916a860c 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php @@ -456,7 +456,7 @@ function ( * @return void * @throws Exception */ - public function testGetFilteredTestNamesWhenFilterisAppliedForExcludeGroup() + public function testGetFilteredTestNamesWhenExcludeGroupFilterIsApplied() { $fileList = new FilterList(['excludeGroup' => ['test']]); $toh = TestObjectHandler::getInstance()->getAllObjects(); @@ -472,7 +472,7 @@ public function testGetFilteredTestNamesWhenFilterisAppliedForExcludeGroup() * @return void * @throws Exception */ - public function testGetFilteredTestNamesWhenFilterisAppliedForIncludeGroup() + public function testGetFilteredTestNamesWhenIncludeGroupFilterIsApplied() { $fileList = new FilterList(['includeGroup' => ['test']]); $toh = TestObjectHandler::getInstance()->getAllObjects(); From d4d205bfff4f608e3495ee8310741167d29355dc Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 4 Jan 2024 10:33:27 +0530 Subject: [PATCH 594/674] ACQE-5886 : Fixed test --- .../Test/Handlers/TestObjectHandlerTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php index 6916a860c..05c293e7d 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php @@ -491,12 +491,13 @@ public function testGetFilteredTestNamesWhenIncludeGroupFilterIsApplied() */ public function testGetFilteredTestNamesWhenNoFilterIsApplied() { - $fileList = new FilterList(['includeGroup' => ['test']]); + $fileList = new FilterList(); $toh = TestObjectHandler::getInstance()->getAllObjects(); $testDependencyUtil = new TestDependencyUtil(); $result = $testDependencyUtil->getFilteredTestNames($toh, $fileList->getFilters()); $this->assertIsArray($result); $this->assertEquals(count($result), 1); + //returns all test Names $this->assertEquals($result['testTest'], 'testTest'); } } From c53b56fb92b0f8785a89f82264f4a0b678200a95 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 4 Jan 2024 13:53:30 +0530 Subject: [PATCH 595/674] ACQE-5908 : Updated symfony packages to 6.4 and above --- composer.json | 37 +- composer.lock | 973 +++++++++++++++++++++++++------------------------- 2 files changed, 504 insertions(+), 506 deletions(-) diff --git a/composer.json b/composer.json index 468756b45..2dd9ac5fd 100755 --- a/composer.json +++ b/composer.json @@ -9,13 +9,6 @@ "sort-packages": true }, "require": { - "php": ">=8.1", - "ext-curl": "*", - "ext-dom": "*", - "ext-iconv": "*", - "ext-intl": "*", - "ext-json": "*", - "ext-openssl": "*", "allure-framework/allure-codeception": "^2.1", "allure-framework/allure-phpunit": "^2", "aws/aws-sdk-php": "^3.132", @@ -25,22 +18,34 @@ "codeception/module-webdriver": "^3.0", "composer/composer": "^1.9||^2.0,!=2.2.16", "csharpru/vault-php": "^4.2.1", + "doctrine/annotations": "^2.0", + "ext-curl": "*", + "ext-dom": "*", + "ext-iconv": "*", + "ext-intl": "*", + "ext-json": "*", + "ext-openssl": "*", "guzzlehttp/guzzle": "^7.3.0", "laminas/laminas-diactoros": "^3.0", "monolog/monolog": "^2.3", "mustache/mustache": "~2.5", "nikic/php-parser": "^4.4", + "php": ">=8.1", "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0||^11.0", - "symfony/console": "^5.4||^6.0", - "symfony/string": "^5.4||^6.0", - "symfony/dotenv": "^5.3||^6.0", - "symfony/finder": "^5.0||^6.0", - "symfony/http-foundation": "^5.0||^6.0", - "symfony/mime": "^5.0||^6.0", - "symfony/process": "^5.0||^6.0", - "weew/helpers-array": "^1.3", - "doctrine/annotations": "^2.0" + "symfony/config": "^6.4", + "symfony/console": "^5.4||^6.4", + "symfony/dependency-injection": "^6.4", + "symfony/dotenv": "^6.4", + "symfony/filesystem": "^6.4", + "symfony/finder": "^6.4", + "symfony/http-foundation": "^6.4", + "symfony/mime": "^6.4", + "symfony/process": "^6.4", + "symfony/stopwatch": "^6.4", + "symfony/string": "^6.4", + "symfony/var-exporter": "^6.4", + "weew/helpers-array": "^1.3" }, "require-dev": { "brainmaestro/composer-git-hooks": "^2.8.5", diff --git a/composer.lock b/composer.lock index 7a0b26ba4..069a7c71a 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": "7772662f5957bac06547b5d62352d5d6", + "content-hash": "7b1195f1cf256a9f4bd1337a53df668e", "packages": [ { "name": "allure-framework/allure-codeception", @@ -267,16 +267,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.293.5", + "version": "3.295.5", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "f2002e52b382b45231da3f9552033f769acfebd8" + "reference": "cd9d48ebfdfc8fb5f6df9fe95dced622287f3412" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/f2002e52b382b45231da3f9552033f769acfebd8", - "reference": "f2002e52b382b45231da3f9552033f769acfebd8", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/cd9d48ebfdfc8fb5f6df9fe95dced622287f3412", + "reference": "cd9d48ebfdfc8fb5f6df9fe95dced622287f3412", "shasum": "" }, "require": { @@ -356,9 +356,9 @@ "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.293.5" + "source": "https://github.com/aws/aws-sdk-php/tree/3.295.5" }, - "time": "2023-12-06T19:09:15+00:00" + "time": "2024-01-03T19:12:43+00:00" }, { "name": "behat/gherkin", @@ -480,16 +480,16 @@ }, { "name": "codeception/codeception", - "version": "5.0.12", + "version": "5.0.13", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "7f528f5fd8cdcd05cd0a85eb1e24d05df989e0c4" + "reference": "713a90195efa2926566e24bfc623da703ff42bba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/7f528f5fd8cdcd05cd0a85eb1e24d05df989e0c4", - "reference": "7f528f5fd8cdcd05cd0a85eb1e24d05df989e0c4", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/713a90195efa2926566e24bfc623da703ff42bba", + "reference": "713a90195efa2926566e24bfc623da703ff42bba", "shasum": "" }, "require": { @@ -504,15 +504,15 @@ "phpunit/php-text-template": "^2.0 || ^3.0", "phpunit/php-timer": "^5.0.3 || ^6.0", "phpunit/phpunit": "^9.5.20 || ^10.0", - "psy/psysh": "^0.11.2", + "psy/psysh": "^0.11.2 || ^0.12", "sebastian/comparator": "^4.0.5 || ^5.0", "sebastian/diff": "^4.0.3 || ^5.0", - "symfony/console": ">=4.4.24 <7.0", - "symfony/css-selector": ">=4.4.24 <7.0", - "symfony/event-dispatcher": ">=4.4.24 <7.0", - "symfony/finder": ">=4.4.24 <7.0", - "symfony/var-dumper": ">=4.4.24 < 7.0", - "symfony/yaml": ">=4.4.24 <7.0" + "symfony/console": ">=4.4.24 <8.0", + "symfony/css-selector": ">=4.4.24 <8.0", + "symfony/event-dispatcher": ">=4.4.24 <8.0", + "symfony/finder": ">=4.4.24 <8.0", + "symfony/var-dumper": ">=4.4.24 <8.0", + "symfony/yaml": ">=4.4.24 <8.0" }, "conflict": { "codeception/lib-innerbrowser": "<3.1.3", @@ -533,8 +533,8 @@ "codeception/util-universalframework": "*@dev", "ext-simplexml": "*", "jetbrains/phpstorm-attributes": "^1.0", - "symfony/dotenv": ">=4.4.24 <7.0", - "symfony/process": ">=4.4.24 <7.0", + "symfony/dotenv": ">=4.4.24 <8.0", + "symfony/process": ">=4.4.24 <8.0", "vlucas/phpdotenv": "^5.1" }, "suggest": { @@ -584,7 +584,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/5.0.12" + "source": "https://github.com/Codeception/Codeception/tree/5.0.13" }, "funding": [ { @@ -592,7 +592,7 @@ "type": "open_collective" } ], - "time": "2023-10-15T18:04:50+00:00" + "time": "2023-12-22T19:32:40+00:00" }, { "name": "codeception/lib-asserts", @@ -909,16 +909,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.7", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" + "reference": "b66d11b7479109ab547f9405b97205640b17d385" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", - "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b66d11b7479109ab547f9405b97205640b17d385", + "reference": "b66d11b7479109ab547f9405b97205640b17d385", "shasum": "" }, "require": { @@ -930,7 +930,7 @@ "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 || ^6.0" + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", "extra": { @@ -965,7 +965,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.7" + "source": "https://github.com/composer/ca-bundle/tree/1.4.0" }, "funding": [ { @@ -981,7 +981,7 @@ "type": "tidelift" } ], - "time": "2023-08-30T09:31:38+00:00" + "time": "2023-12-18T12:05:55+00:00" }, { "name": "composer/class-map-generator", @@ -1058,16 +1058,16 @@ }, { "name": "composer/composer", - "version": "2.6.5", + "version": "2.6.6", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "4b0fe89db9e65b1e64df633a992e70a7a215ab33" + "reference": "683557bd2466072777309d039534bb1332d0dda5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/4b0fe89db9e65b1e64df633a992e70a7a215ab33", - "reference": "4b0fe89db9e65b1e64df633a992e70a7a215ab33", + "url": "https://api.github.com/repos/composer/composer/zipball/683557bd2466072777309d039534bb1332d0dda5", + "reference": "683557bd2466072777309d039534bb1332d0dda5", "shasum": "" }, "require": { @@ -1085,7 +1085,7 @@ "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11 || ^7", + "symfony/console": "^5.4.11 || ^6.0.11", "symfony/filesystem": "^5.4 || ^6.0 || ^7", "symfony/finder": "^5.4 || ^6.0 || ^7", "symfony/polyfill-php73": "^1.24", @@ -1152,7 +1152,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.6.5" + "source": "https://github.com/composer/composer/tree/2.6.6" }, "funding": [ { @@ -1168,7 +1168,7 @@ "type": "tidelift" } ], - "time": "2023-10-06T08:11:52+00:00" + "time": "2023-12-08T17:32:26+00:00" }, { "name": "composer/metadata-minifier", @@ -2582,16 +2582,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.17.1", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "" }, "require": { @@ -2632,9 +2632,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" }, - "time": "2023-08-13T19:53:39+00:00" + "time": "2023-12-10T21:03:43+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -2882,23 +2882,23 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.29", + "version": "9.2.30", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", - "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -2948,7 +2948,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" }, "funding": [ { @@ -2956,7 +2956,7 @@ "type": "github" } ], - "time": "2023-09-19T04:57:46+00:00" + "time": "2023-12-22T06:47:57+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3666,25 +3666,25 @@ }, { "name": "psy/psysh", - "version": "v0.11.22", + "version": "v0.12.0", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b" + "reference": "750bf031a48fd07c673dbe3f11f72362ea306d0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/128fa1b608be651999ed9789c95e6e2a31b5802b", - "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/750bf031a48fd07c673dbe3f11f72362ea306d0d", + "reference": "750bf031a48fd07c673dbe3f11f72362ea306d0d", "shasum": "" }, "require": { "ext-json": "*", "ext-tokenizer": "*", - "nikic/php-parser": "^4.0 || ^3.1", - "php": "^8.0 || ^7.0.8", - "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4", - "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4" + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" }, "conflict": { "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" @@ -3695,8 +3695,7 @@ "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." }, "bin": [ "bin/psysh" @@ -3704,7 +3703,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-0.11": "0.11.x-dev" + "dev-main": "0.12.x-dev" }, "bamarni-bin": { "bin-links": false, @@ -3740,9 +3739,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.22" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.0" }, - "time": "2023-10-14T21:56:36+00:00" + "time": "2023-12-20T15:28:09+00:00" }, { "name": "ralouphie/getallheaders", @@ -4285,20 +4284,20 @@ }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -4330,7 +4329,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" }, "funding": [ { @@ -4338,7 +4337,7 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/diff", @@ -4612,20 +4611,20 @@ }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "1.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -4657,7 +4656,7 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" }, "funding": [ { @@ -4665,7 +4664,7 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", @@ -5008,16 +5007,16 @@ }, { "name": "seld/jsonlint", - "version": "1.10.0", + "version": "1.10.1", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1" + "reference": "76d449a358ece77d6f1d6331c68453e657172202" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", - "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/76d449a358ece77d6f1d6331c68453e657172202", + "reference": "76d449a358ece77d6f1d6331c68453e657172202", "shasum": "" }, "require": { @@ -5044,7 +5043,7 @@ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "homepage": "https://seld.be" } ], "description": "JSON Linter", @@ -5056,7 +5055,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.10.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.10.1" }, "funding": [ { @@ -5068,7 +5067,7 @@ "type": "tidelift" } ], - "time": "2023-05-11T13:16:46+00:00" + "time": "2023-12-18T13:03:25+00:00" }, { "name": "seld/phar-utils", @@ -5259,18 +5258,93 @@ ], "time": "2023-03-16T19:16:25+00:00" }, + { + "name": "symfony/config", + "version": "v6.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "5d33e0fb707d603330e0edfd4691803a1253572e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/5d33e0fb707d603330e0edfd4691803a1253572e", + "reference": "5d33e0fb707d603330e0edfd4691803a1253572e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "require-dev": { + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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/v6.4.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": "2023-11-09T08:28:32+00:00" + }, { "name": "symfony/console", - "version": "v5.4.32", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c70df1ffaf23a8d340bded3cfab1b86752ad6ed7" + "reference": "4b4d8cd118484aa604ec519062113dd87abde18c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c70df1ffaf23a8d340bded3cfab1b86752ad6ed7", - "reference": "c70df1ffaf23a8d340bded3cfab1b86752ad6ed7", + "url": "https://api.github.com/repos/symfony/console/zipball/4b4d8cd118484aa604ec519062113dd87abde18c", + "reference": "4b4d8cd118484aa604ec519062113dd87abde18c", "shasum": "" }, "require": { @@ -5340,7 +5414,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.32" + "source": "https://github.com/symfony/console/tree/v5.4.34" }, "funding": [ { @@ -5356,24 +5430,24 @@ "type": "tidelift" } ], - "time": "2023-11-18T18:23:04+00:00" + "time": "2023-12-08T13:33:03+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.0", + "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4" + "reference": "bb51d46e53ef8d50d523f0c5faedba056a27943e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/d036c6c0d0b09e24a14a35f8292146a658f986e4", - "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/bb51d46e53ef8d50d523f0c5faedba056a27943e", + "reference": "bb51d46e53ef8d50d523f0c5faedba056a27943e", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -5405,7 +5479,88 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.0" + "source": "https://github.com/symfony/css-selector/tree/v7.0.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": "2023-10-31T17:59:56+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v6.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/226ea431b1eda6f0d9f5a4b278757171960bb195", + "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.2.10|^7.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<6.1", + "symfony/finder": "<5.4", + "symfony/proxy-manager-bridge": "<6.3", + "symfony/yaml": "<5.4" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "symfony/config": "^6.1|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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/v6.4.2" }, "funding": [ { @@ -5421,7 +5576,7 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:40:20+00:00" + "time": "2023-12-28T19:16:56+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5492,16 +5647,16 @@ }, { "name": "symfony/dotenv", - "version": "v6.4.0", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "d0d584a91422ddaa2c94317200d4c4e5b935555f" + "reference": "835f8d2d1022934ac038519de40b88158798c96f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/d0d584a91422ddaa2c94317200d4c4e5b935555f", - "reference": "d0d584a91422ddaa2c94317200d4c4e5b935555f", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/835f8d2d1022934ac038519de40b88158798c96f", + "reference": "835f8d2d1022934ac038519de40b88158798c96f", "shasum": "" }, "require": { @@ -5546,7 +5701,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.0" + "source": "https://github.com/symfony/dotenv/tree/v6.4.2" }, "funding": [ { @@ -5562,28 +5717,28 @@ "type": "tidelift" } ], - "time": "2023-10-26T18:19:48+00:00" + "time": "2023-12-28T19:16:56+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.0", + "version": "v7.0.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d76d2632cfc2206eecb5ad2b26cd5934082941b6" + "reference": "098b62ae81fdd6cbf941f355059f617db28f4f9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d76d2632cfc2206eecb5ad2b26cd5934082941b6", - "reference": "d76d2632cfc2206eecb5ad2b26cd5934082941b6", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/098b62ae81fdd6cbf941f355059f617db28f4f9a", + "reference": "098b62ae81fdd6cbf941f355059f617db28f4f9a", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4", + "symfony/dependency-injection": "<6.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -5592,13 +5747,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -5626,7 +5781,7 @@ "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/v6.4.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.2" }, "funding": [ { @@ -5642,7 +5797,7 @@ "type": "tidelift" } ], - "time": "2023-07-27T06:52:43+00:00" + "time": "2023-12-27T22:24:19+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5849,16 +6004,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.0", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "44a6d39a9cc11e154547d882d5aac1e014440771" + "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/44a6d39a9cc11e154547d882d5aac1e014440771", - "reference": "44a6d39a9cc11e154547d882d5aac1e014440771", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/172d807f9ef3fc3fbed8377cc57c20d389269271", + "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271", "shasum": "" }, "require": { @@ -5906,7 +6061,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.0" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.2" }, "funding": [ { @@ -5922,7 +6077,7 @@ "type": "tidelift" } ], - "time": "2023-11-20T16:41:16+00:00" + "time": "2023-12-27T22:16:42+00:00" }, { "name": "symfony/mime", @@ -6824,16 +6979,16 @@ }, { "name": "symfony/process", - "version": "v6.4.0", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa" + "reference": "c4b1ef0bc80533d87a2e969806172f1c2a980241" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/191703b1566d97a5425dc969e4350d32b8ef17aa", - "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa", + "url": "https://api.github.com/repos/symfony/process/zipball/c4b1ef0bc80533d87a2e969806172f1c2a980241", + "reference": "c4b1ef0bc80533d87a2e969806172f1c2a980241", "shasum": "" }, "require": { @@ -6865,7 +7020,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.0" + "source": "https://github.com/symfony/process/tree/v6.4.2" }, "funding": [ { @@ -6881,25 +7036,25 @@ "type": "tidelift" } ], - "time": "2023-11-17T21:06:49+00:00" + "time": "2023-12-22T16:42:54+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.4.0", + "version": "v3.4.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", - "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^2.0" + "psr/container": "^1.1|^2.0" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -6947,7 +7102,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" }, "funding": [ { @@ -6963,20 +7118,82 @@ "type": "tidelift" } ], - "time": "2023-07-30T20:28:31+00:00" + "time": "2023-12-26T14:02:43+00:00" }, { - "name": "symfony/string", + "name": "symfony/stopwatch", "version": "v6.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.4.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": "2023-02-16T10:14:28+00:00" + }, + { + "name": "symfony/string", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809" + "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/b45fcf399ea9c3af543a92edf7172ba21174d809", - "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809", + "url": "https://api.github.com/repos/symfony/string/zipball/7cb80bc10bfcdf6b5492741c0b9357dac66940bc", + "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc", "shasum": "" }, "require": { @@ -7033,7 +7250,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.0" + "source": "https://github.com/symfony/string/tree/v6.4.2" }, "funding": [ { @@ -7049,20 +7266,20 @@ "type": "tidelift" } ], - "time": "2023-11-28T20:41:49+00:00" + "time": "2023-12-10T16:15:48+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.0", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "c40f7d17e91d8b407582ed51a2bbf83c52c367f6" + "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c40f7d17e91d8b407582ed51a2bbf83c52c367f6", - "reference": "c40f7d17e91d8b407582ed51a2bbf83c52c367f6", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", + "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", "shasum": "" }, "require": { @@ -7118,7 +7335,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.0" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.2" }, "funding": [ { @@ -7134,40 +7351,33 @@ "type": "tidelift" } ], - "time": "2023-11-09T08:28:32+00:00" + "time": "2023-12-28T19:16:56+00:00" }, { - "name": "symfony/yaml", - "version": "v6.4.0", + "name": "symfony/var-exporter", + "version": "v6.4.2", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587" + "url": "https://github.com/symfony/var-exporter.git", + "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587", - "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5fe9a0021b8d35e67d914716ec8de50716a68e7e", + "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<5.4" + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, - "bin": [ - "Resources/bin/yaml-lint" - ], "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Yaml\\": "" + "Symfony\\Component\\VarExporter\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -7179,9 +7389,91 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.4.2" + }, + "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": "2023-12-27T08:18:35+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587", + "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" @@ -7427,34 +7719,30 @@ }, { "name": "gitonomy/gitlib", - "version": "v1.3.8", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/gitonomy/gitlib.git", - "reference": "9fea656e75ad6e3452feb2cac46a6c1239cd7f74" + "reference": "2c7fbbd9814178474d0bb1b6292701cb4ab508f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/9fea656e75ad6e3452feb2cac46a6c1239cd7f74", - "reference": "9fea656e75ad6e3452feb2cac46a6c1239cd7f74", + "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/2c7fbbd9814178474d0bb1b6292701cb4ab508f9", + "reference": "2c7fbbd9814178474d0bb1b6292701cb4ab508f9", "shasum": "" }, "require": { "ext-pcre": "*", - "php": "^5.6 || ^7.0 || ^8.0", + "php": "^8.0", "symfony/polyfill-mbstring": "^1.7", - "symfony/process": "^3.4 || ^4.4 || ^5.0 || ^6.0" + "symfony/process": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { "ext-fileinfo": "*", - "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.20 || ^9.5.9", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.20 || ^9.5.9", "psr/log": "^1.0" }, - "suggest": { - "ext-fileinfo": "Required to determine the mimetype of a blob", - "psr/log": "Required to use loggers for reporting of execution" - }, "type": "library", "autoload": { "psr-4": { @@ -7490,7 +7778,7 @@ "description": "Library for accessing git", "support": { "issues": "https://github.com/gitonomy/gitlib/issues", - "source": "https://github.com/gitonomy/gitlib/tree/v1.3.8" + "source": "https://github.com/gitonomy/gitlib/tree/v1.4.0" }, "funding": [ { @@ -7498,20 +7786,20 @@ "type": "tidelift" } ], - "time": "2023-05-11T08:29:06+00:00" + "time": "2023-12-20T13:02:08+00:00" }, { "name": "pdepend/pdepend", - "version": "2.16.0", + "version": "2.16.2", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "8dfc0c46529e2073fa97986552f80646eedac562" + "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/8dfc0c46529e2073fa97986552f80646eedac562", - "reference": "8dfc0c46529e2073fa97986552f80646eedac562", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/f942b208dc2a0868454d01b29f0c75bbcfc6ed58", + "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58", "shasum": "" }, "require": { @@ -7524,7 +7812,6 @@ "require-dev": { "easy-doc/easy-doc": "0.0.0|^1.2.3", "gregwar/rst": "^1.0", - "phpunit/phpunit": "^4.8.36|^5.7.27", "squizlabs/php_codesniffer": "^2.0.0" }, "bin": [ @@ -7554,7 +7841,7 @@ ], "support": { "issues": "https://github.com/pdepend/pdepend/issues", - "source": "https://github.com/pdepend/pdepend/tree/2.16.0" + "source": "https://github.com/pdepend/pdepend/tree/2.16.2" }, "funding": [ { @@ -7562,7 +7849,7 @@ "type": "tidelift" } ], - "time": "2023-11-29T08:52:35+00:00" + "time": "2023-12-17T18:09:59+00:00" }, { "name": "php-coveralls/php-coveralls", @@ -7649,22 +7936,22 @@ }, { "name": "phpmd/phpmd", - "version": "2.14.1", + "version": "2.15.0", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "442fc2c34edcd5198b442d8647c7f0aec3afabe8" + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/442fc2c34edcd5198b442d8647c7f0aec3afabe8", - "reference": "442fc2c34edcd5198b442d8647c7f0aec3afabe8", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0", + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0", "shasum": "" }, "require": { "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", "ext-xml": "*", - "pdepend/pdepend": "^2.15.1", + "pdepend/pdepend": "^2.16.1", "php": ">=5.3.9" }, "require-dev": { @@ -7673,7 +7960,6 @@ "ext-simplexml": "*", "gregwar/rst": "^1.0", "mikey179/vfsstream": "^1.6.8", - "phpunit/phpunit": "^4.8.36 || ^5.7.27", "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2" }, "bin": [ @@ -7721,7 +8007,7 @@ "support": { "irc": "irc://irc.freenode.org/phpmd", "issues": "https://github.com/phpmd/phpmd/issues", - "source": "https://github.com/phpmd/phpmd/tree/2.14.1" + "source": "https://github.com/phpmd/phpmd/tree/2.15.0" }, "funding": [ { @@ -7729,7 +8015,7 @@ "type": "tidelift" } ], - "time": "2023-09-28T13:07:44+00:00" + "time": "2023-12-11T08:22:20+00:00" }, { "name": "sebastian/phpcpd", @@ -7863,299 +8149,6 @@ } ], "time": "2023-02-22T23:07:41+00:00" - }, - { - "name": "symfony/config", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "5d33e0fb707d603330e0edfd4691803a1253572e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/5d33e0fb707d603330e0edfd4691803a1253572e", - "reference": "5d33e0fb707d603330e0edfd4691803a1253572e", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<5.4", - "symfony/service-contracts": "<2.5" - }, - "require-dev": { - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "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/v6.4.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": "2023-11-09T08:28:32+00:00" - }, - { - "name": "symfony/dependency-injection", - "version": "v6.4.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "f88ff6428afbeb17cc648c8003bd608534750baf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f88ff6428afbeb17cc648c8003bd608534750baf", - "reference": "f88ff6428afbeb17cc648c8003bd608534750baf", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.2.10|^7.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2", - "symfony/config": "<6.1", - "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.3", - "symfony/yaml": "<5.4" - }, - "provide": { - "psr/container-implementation": "1.1|2.0", - "symfony/service-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "symfony/config": "^6.1|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "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/v6.4.1" - }, - "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": "2023-12-01T14:56:37+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.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": "2023-02-16T10:14:28+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v6.4.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/2d08ca6b9cc704dce525615d1e6d1788734f36d9", - "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "require-dev": { - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "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": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.1" - }, - "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": "2023-11-30T10:32:10+00:00" } ], "aliases": [], @@ -8164,13 +8157,13 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=8.1", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", "ext-intl": "*", "ext-json": "*", - "ext-openssl": "*" + "ext-openssl": "*", + "php": ">=8.1" }, "platform-dev": [], "plugin-api-version": "2.6.0" From 715884e9d560368cd9161e29523ee1b25e3dff00 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 4 Jan 2024 13:58:27 +0530 Subject: [PATCH 596/674] ACQE-5908 : Updated symfony packages to 6.4 and above --- composer.json | 4 +- composer.lock | 106 +++++++++++--------------------------------------- 2 files changed, 24 insertions(+), 86 deletions(-) diff --git a/composer.json b/composer.json index 2dd9ac5fd..819f460ec 100755 --- a/composer.json +++ b/composer.json @@ -18,7 +18,6 @@ "codeception/module-webdriver": "^3.0", "composer/composer": "^1.9||^2.0,!=2.2.16", "csharpru/vault-php": "^4.2.1", - "doctrine/annotations": "^2.0", "ext-curl": "*", "ext-dom": "*", "ext-iconv": "*", @@ -45,6 +44,8 @@ "symfony/stopwatch": "^6.4", "symfony/string": "^6.4", "symfony/var-exporter": "^6.4", + "symfony/css-selector": "^6.4", + "symfony/event-dispatcher": "^6.4", "weew/helpers-array": "^1.3" }, "require-dev": { @@ -53,7 +54,6 @@ "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", "phpunit/phpunit": "^9.5", - "sebastian/phpcpd": "~6.0.0", "squizlabs/php_codesniffer": "~3.7.0" }, "suggest": { diff --git a/composer.lock b/composer.lock index 069a7c71a..c26cbe665 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": "7b1195f1cf256a9f4bd1337a53df668e", + "content-hash": "c81b0c18645e69e0a26acd4d19b58f15", "packages": [ { "name": "allure-framework/allure-codeception", @@ -5434,20 +5434,20 @@ }, { "name": "symfony/css-selector", - "version": "v7.0.0", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "bb51d46e53ef8d50d523f0c5faedba056a27943e" + "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/bb51d46e53ef8d50d523f0c5faedba056a27943e", - "reference": "bb51d46e53ef8d50d523f0c5faedba056a27943e", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/d036c6c0d0b09e24a14a35f8292146a658f986e4", + "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.1" }, "type": "library", "autoload": { @@ -5479,7 +5479,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.0.0" + "source": "https://github.com/symfony/css-selector/tree/v6.4.0" }, "funding": [ { @@ -5495,7 +5495,7 @@ "type": "tidelift" } ], - "time": "2023-10-31T17:59:56+00:00" + "time": "2023-10-31T08:40:20+00:00" }, { "name": "symfony/dependency-injection", @@ -5721,24 +5721,24 @@ }, { "name": "symfony/event-dispatcher", - "version": "v7.0.2", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "098b62ae81fdd6cbf941f355059f617db28f4f9a" + "reference": "e95216850555cd55e71b857eb9d6c2674124603a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/098b62ae81fdd6cbf941f355059f617db28f4f9a", - "reference": "098b62ae81fdd6cbf941f355059f617db28f4f9a", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e95216850555cd55e71b857eb9d6c2674124603a", + "reference": "e95216850555cd55e71b857eb9d6c2674124603a", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<6.4", + "symfony/dependency-injection": "<5.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -5747,13 +5747,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/error-handler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^6.4|^7.0" + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5781,7 +5781,7 @@ "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/v7.0.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.2" }, "funding": [ { @@ -5797,7 +5797,7 @@ "type": "tidelift" } ], - "time": "2023-12-27T22:24:19+00:00" + "time": "2023-12-27T22:16:42+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -8017,68 +8017,6 @@ ], "time": "2023-12-11T08:22:20+00:00" }, - { - "name": "sebastian/phpcpd", - "version": "6.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpcpd.git", - "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/f3683aa0db2e8e09287c2bb33a595b2873ea9176", - "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "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" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.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": "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" - } - ], - "abandoned": true, - "time": "2020-12-07T05:39:23+00:00" - }, { "name": "squizlabs/php_codesniffer", "version": "3.7.2", From ce95a1602ca32e1d83284661f75f4b251a9d1582 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 4 Jan 2024 14:02:43 +0530 Subject: [PATCH 597/674] ACQE-5908 : Updated symfony packages to 6.4 and above --- bin/static-checks | 1 - composer.json | 1 + composer.lock | 64 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/bin/static-checks b/bin/static-checks index c711726e4..11a675378 100755 --- a/bin/static-checks +++ b/bin/static-checks @@ -16,7 +16,6 @@ echo "" echo "===============================" echo " COPY PASTE DETECTOR" echo "===============================" -vendor/bin/phpcpd ./src echo "" echo "===============================" diff --git a/composer.json b/composer.json index 819f460ec..1421890a8 100755 --- a/composer.json +++ b/composer.json @@ -54,6 +54,7 @@ "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", "phpunit/phpunit": "^9.5", + "sebastian/phpcpd": "~6.0.0", "squizlabs/php_codesniffer": "~3.7.0" }, "suggest": { diff --git a/composer.lock b/composer.lock index c26cbe665..45991d17b 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": "c81b0c18645e69e0a26acd4d19b58f15", + "content-hash": "a04202e09717348cab5b23c2995529df", "packages": [ { "name": "allure-framework/allure-codeception", @@ -8017,6 +8017,68 @@ ], "time": "2023-12-11T08:22:20+00:00" }, + { + "name": "sebastian/phpcpd", + "version": "6.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpcpd.git", + "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/f3683aa0db2e8e09287c2bb33a595b2873ea9176", + "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "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" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.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": "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" + } + ], + "abandoned": true, + "time": "2020-12-07T05:39:23+00:00" + }, { "name": "squizlabs/php_codesniffer", "version": "3.7.2", From 3b356335e12ad0b9ba8e81e6179bef48f4ada759 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 4 Jan 2024 14:09:03 +0530 Subject: [PATCH 598/674] ACQE-5908 : Updated symfony packages to 6.4 and above --- composer.lock | 259 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 230 insertions(+), 29 deletions(-) diff --git a/composer.lock b/composer.lock index 45991d17b..9b5c74128 100644 --- a/composer.lock +++ b/composer.lock @@ -360,6 +360,73 @@ }, "time": "2024-01-03T19:12:43+00:00" }, + { + "name": "beberlei/assert", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/beberlei/assert.git", + "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655", + "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": ">=6.0.0", + "yoast/phpunit-polyfills": "^0.1.0" + }, + "suggest": { + "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles" + }, + "type": "library", + "autoload": { + "files": [ + "lib/Assert/functions.php" + ], + "psr-4": { + "Assert\\": "lib/Assert" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de", + "role": "Lead Developer" + }, + { + "name": "Richard Quadling", + "email": "rquadling@gmail.com", + "role": "Collaborator" + } + ], + "description": "Thin assertion library for input validation in business models.", + "keywords": [ + "assert", + "assertion", + "validation" + ], + "support": { + "issues": "https://github.com/beberlei/assert/issues", + "source": "https://github.com/beberlei/assert/tree/v3.3.2" + }, + "time": "2021-12-16T21:41:27+00:00" + }, { "name": "behat/gherkin", "version": "v4.9.0", @@ -5180,38 +5247,43 @@ }, { "name": "spomky-labs/otphp", - "version": "11.2.0", + "version": "v10.0.3", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "9a1569038bb1c8e98040b14b8bcbba54f25e7795" + "reference": "9784d9f7c790eed26e102d6c78f12c754036c366" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9a1569038bb1c8e98040b14b8bcbba54f25e7795", - "reference": "9a1569038bb1c8e98040b14b8bcbba54f25e7795", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9784d9f7c790eed26e102d6c78f12c754036c366", + "reference": "9784d9f7c790eed26e102d6c78f12c754036c366", "shasum": "" }, "require": { + "beberlei/assert": "^3.0", "ext-mbstring": "*", "paragonie/constant_time_encoding": "^2.0", - "php": "^8.1" + "php": "^7.2|^8.0", + "thecodingmachine/safe": "^0.1.14|^1.0|^2.0" }, "require-dev": { - "ekino/phpstan-banned-code": "^1.0", - "infection/infection": "^0.26", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5.26", - "qossmic/deptrac-shim": "^1.0", - "rector/rector": "^0.15", - "symfony/phpunit-bridge": "^6.1", - "symplify/easy-coding-standard": "^11.0" + "php-coveralls/php-coveralls": "^2.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-beberlei-assert": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^8.0", + "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0" }, "type": "library", + "extra": { + "branch-alias": { + "v10.0": "10.0.x-dev", + "v9.0": "9.0.x-dev", + "v8.3": "8.3.x-dev" + } + }, "autoload": { "psr-4": { "OTPHP\\": "src/" @@ -5244,19 +5316,9 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/11.2.0" + "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.3" }, - "funding": [ - { - "url": "https://github.com/Spomky", - "type": "github" - }, - { - "url": "https://www.patreon.com/FlorentMorselli", - "type": "patreon" - } - ], - "time": "2023-03-16T19:16:25+00:00" + "time": "2022-03-17T08:00:35+00:00" }, { "name": "symfony/config", @@ -7500,6 +7562,145 @@ ], "time": "2023-11-06T11:00:25+00:00" }, + { + "name": "thecodingmachine/safe", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.2", + "thecodingmachine/phpstan-strict-rules": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "files": [ + "deprecated/apc.php", + "deprecated/array.php", + "deprecated/datetime.php", + "deprecated/libevent.php", + "deprecated/misc.php", + "deprecated/password.php", + "deprecated/mssql.php", + "deprecated/stats.php", + "deprecated/strings.php", + "lib/special_cases.php", + "deprecated/mysqli.php", + "generated/apache.php", + "generated/apcu.php", + "generated/array.php", + "generated/bzip2.php", + "generated/calendar.php", + "generated/classobj.php", + "generated/com.php", + "generated/cubrid.php", + "generated/curl.php", + "generated/datetime.php", + "generated/dir.php", + "generated/eio.php", + "generated/errorfunc.php", + "generated/exec.php", + "generated/fileinfo.php", + "generated/filesystem.php", + "generated/filter.php", + "generated/fpm.php", + "generated/ftp.php", + "generated/funchand.php", + "generated/gettext.php", + "generated/gmp.php", + "generated/gnupg.php", + "generated/hash.php", + "generated/ibase.php", + "generated/ibmDb2.php", + "generated/iconv.php", + "generated/image.php", + "generated/imap.php", + "generated/info.php", + "generated/inotify.php", + "generated/json.php", + "generated/ldap.php", + "generated/libxml.php", + "generated/lzf.php", + "generated/mailparse.php", + "generated/mbstring.php", + "generated/misc.php", + "generated/mysql.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pgsql.php", + "generated/posix.php", + "generated/ps.php", + "generated/pspell.php", + "generated/readline.php", + "generated/rpminfo.php", + "generated/rrd.php", + "generated/sem.php", + "generated/session.php", + "generated/shmop.php", + "generated/sockets.php", + "generated/sodium.php", + "generated/solr.php", + "generated/spl.php", + "generated/sqlsrv.php", + "generated/ssdeep.php", + "generated/ssh2.php", + "generated/stream.php", + "generated/strings.php", + "generated/swoole.php", + "generated/uodbc.php", + "generated/uopz.php", + "generated/url.php", + "generated/var.php", + "generated/xdiff.php", + "generated/xml.php", + "generated/xmlrpc.php", + "generated/yaml.php", + "generated/yaz.php", + "generated/zip.php", + "generated/zlib.php" + ], + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "deprecated/Exceptions/", + "generated/Exceptions/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", + "support": { + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" + }, + "time": "2023-04-05T11:54:14+00:00" + }, { "name": "theseer/tokenizer", "version": "1.2.2", From 3c566228a2e1f78d134f3b9c6f175e8f872e2eec Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 9 Jan 2024 09:57:20 +0530 Subject: [PATCH 599/674] revert code --- bin/static-checks | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/static-checks b/bin/static-checks index 11a675378..cd3dc051f 100755 --- a/bin/static-checks +++ b/bin/static-checks @@ -16,6 +16,7 @@ echo "" echo "===============================" echo " COPY PASTE DETECTOR" echo "===============================" +vendor/bin/phpcpd ./src echo "" echo "===============================" @@ -28,4 +29,4 @@ echo "===============================" echo " MAGENTO COPYRIGHT CHECK" echo "===============================" bin/copyright-check -echo "" +echo "" \ No newline at end of file From 141186c662845b79380a44896811db70eefdfc34 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 9 Jan 2024 09:58:05 +0530 Subject: [PATCH 600/674] Update static-checks --- bin/static-checks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/static-checks b/bin/static-checks index cd3dc051f..c711726e4 100755 --- a/bin/static-checks +++ b/bin/static-checks @@ -29,4 +29,4 @@ echo "===============================" echo " MAGENTO COPYRIGHT CHECK" echo "===============================" bin/copyright-check -echo "" \ No newline at end of file +echo "" From 3b8dedba3c967a7e41f4e03c55a5217c27703537 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 9 Jan 2024 12:37:42 +0530 Subject: [PATCH 601/674] MFTF_4.6.2_RC : MFTF 4.6.2 Release Check List --- CHANGELOG.md | 6 ++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9181108ee..32c54578a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Magento Functional Testing Framework Changelog ================================================ +4.6.2 +--------- +### Enhancements +* Bumped all symfony dependencies to `^6.0 +* Unit Test for PTS enabled doesn't apply filter fix + 4.6.1 --------- ### Enhancements diff --git a/composer.json b/composer.json index 1421890a8..a78e9aed9 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": "4.6.1", + "version": "4.6.2", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 9b5c74128..01aef5106 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": "a04202e09717348cab5b23c2995529df", + "content-hash": "1c87366c64fae22aad5422ef3c0a02ba", "packages": [ { "name": "allure-framework/allure-codeception", From ecaf564898b638275a16d4f69930db74778a8594 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Wed, 10 Jan 2024 12:13:57 +0530 Subject: [PATCH 602/674] MFTF_4.7.0 : modified the version to 4.7.0 --- CHANGELOG.md | 2 +- composer.json | 2 +- composer.lock | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32c54578a..b03e09480 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ Magento Functional Testing Framework Changelog ================================================ -4.6.2 +4.7.0 --------- ### Enhancements * Bumped all symfony dependencies to `^6.0 diff --git a/composer.json b/composer.json index a78e9aed9..d0d84a705 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": "4.6.2", + "version": "4.7.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 01aef5106..659f9a6a5 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": "1c87366c64fae22aad5422ef3c0a02ba", + "content-hash": "40f0fd18714709c457fa5f16513c2c81", "packages": [ { "name": "allure-framework/allure-codeception", From 47d8f80938a660784133a65edd7a9753c7d0555a Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 11 Jan 2024 10:55:06 +0530 Subject: [PATCH 603/674] remove-abandoned-packages : Removing abandoned packages --- composer.json | 2 - composer.lock | 198 ++------------------------------------------------ 2 files changed, 7 insertions(+), 193 deletions(-) diff --git a/composer.json b/composer.json index 1421890a8..44d587cde 100755 --- a/composer.json +++ b/composer.json @@ -50,11 +50,9 @@ }, "require-dev": { "brainmaestro/composer-git-hooks": "^2.8.5", - "codacy/coverage": "^1.4", "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", "phpunit/phpunit": "^9.5", - "sebastian/phpcpd": "~6.0.0", "squizlabs/php_codesniffer": "~3.7.0" }, "suggest": { diff --git a/composer.lock b/composer.lock index 9b5c74128..4fb209060 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": "a04202e09717348cab5b23c2995529df", + "content-hash": "e65878dd4199f493f8cf8d4d1d7e338a", "packages": [ { "name": "allure-framework/allure-codeception", @@ -267,16 +267,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.295.5", + "version": "3.295.9", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "cd9d48ebfdfc8fb5f6df9fe95dced622287f3412" + "reference": "8a2710fe85f453ac2face59779e923bbe5b71385" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/cd9d48ebfdfc8fb5f6df9fe95dced622287f3412", - "reference": "cd9d48ebfdfc8fb5f6df9fe95dced622287f3412", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8a2710fe85f453ac2face59779e923bbe5b71385", + "reference": "8a2710fe85f453ac2face59779e923bbe5b71385", "shasum": "" }, "require": { @@ -356,9 +356,9 @@ "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.295.5" + "source": "https://github.com/aws/aws-sdk-php/tree/3.295.9" }, - "time": "2024-01-03T19:12:43+00:00" + "time": "2024-01-10T19:07:38+00:00" }, { "name": "beberlei/assert", @@ -7867,128 +7867,6 @@ }, "time": "2021-02-08T15:59:11+00:00" }, - { - "name": "codacy/coverage", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/codacy/php-codacy-coverage.git", - "reference": "1852ca987c91ef466ebcfdbdd4e1788b653eaf1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/codacy/php-codacy-coverage/zipball/1852ca987c91ef466ebcfdbdd4e1788b653eaf1d", - "reference": "1852ca987c91ef466ebcfdbdd4e1788b653eaf1d", - "shasum": "" - }, - "require": { - "gitonomy/gitlib": ">=1.0", - "php": ">=5.3.3", - "symfony/console": "~2.5|~3.0|~4.0|~5.0" - }, - "require-dev": { - "clue/phar-composer": "^1.1", - "phpunit/phpunit": "~6.5" - }, - "bin": [ - "bin/codacycoverage" - ], - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jakob Pupke", - "email": "jakob.pupke@gmail.com" - } - ], - "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" - }, - { - "name": "gitonomy/gitlib", - "version": "v1.4.0", - "source": { - "type": "git", - "url": "https://github.com/gitonomy/gitlib.git", - "reference": "2c7fbbd9814178474d0bb1b6292701cb4ab508f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/2c7fbbd9814178474d0bb1b6292701cb4ab508f9", - "reference": "2c7fbbd9814178474d0bb1b6292701cb4ab508f9", - "shasum": "" - }, - "require": { - "ext-pcre": "*", - "php": "^8.0", - "symfony/polyfill-mbstring": "^1.7", - "symfony/process": "^5.4 || ^6.0 || ^7.0" - }, - "require-dev": { - "ext-fileinfo": "*", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^7.5.20 || ^8.5.20 || ^9.5.9", - "psr/log": "^1.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Gitonomy\\Git\\": "src/Gitonomy/Git/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Julien Didier", - "email": "genzo.wm@gmail.com", - "homepage": "https://github.com/juliendidier" - }, - { - "name": "Grégoire Pineau", - "email": "lyrixx@lyrixx.info", - "homepage": "https://github.com/lyrixx" - }, - { - "name": "Alexandre Salomé", - "email": "alexandre.salome@gmail.com", - "homepage": "https://github.com/alexandresalome" - } - ], - "description": "Library for accessing git", - "support": { - "issues": "https://github.com/gitonomy/gitlib/issues", - "source": "https://github.com/gitonomy/gitlib/tree/v1.4.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/gitonomy/gitlib", - "type": "tidelift" - } - ], - "time": "2023-12-20T13:02:08+00:00" - }, { "name": "pdepend/pdepend", "version": "2.16.2", @@ -8218,68 +8096,6 @@ ], "time": "2023-12-11T08:22:20+00:00" }, - { - "name": "sebastian/phpcpd", - "version": "6.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpcpd.git", - "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/f3683aa0db2e8e09287c2bb33a595b2873ea9176", - "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "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" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.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": "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" - } - ], - "abandoned": true, - "time": "2020-12-07T05:39:23+00:00" - }, { "name": "squizlabs/php_codesniffer", "version": "3.7.2", From bff3ef46054222f31a6e0d94912b25746e8faff0 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 11 Jan 2024 14:06:39 +0530 Subject: [PATCH 604/674] Fixed static check error --- bin/static-checks | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/static-checks b/bin/static-checks index c711726e4..b6733ba25 100755 --- a/bin/static-checks +++ b/bin/static-checks @@ -16,8 +16,6 @@ echo "" echo "===============================" echo " COPY PASTE DETECTOR" echo "===============================" -vendor/bin/phpcpd ./src -echo "" echo "===============================" echo " MESS DETECTOR" From e40617e34e3623750da8198dda00a5ac7cd3c066 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Thu, 1 Feb 2024 14:36:09 +0530 Subject: [PATCH 605/674] Update static-checks --- bin/static-checks | 1 - 1 file changed, 1 deletion(-) diff --git a/bin/static-checks b/bin/static-checks index 3e738d1f9..b6733ba25 100755 --- a/bin/static-checks +++ b/bin/static-checks @@ -17,7 +17,6 @@ echo "===============================" echo " COPY PASTE DETECTOR" echo "===============================" - echo "===============================" echo " MESS DETECTOR" echo "===============================" From 60f5f298f38eee4c36656e4fba4a82828cc32927 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Thu, 1 Feb 2024 14:36:39 +0530 Subject: [PATCH 606/674] Update composer.json --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index 399f4222b..328d145a9 100755 --- a/composer.json +++ b/composer.json @@ -53,7 +53,6 @@ "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", "phpunit/phpunit": "^10.0", - "squizlabs/php_codesniffer": "~3.7.0" }, "suggest": { From 639bdd25ee39949826f52337a97e8a1d401a74fc Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:28:15 +0530 Subject: [PATCH 607/674] Update TestLoggingUtil.php --- dev/tests/unit/Util/TestLoggingUtil.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/unit/Util/TestLoggingUtil.php b/dev/tests/unit/Util/TestLoggingUtil.php index b225a4874..5b15758c6 100644 --- a/dev/tests/unit/Util/TestLoggingUtil.php +++ b/dev/tests/unit/Util/TestLoggingUtil.php @@ -31,7 +31,7 @@ class TestLoggingUtil extends TestCase */ private function __construct() { - parent::__construct('', [], ''); + parent::__construct(null, [], ''); } /** From d730fb899e223cbb1590cf0b6a3f658d1b2cee6c Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 6 Feb 2024 15:36:07 +0530 Subject: [PATCH 608/674] Fix issue --- dev/tests/unit/Util/TestLoggingUtil.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/unit/Util/TestLoggingUtil.php b/dev/tests/unit/Util/TestLoggingUtil.php index 5b15758c6..b225a4874 100644 --- a/dev/tests/unit/Util/TestLoggingUtil.php +++ b/dev/tests/unit/Util/TestLoggingUtil.php @@ -31,7 +31,7 @@ class TestLoggingUtil extends TestCase */ private function __construct() { - parent::__construct(null, [], ''); + parent::__construct('', [], ''); } /** From e8b7d9a9143c1bcedc2bc17637f2d4ae7c5a62ea Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 8 Feb 2024 10:02:03 +0530 Subject: [PATCH 609/674] incorporated Alex's comment in the code --- .../Tests/SecretCredentialDataTestCest.php | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/dev/tests/verification/Tests/SecretCredentialDataTestCest.php b/dev/tests/verification/Tests/SecretCredentialDataTestCest.php index 1aaef5f3b..acbcd1488 100644 --- a/dev/tests/verification/Tests/SecretCredentialDataTestCest.php +++ b/dev/tests/verification/Tests/SecretCredentialDataTestCest.php @@ -4,20 +4,9 @@ * See COPYING.txt for license details. */ -namespace tests\verification\Tests; +namespace Magento\FunctionalTestingFramework\Tests\Verification; use Magento\FunctionalTestingFramework\AcceptanceTester; -use Magento\FunctionalTestingFramework\DataGenerator\Handlers\CredentialStore; -use Magento\FunctionalTestingFramework\DataGenerator\Handlers\PersistedObjectHandler; -use \Codeception\Util\Locator; -use Yandex\Allure\Adapter\Annotation\Features; -use Yandex\Allure\Adapter\Annotation\Stories; -use Yandex\Allure\Adapter\Annotation\Title; -use Yandex\Allure\Adapter\Annotation\Description; -use Yandex\Allure\Adapter\Annotation\Parameter; -use Yandex\Allure\Adapter\Annotation\Severity; -use Yandex\Allure\Adapter\Model\SeverityLevel; -use Yandex\Allure\Adapter\Annotation\TestCaseId; /** */ From c9670a79e860ce1b13c9268190a640a7e8067565 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 8 Feb 2024 10:03:45 +0530 Subject: [PATCH 610/674] Added namespace --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 328d145a9..51c7e5fcc 100755 --- a/composer.json +++ b/composer.json @@ -62,7 +62,8 @@ "files": ["src/Magento/FunctionalTestingFramework/_bootstrap.php"], "psr-4": { "Magento\\FunctionalTestingFramework\\": "src/Magento/FunctionalTestingFramework", - "MFTF\\": "dev/tests/functional/tests/MFTF" + "MFTF\\": "dev/tests/functional/tests/MFTF", + "Magento\\FunctionalTestingFramework\\Tests\\Verification\\": "dev/tests/verification/Tests" } }, "autoload-dev": { From 3d85c64f2d56c2ba06c6a926f92949be081d3f05 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 14 Mar 2024 11:03:12 +0530 Subject: [PATCH 611/674] ACQE-6291-ACQE-6292 : Upgrade nikic/php-parser to 5.0.2 , Upgrade monolog/monolog Upgrade to 3.5.0 --- composer.json | 4 ++-- composer.lock | 59 ++++++++++++++++++++++++++------------------------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/composer.json b/composer.json index 44d587cde..730e266a6 100755 --- a/composer.json +++ b/composer.json @@ -26,9 +26,9 @@ "ext-openssl": "*", "guzzlehttp/guzzle": "^7.3.0", "laminas/laminas-diactoros": "^3.0", - "monolog/monolog": "^2.3", + "monolog/monolog": "^3.0", "mustache/mustache": "~2.5", - "nikic/php-parser": "^4.4", + "nikic/php-parser": "^5.0", "php": ">=8.1", "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0||^11.0", diff --git a/composer.lock b/composer.lock index 4fb209060..83d586494 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": "e65878dd4199f493f8cf8d4d1d7e338a", + "content-hash": "e1faa069d85fcb2a5d0c6c9189e0f82e", "packages": [ { "name": "allure-framework/allure-codeception", @@ -2372,42 +2372,41 @@ }, { "name": "monolog/monolog", - "version": "2.9.2", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", - "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", "shasum": "" }, "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + "psr/log-implementation": "3.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "aws/aws-sdk-php": "^3.0", "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7 || ^8", "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2@dev", - "guzzlehttp/guzzle": "^7.4", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", - "predis/predis": "^1.1 || ^2.0", - "rollbar/rollbar": "^1.3 || ^2 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.1", + "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -2430,7 +2429,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -2458,7 +2457,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.9.2" + "source": "https://github.com/Seldaek/monolog/tree/3.5.0" }, "funding": [ { @@ -2470,7 +2469,7 @@ "type": "tidelift" } ], - "time": "2023-10-27T15:25:26+00:00" + "time": "2023-10-27T15:32:31+00:00" }, { "name": "mtdowling/jmespath.php", @@ -2649,25 +2648,27 @@ }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v5.0.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -2675,7 +2676,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2699,9 +2700,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" }, - "time": "2023-12-10T21:03:43+00:00" + "time": "2024-03-05T20:51:40+00:00" }, { "name": "paragonie/constant_time_encoding", From 9f9b5027ac7e6d83e7f34b7512bb17767a87b1f1 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 14 Mar 2024 11:27:00 +0530 Subject: [PATCH 612/674] ACQE-6293 : Symfony upgrade --- composer.lock | 156 +++++++++++++++++++++++++------------------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/composer.lock b/composer.lock index 83d586494..5c6a92758 100644 --- a/composer.lock +++ b/composer.lock @@ -5323,16 +5323,16 @@ }, { "name": "symfony/config", - "version": "v6.4.0", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "5d33e0fb707d603330e0edfd4691803a1253572e" + "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/5d33e0fb707d603330e0edfd4691803a1253572e", - "reference": "5d33e0fb707d603330e0edfd4691803a1253572e", + "url": "https://api.github.com/repos/symfony/config/zipball/6ea4affc27f2086c9d16b92ab5429ce1e3c38047", + "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047", "shasum": "" }, "require": { @@ -5378,7 +5378,7 @@ "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/v6.4.0" + "source": "https://github.com/symfony/config/tree/v6.4.4" }, "funding": [ { @@ -5394,20 +5394,20 @@ "type": "tidelift" } ], - "time": "2023-11-09T08:28:32+00:00" + "time": "2024-02-26T07:52:26+00:00" }, { "name": "symfony/console", - "version": "v5.4.34", + "version": "v5.4.36", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "4b4d8cd118484aa604ec519062113dd87abde18c" + "reference": "39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/4b4d8cd118484aa604ec519062113dd87abde18c", - "reference": "4b4d8cd118484aa604ec519062113dd87abde18c", + "url": "https://api.github.com/repos/symfony/console/zipball/39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e", + "reference": "39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e", "shasum": "" }, "require": { @@ -5477,7 +5477,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.34" + "source": "https://github.com/symfony/console/tree/v5.4.36" }, "funding": [ { @@ -5493,20 +5493,20 @@ "type": "tidelift" } ], - "time": "2023-12-08T13:33:03+00:00" + "time": "2024-02-20T16:33:57+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4" + "reference": "ee0f7ed5cf298cc019431bb3b3977ebc52b86229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/d036c6c0d0b09e24a14a35f8292146a658f986e4", - "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/ee0f7ed5cf298cc019431bb3b3977ebc52b86229", + "reference": "ee0f7ed5cf298cc019431bb3b3977ebc52b86229", "shasum": "" }, "require": { @@ -5542,7 +5542,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.0" + "source": "https://github.com/symfony/css-selector/tree/v6.4.3" }, "funding": [ { @@ -5558,20 +5558,20 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:40:20+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195" + "reference": "6236e5e843cb763e9d0f74245678b994afea5363" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/226ea431b1eda6f0d9f5a4b278757171960bb195", - "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6236e5e843cb763e9d0f74245678b994afea5363", + "reference": "6236e5e843cb763e9d0f74245678b994afea5363", "shasum": "" }, "require": { @@ -5623,7 +5623,7 @@ "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/v6.4.2" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.4" }, "funding": [ { @@ -5639,7 +5639,7 @@ "type": "tidelift" } ], - "time": "2023-12-28T19:16:56+00:00" + "time": "2024-02-22T20:27:10+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5710,16 +5710,16 @@ }, { "name": "symfony/dotenv", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "835f8d2d1022934ac038519de40b88158798c96f" + "reference": "f6f0a3dd102915b4c5bfdf4f4e3139a8cbf477a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/835f8d2d1022934ac038519de40b88158798c96f", - "reference": "835f8d2d1022934ac038519de40b88158798c96f", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/f6f0a3dd102915b4c5bfdf4f4e3139a8cbf477a0", + "reference": "f6f0a3dd102915b4c5bfdf4f4e3139a8cbf477a0", "shasum": "" }, "require": { @@ -5764,7 +5764,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.2" + "source": "https://github.com/symfony/dotenv/tree/v6.4.4" }, "funding": [ { @@ -5780,20 +5780,20 @@ "type": "tidelift" } ], - "time": "2023-12-28T19:16:56+00:00" + "time": "2024-02-08T17:53:17+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.2", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "e95216850555cd55e71b857eb9d6c2674124603a" + "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e95216850555cd55e71b857eb9d6c2674124603a", - "reference": "e95216850555cd55e71b857eb9d6c2674124603a", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef", "shasum": "" }, "require": { @@ -5844,7 +5844,7 @@ "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/v6.4.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.3" }, "funding": [ { @@ -5860,7 +5860,7 @@ "type": "tidelift" } ], - "time": "2023-12-27T22:16:42+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5940,16 +5940,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59" + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/952a8cb588c3bc6ce76f6023000fb932f16a6e59", - "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", "shasum": "" }, "require": { @@ -5983,7 +5983,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.0" + "source": "https://github.com/symfony/filesystem/tree/v6.4.3" }, "funding": [ { @@ -5999,7 +5999,7 @@ "type": "tidelift" } ], - "time": "2023-07-26T17:27:13+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/finder", @@ -6067,16 +6067,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271" + "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/172d807f9ef3fc3fbed8377cc57c20d389269271", - "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ebc713bc6e6f4b53f46539fc158be85dfcd77304", + "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304", "shasum": "" }, "require": { @@ -6124,7 +6124,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.2" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.4" }, "funding": [ { @@ -6140,20 +6140,20 @@ "type": "tidelift" } ], - "time": "2023-12-27T22:16:42+00:00" + "time": "2024-02-08T15:01:18+00:00" }, { "name": "symfony/mime", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205" + "reference": "5017e0a9398c77090b7694be46f20eb796262a34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", - "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", + "url": "https://api.github.com/repos/symfony/mime/zipball/5017e0a9398c77090b7694be46f20eb796262a34", + "reference": "5017e0a9398c77090b7694be46f20eb796262a34", "shasum": "" }, "require": { @@ -6208,7 +6208,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.0" + "source": "https://github.com/symfony/mime/tree/v6.4.3" }, "funding": [ { @@ -6224,7 +6224,7 @@ "type": "tidelift" } ], - "time": "2023-10-17T11:49:05+00:00" + "time": "2024-01-30T08:32:12+00:00" }, { "name": "symfony/polyfill-ctype", @@ -7042,16 +7042,16 @@ }, { "name": "symfony/process", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "c4b1ef0bc80533d87a2e969806172f1c2a980241" + "reference": "710e27879e9be3395de2b98da3f52a946039f297" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c4b1ef0bc80533d87a2e969806172f1c2a980241", - "reference": "c4b1ef0bc80533d87a2e969806172f1c2a980241", + "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", + "reference": "710e27879e9be3395de2b98da3f52a946039f297", "shasum": "" }, "require": { @@ -7083,7 +7083,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.2" + "source": "https://github.com/symfony/process/tree/v6.4.4" }, "funding": [ { @@ -7099,7 +7099,7 @@ "type": "tidelift" } ], - "time": "2023-12-22T16:42:54+00:00" + "time": "2024-02-20T12:31:00+00:00" }, { "name": "symfony/service-contracts", @@ -7185,16 +7185,16 @@ }, { "name": "symfony/stopwatch", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" + "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/416596166641f1f728b0a64f5b9dd07cceb410c1", + "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1", "shasum": "" }, "require": { @@ -7227,7 +7227,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.0" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.3" }, "funding": [ { @@ -7243,20 +7243,20 @@ "type": "tidelift" } ], - "time": "2023-02-16T10:14:28+00:00" + "time": "2024-01-23T14:35:58+00:00" }, { "name": "symfony/string", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc" + "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/7cb80bc10bfcdf6b5492741c0b9357dac66940bc", - "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc", + "url": "https://api.github.com/repos/symfony/string/zipball/4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", + "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", "shasum": "" }, "require": { @@ -7313,7 +7313,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.2" + "source": "https://github.com/symfony/string/tree/v6.4.4" }, "funding": [ { @@ -7329,7 +7329,7 @@ "type": "tidelift" } ], - "time": "2023-12-10T16:15:48+00:00" + "time": "2024-02-01T13:16:41+00:00" }, { "name": "symfony/var-dumper", @@ -7418,16 +7418,16 @@ }, { "name": "symfony/var-exporter", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e" + "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5fe9a0021b8d35e67d914716ec8de50716a68e7e", - "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0bd342e24aef49fc82a21bd4eedd3e665d177e5b", + "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b", "shasum": "" }, "require": { @@ -7473,7 +7473,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.2" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.4" }, "funding": [ { @@ -7489,7 +7489,7 @@ "type": "tidelift" } ], - "time": "2023-12-27T08:18:35+00:00" + "time": "2024-02-26T08:37:45+00:00" }, { "name": "symfony/yaml", From ac699145cbab266f49e45694718090cbd68f7ca0 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 14 Mar 2024 12:19:46 +0530 Subject: [PATCH 613/674] ACQE-6291-ACQE-6292 : Packages upgrade --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 730e266a6..0c7d02973 100755 --- a/composer.json +++ b/composer.json @@ -26,9 +26,9 @@ "ext-openssl": "*", "guzzlehttp/guzzle": "^7.3.0", "laminas/laminas-diactoros": "^3.0", - "monolog/monolog": "^3.0", + "monolog/monolog": "^2.3||^3.0", "mustache/mustache": "~2.5", - "nikic/php-parser": "^5.0", + "nikic/php-parser": "^4.4||^5.0", "php": ">=8.1", "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0||^11.0", From 80db1e688605e464a842599d67fdc43d77b18f33 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Thu, 14 Mar 2024 13:45:11 +0530 Subject: [PATCH 614/674] ACQE-6291-ACQE-6292 : Updated spomky/otphp --- composer.lock | 261 ++++++-------------------------------------------- 1 file changed, 30 insertions(+), 231 deletions(-) diff --git a/composer.lock b/composer.lock index 5c6a92758..221e9a462 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": "e1faa069d85fcb2a5d0c6c9189e0f82e", + "content-hash": "94004ce11c93034462b0b6d6aa8e5224", "packages": [ { "name": "allure-framework/allure-codeception", @@ -360,73 +360,6 @@ }, "time": "2024-01-10T19:07:38+00:00" }, - { - "name": "beberlei/assert", - "version": "v3.3.2", - "source": { - "type": "git", - "url": "https://github.com/beberlei/assert.git", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "php": "^7.0 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "*", - "phpstan/phpstan": "*", - "phpunit/phpunit": ">=6.0.0", - "yoast/phpunit-polyfills": "^0.1.0" - }, - "suggest": { - "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles" - }, - "type": "library", - "autoload": { - "files": [ - "lib/Assert/functions.php" - ], - "psr-4": { - "Assert\\": "lib/Assert" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de", - "role": "Lead Developer" - }, - { - "name": "Richard Quadling", - "email": "rquadling@gmail.com", - "role": "Collaborator" - } - ], - "description": "Thin assertion library for input validation in business models.", - "keywords": [ - "assert", - "assertion", - "validation" - ], - "support": { - "issues": "https://github.com/beberlei/assert/issues", - "source": "https://github.com/beberlei/assert/tree/v3.3.2" - }, - "time": "2021-12-16T21:41:27+00:00" - }, { "name": "behat/gherkin", "version": "v4.9.0", @@ -5248,43 +5181,38 @@ }, { "name": "spomky-labs/otphp", - "version": "v10.0.3", + "version": "11.2.0", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "9784d9f7c790eed26e102d6c78f12c754036c366" + "reference": "9a1569038bb1c8e98040b14b8bcbba54f25e7795" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9784d9f7c790eed26e102d6c78f12c754036c366", - "reference": "9784d9f7c790eed26e102d6c78f12c754036c366", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9a1569038bb1c8e98040b14b8bcbba54f25e7795", + "reference": "9a1569038bb1c8e98040b14b8bcbba54f25e7795", "shasum": "" }, "require": { - "beberlei/assert": "^3.0", "ext-mbstring": "*", "paragonie/constant_time_encoding": "^2.0", - "php": "^7.2|^8.0", - "thecodingmachine/safe": "^0.1.14|^1.0|^2.0" + "php": "^8.1" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-beberlei-assert": "^0.12", - "phpstan/phpstan-deprecation-rules": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^8.0", - "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0" + "ekino/phpstan-banned-code": "^1.0", + "infection/infection": "^0.26", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5.26", + "qossmic/deptrac-shim": "^1.0", + "rector/rector": "^0.15", + "symfony/phpunit-bridge": "^6.1", + "symplify/easy-coding-standard": "^11.0" }, "type": "library", - "extra": { - "branch-alias": { - "v10.0": "10.0.x-dev", - "v9.0": "9.0.x-dev", - "v8.3": "8.3.x-dev" - } - }, "autoload": { "psr-4": { "OTPHP\\": "src/" @@ -5317,9 +5245,19 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.3" + "source": "https://github.com/Spomky-Labs/otphp/tree/11.2.0" }, - "time": "2022-03-17T08:00:35+00:00" + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2023-03-16T19:16:25+00:00" }, { "name": "symfony/config", @@ -7563,145 +7501,6 @@ ], "time": "2023-11-06T11:00:25+00:00" }, - { - "name": "thecodingmachine/safe", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/thecodingmachine/safe.git", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "shasum": "" - }, - "require": { - "php": "^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "^3.2", - "thecodingmachine/phpstan-strict-rules": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "files": [ - "deprecated/apc.php", - "deprecated/array.php", - "deprecated/datetime.php", - "deprecated/libevent.php", - "deprecated/misc.php", - "deprecated/password.php", - "deprecated/mssql.php", - "deprecated/stats.php", - "deprecated/strings.php", - "lib/special_cases.php", - "deprecated/mysqli.php", - "generated/apache.php", - "generated/apcu.php", - "generated/array.php", - "generated/bzip2.php", - "generated/calendar.php", - "generated/classobj.php", - "generated/com.php", - "generated/cubrid.php", - "generated/curl.php", - "generated/datetime.php", - "generated/dir.php", - "generated/eio.php", - "generated/errorfunc.php", - "generated/exec.php", - "generated/fileinfo.php", - "generated/filesystem.php", - "generated/filter.php", - "generated/fpm.php", - "generated/ftp.php", - "generated/funchand.php", - "generated/gettext.php", - "generated/gmp.php", - "generated/gnupg.php", - "generated/hash.php", - "generated/ibase.php", - "generated/ibmDb2.php", - "generated/iconv.php", - "generated/image.php", - "generated/imap.php", - "generated/info.php", - "generated/inotify.php", - "generated/json.php", - "generated/ldap.php", - "generated/libxml.php", - "generated/lzf.php", - "generated/mailparse.php", - "generated/mbstring.php", - "generated/misc.php", - "generated/mysql.php", - "generated/network.php", - "generated/oci8.php", - "generated/opcache.php", - "generated/openssl.php", - "generated/outcontrol.php", - "generated/pcntl.php", - "generated/pcre.php", - "generated/pgsql.php", - "generated/posix.php", - "generated/ps.php", - "generated/pspell.php", - "generated/readline.php", - "generated/rpminfo.php", - "generated/rrd.php", - "generated/sem.php", - "generated/session.php", - "generated/shmop.php", - "generated/sockets.php", - "generated/sodium.php", - "generated/solr.php", - "generated/spl.php", - "generated/sqlsrv.php", - "generated/ssdeep.php", - "generated/ssh2.php", - "generated/stream.php", - "generated/strings.php", - "generated/swoole.php", - "generated/uodbc.php", - "generated/uopz.php", - "generated/url.php", - "generated/var.php", - "generated/xdiff.php", - "generated/xml.php", - "generated/xmlrpc.php", - "generated/yaml.php", - "generated/yaz.php", - "generated/zip.php", - "generated/zlib.php" - ], - "classmap": [ - "lib/DateTime.php", - "lib/DateTimeImmutable.php", - "lib/Exceptions/", - "deprecated/Exceptions/", - "generated/Exceptions/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHP core functions that throw exceptions instead of returning FALSE on error", - "support": { - "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" - }, - "time": "2023-04-05T11:54:14+00:00" - }, { "name": "theseer/tokenizer", "version": "1.2.2", From b39fc2183d6125708171d2484f2b1b1cd272f56a Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Sun, 17 Mar 2024 09:58:50 +0530 Subject: [PATCH 615/674] MFTF4.7.1 : Release Checklist --- CHANGELOG.md | 9 +++++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b03e09480..fb8550f32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ Magento Functional Testing Framework Changelog ================================================ +4.7.1 +--------- +### Enhancements +* Bumped all symfony dependencies to `^6.0 +* Removed abandoned package codacy/coverage +* Removed abandoned package sebastian/phpcpd +* Bumped monolog/monolog to ^3.0 +* Bumped nikic/php-parser to ^5.0 + 4.7.0 --------- ### Enhancements diff --git a/composer.json b/composer.json index a6cfd5dd6..54bd351a4 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": "4.7.0", + "version": "4.7.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 408fb5931..b9e80d0a2 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": "40f0fd18714709c457fa5f16513c2c81", + "content-hash": "2e2f0d12aa6286a374515516107f9f3e", "packages": [ { "name": "allure-framework/allure-codeception", From 2ffbfd444dd14a9263d5cabf30776ab41a853ec0 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 23 Jan 2024 16:23:37 +0530 Subject: [PATCH 616/674] ACQE-6085 : Static check for class and file name mismatch --- composer.json | 4 +- composer.lock | 474 +++++------------- .../Util/ClassFileNameCheckTest.php | 42 ++ .../Console/StaticChecksCommand.php | 2 +- .../StaticCheck/ClassFileNamingCheck.php | 182 +++++++ .../StaticCheck/StaticChecksList.php | 9 +- .../StaticCheck/TestDependencyCheck.php | 2 +- 7 files changed, 372 insertions(+), 343 deletions(-) create mode 100644 dev/tests/unit/Magento/FunctionalTestFramework/Util/ClassFileNameCheckTest.php create mode 100644 src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php diff --git a/composer.json b/composer.json index 44d587cde..0c7d02973 100755 --- a/composer.json +++ b/composer.json @@ -26,9 +26,9 @@ "ext-openssl": "*", "guzzlehttp/guzzle": "^7.3.0", "laminas/laminas-diactoros": "^3.0", - "monolog/monolog": "^2.3", + "monolog/monolog": "^2.3||^3.0", "mustache/mustache": "~2.5", - "nikic/php-parser": "^4.4", + "nikic/php-parser": "^4.4||^5.0", "php": ">=8.1", "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0||^11.0", diff --git a/composer.lock b/composer.lock index 4fb209060..221e9a462 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": "e65878dd4199f493f8cf8d4d1d7e338a", + "content-hash": "94004ce11c93034462b0b6d6aa8e5224", "packages": [ { "name": "allure-framework/allure-codeception", @@ -360,73 +360,6 @@ }, "time": "2024-01-10T19:07:38+00:00" }, - { - "name": "beberlei/assert", - "version": "v3.3.2", - "source": { - "type": "git", - "url": "https://github.com/beberlei/assert.git", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "php": "^7.0 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "*", - "phpstan/phpstan": "*", - "phpunit/phpunit": ">=6.0.0", - "yoast/phpunit-polyfills": "^0.1.0" - }, - "suggest": { - "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles" - }, - "type": "library", - "autoload": { - "files": [ - "lib/Assert/functions.php" - ], - "psr-4": { - "Assert\\": "lib/Assert" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de", - "role": "Lead Developer" - }, - { - "name": "Richard Quadling", - "email": "rquadling@gmail.com", - "role": "Collaborator" - } - ], - "description": "Thin assertion library for input validation in business models.", - "keywords": [ - "assert", - "assertion", - "validation" - ], - "support": { - "issues": "https://github.com/beberlei/assert/issues", - "source": "https://github.com/beberlei/assert/tree/v3.3.2" - }, - "time": "2021-12-16T21:41:27+00:00" - }, { "name": "behat/gherkin", "version": "v4.9.0", @@ -2372,42 +2305,41 @@ }, { "name": "monolog/monolog", - "version": "2.9.2", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", - "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", "shasum": "" }, "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + "psr/log-implementation": "3.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "aws/aws-sdk-php": "^3.0", "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7 || ^8", "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2@dev", - "guzzlehttp/guzzle": "^7.4", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", - "predis/predis": "^1.1 || ^2.0", - "rollbar/rollbar": "^1.3 || ^2 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.1", + "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -2430,7 +2362,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -2458,7 +2390,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.9.2" + "source": "https://github.com/Seldaek/monolog/tree/3.5.0" }, "funding": [ { @@ -2470,7 +2402,7 @@ "type": "tidelift" } ], - "time": "2023-10-27T15:25:26+00:00" + "time": "2023-10-27T15:32:31+00:00" }, { "name": "mtdowling/jmespath.php", @@ -2649,25 +2581,27 @@ }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v5.0.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -2675,7 +2609,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2699,9 +2633,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" }, - "time": "2023-12-10T21:03:43+00:00" + "time": "2024-03-05T20:51:40+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -5247,43 +5181,38 @@ }, { "name": "spomky-labs/otphp", - "version": "v10.0.3", + "version": "11.2.0", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "9784d9f7c790eed26e102d6c78f12c754036c366" + "reference": "9a1569038bb1c8e98040b14b8bcbba54f25e7795" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9784d9f7c790eed26e102d6c78f12c754036c366", - "reference": "9784d9f7c790eed26e102d6c78f12c754036c366", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9a1569038bb1c8e98040b14b8bcbba54f25e7795", + "reference": "9a1569038bb1c8e98040b14b8bcbba54f25e7795", "shasum": "" }, "require": { - "beberlei/assert": "^3.0", "ext-mbstring": "*", "paragonie/constant_time_encoding": "^2.0", - "php": "^7.2|^8.0", - "thecodingmachine/safe": "^0.1.14|^1.0|^2.0" + "php": "^8.1" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-beberlei-assert": "^0.12", - "phpstan/phpstan-deprecation-rules": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^8.0", - "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0" + "ekino/phpstan-banned-code": "^1.0", + "infection/infection": "^0.26", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5.26", + "qossmic/deptrac-shim": "^1.0", + "rector/rector": "^0.15", + "symfony/phpunit-bridge": "^6.1", + "symplify/easy-coding-standard": "^11.0" }, "type": "library", - "extra": { - "branch-alias": { - "v10.0": "10.0.x-dev", - "v9.0": "9.0.x-dev", - "v8.3": "8.3.x-dev" - } - }, "autoload": { "psr-4": { "OTPHP\\": "src/" @@ -5316,22 +5245,32 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.3" + "source": "https://github.com/Spomky-Labs/otphp/tree/11.2.0" }, - "time": "2022-03-17T08:00:35+00:00" + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2023-03-16T19:16:25+00:00" }, { "name": "symfony/config", - "version": "v6.4.0", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "5d33e0fb707d603330e0edfd4691803a1253572e" + "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/5d33e0fb707d603330e0edfd4691803a1253572e", - "reference": "5d33e0fb707d603330e0edfd4691803a1253572e", + "url": "https://api.github.com/repos/symfony/config/zipball/6ea4affc27f2086c9d16b92ab5429ce1e3c38047", + "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047", "shasum": "" }, "require": { @@ -5377,7 +5316,7 @@ "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/v6.4.0" + "source": "https://github.com/symfony/config/tree/v6.4.4" }, "funding": [ { @@ -5393,20 +5332,20 @@ "type": "tidelift" } ], - "time": "2023-11-09T08:28:32+00:00" + "time": "2024-02-26T07:52:26+00:00" }, { "name": "symfony/console", - "version": "v5.4.34", + "version": "v5.4.36", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "4b4d8cd118484aa604ec519062113dd87abde18c" + "reference": "39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/4b4d8cd118484aa604ec519062113dd87abde18c", - "reference": "4b4d8cd118484aa604ec519062113dd87abde18c", + "url": "https://api.github.com/repos/symfony/console/zipball/39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e", + "reference": "39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e", "shasum": "" }, "require": { @@ -5476,7 +5415,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.34" + "source": "https://github.com/symfony/console/tree/v5.4.36" }, "funding": [ { @@ -5492,20 +5431,20 @@ "type": "tidelift" } ], - "time": "2023-12-08T13:33:03+00:00" + "time": "2024-02-20T16:33:57+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4" + "reference": "ee0f7ed5cf298cc019431bb3b3977ebc52b86229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/d036c6c0d0b09e24a14a35f8292146a658f986e4", - "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/ee0f7ed5cf298cc019431bb3b3977ebc52b86229", + "reference": "ee0f7ed5cf298cc019431bb3b3977ebc52b86229", "shasum": "" }, "require": { @@ -5541,7 +5480,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.0" + "source": "https://github.com/symfony/css-selector/tree/v6.4.3" }, "funding": [ { @@ -5557,20 +5496,20 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:40:20+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195" + "reference": "6236e5e843cb763e9d0f74245678b994afea5363" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/226ea431b1eda6f0d9f5a4b278757171960bb195", - "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6236e5e843cb763e9d0f74245678b994afea5363", + "reference": "6236e5e843cb763e9d0f74245678b994afea5363", "shasum": "" }, "require": { @@ -5622,7 +5561,7 @@ "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/v6.4.2" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.4" }, "funding": [ { @@ -5638,7 +5577,7 @@ "type": "tidelift" } ], - "time": "2023-12-28T19:16:56+00:00" + "time": "2024-02-22T20:27:10+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5709,16 +5648,16 @@ }, { "name": "symfony/dotenv", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "835f8d2d1022934ac038519de40b88158798c96f" + "reference": "f6f0a3dd102915b4c5bfdf4f4e3139a8cbf477a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/835f8d2d1022934ac038519de40b88158798c96f", - "reference": "835f8d2d1022934ac038519de40b88158798c96f", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/f6f0a3dd102915b4c5bfdf4f4e3139a8cbf477a0", + "reference": "f6f0a3dd102915b4c5bfdf4f4e3139a8cbf477a0", "shasum": "" }, "require": { @@ -5763,7 +5702,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.2" + "source": "https://github.com/symfony/dotenv/tree/v6.4.4" }, "funding": [ { @@ -5779,20 +5718,20 @@ "type": "tidelift" } ], - "time": "2023-12-28T19:16:56+00:00" + "time": "2024-02-08T17:53:17+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.2", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "e95216850555cd55e71b857eb9d6c2674124603a" + "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e95216850555cd55e71b857eb9d6c2674124603a", - "reference": "e95216850555cd55e71b857eb9d6c2674124603a", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef", "shasum": "" }, "require": { @@ -5843,7 +5782,7 @@ "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/v6.4.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.3" }, "funding": [ { @@ -5859,7 +5798,7 @@ "type": "tidelift" } ], - "time": "2023-12-27T22:16:42+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5939,16 +5878,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59" + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/952a8cb588c3bc6ce76f6023000fb932f16a6e59", - "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", "shasum": "" }, "require": { @@ -5982,7 +5921,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.0" + "source": "https://github.com/symfony/filesystem/tree/v6.4.3" }, "funding": [ { @@ -5998,7 +5937,7 @@ "type": "tidelift" } ], - "time": "2023-07-26T17:27:13+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/finder", @@ -6066,16 +6005,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271" + "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/172d807f9ef3fc3fbed8377cc57c20d389269271", - "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ebc713bc6e6f4b53f46539fc158be85dfcd77304", + "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304", "shasum": "" }, "require": { @@ -6123,7 +6062,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.2" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.4" }, "funding": [ { @@ -6139,20 +6078,20 @@ "type": "tidelift" } ], - "time": "2023-12-27T22:16:42+00:00" + "time": "2024-02-08T15:01:18+00:00" }, { "name": "symfony/mime", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205" + "reference": "5017e0a9398c77090b7694be46f20eb796262a34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", - "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", + "url": "https://api.github.com/repos/symfony/mime/zipball/5017e0a9398c77090b7694be46f20eb796262a34", + "reference": "5017e0a9398c77090b7694be46f20eb796262a34", "shasum": "" }, "require": { @@ -6207,7 +6146,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.0" + "source": "https://github.com/symfony/mime/tree/v6.4.3" }, "funding": [ { @@ -6223,7 +6162,7 @@ "type": "tidelift" } ], - "time": "2023-10-17T11:49:05+00:00" + "time": "2024-01-30T08:32:12+00:00" }, { "name": "symfony/polyfill-ctype", @@ -7041,16 +6980,16 @@ }, { "name": "symfony/process", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "c4b1ef0bc80533d87a2e969806172f1c2a980241" + "reference": "710e27879e9be3395de2b98da3f52a946039f297" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c4b1ef0bc80533d87a2e969806172f1c2a980241", - "reference": "c4b1ef0bc80533d87a2e969806172f1c2a980241", + "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", + "reference": "710e27879e9be3395de2b98da3f52a946039f297", "shasum": "" }, "require": { @@ -7082,7 +7021,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.2" + "source": "https://github.com/symfony/process/tree/v6.4.4" }, "funding": [ { @@ -7098,7 +7037,7 @@ "type": "tidelift" } ], - "time": "2023-12-22T16:42:54+00:00" + "time": "2024-02-20T12:31:00+00:00" }, { "name": "symfony/service-contracts", @@ -7184,16 +7123,16 @@ }, { "name": "symfony/stopwatch", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" + "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/416596166641f1f728b0a64f5b9dd07cceb410c1", + "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1", "shasum": "" }, "require": { @@ -7226,7 +7165,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.0" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.3" }, "funding": [ { @@ -7242,20 +7181,20 @@ "type": "tidelift" } ], - "time": "2023-02-16T10:14:28+00:00" + "time": "2024-01-23T14:35:58+00:00" }, { "name": "symfony/string", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc" + "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/7cb80bc10bfcdf6b5492741c0b9357dac66940bc", - "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc", + "url": "https://api.github.com/repos/symfony/string/zipball/4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", + "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", "shasum": "" }, "require": { @@ -7312,7 +7251,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.2" + "source": "https://github.com/symfony/string/tree/v6.4.4" }, "funding": [ { @@ -7328,7 +7267,7 @@ "type": "tidelift" } ], - "time": "2023-12-10T16:15:48+00:00" + "time": "2024-02-01T13:16:41+00:00" }, { "name": "symfony/var-dumper", @@ -7417,16 +7356,16 @@ }, { "name": "symfony/var-exporter", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e" + "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5fe9a0021b8d35e67d914716ec8de50716a68e7e", - "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0bd342e24aef49fc82a21bd4eedd3e665d177e5b", + "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b", "shasum": "" }, "require": { @@ -7472,7 +7411,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.2" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.4" }, "funding": [ { @@ -7488,7 +7427,7 @@ "type": "tidelift" } ], - "time": "2023-12-27T08:18:35+00:00" + "time": "2024-02-26T08:37:45+00:00" }, { "name": "symfony/yaml", @@ -7562,145 +7501,6 @@ ], "time": "2023-11-06T11:00:25+00:00" }, - { - "name": "thecodingmachine/safe", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/thecodingmachine/safe.git", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "shasum": "" - }, - "require": { - "php": "^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "^3.2", - "thecodingmachine/phpstan-strict-rules": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "files": [ - "deprecated/apc.php", - "deprecated/array.php", - "deprecated/datetime.php", - "deprecated/libevent.php", - "deprecated/misc.php", - "deprecated/password.php", - "deprecated/mssql.php", - "deprecated/stats.php", - "deprecated/strings.php", - "lib/special_cases.php", - "deprecated/mysqli.php", - "generated/apache.php", - "generated/apcu.php", - "generated/array.php", - "generated/bzip2.php", - "generated/calendar.php", - "generated/classobj.php", - "generated/com.php", - "generated/cubrid.php", - "generated/curl.php", - "generated/datetime.php", - "generated/dir.php", - "generated/eio.php", - "generated/errorfunc.php", - "generated/exec.php", - "generated/fileinfo.php", - "generated/filesystem.php", - "generated/filter.php", - "generated/fpm.php", - "generated/ftp.php", - "generated/funchand.php", - "generated/gettext.php", - "generated/gmp.php", - "generated/gnupg.php", - "generated/hash.php", - "generated/ibase.php", - "generated/ibmDb2.php", - "generated/iconv.php", - "generated/image.php", - "generated/imap.php", - "generated/info.php", - "generated/inotify.php", - "generated/json.php", - "generated/ldap.php", - "generated/libxml.php", - "generated/lzf.php", - "generated/mailparse.php", - "generated/mbstring.php", - "generated/misc.php", - "generated/mysql.php", - "generated/network.php", - "generated/oci8.php", - "generated/opcache.php", - "generated/openssl.php", - "generated/outcontrol.php", - "generated/pcntl.php", - "generated/pcre.php", - "generated/pgsql.php", - "generated/posix.php", - "generated/ps.php", - "generated/pspell.php", - "generated/readline.php", - "generated/rpminfo.php", - "generated/rrd.php", - "generated/sem.php", - "generated/session.php", - "generated/shmop.php", - "generated/sockets.php", - "generated/sodium.php", - "generated/solr.php", - "generated/spl.php", - "generated/sqlsrv.php", - "generated/ssdeep.php", - "generated/ssh2.php", - "generated/stream.php", - "generated/strings.php", - "generated/swoole.php", - "generated/uodbc.php", - "generated/uopz.php", - "generated/url.php", - "generated/var.php", - "generated/xdiff.php", - "generated/xml.php", - "generated/xmlrpc.php", - "generated/yaml.php", - "generated/yaz.php", - "generated/zip.php", - "generated/zlib.php" - ], - "classmap": [ - "lib/DateTime.php", - "lib/DateTimeImmutable.php", - "lib/Exceptions/", - "deprecated/Exceptions/", - "generated/Exceptions/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHP core functions that throw exceptions instead of returning FALSE on error", - "support": { - "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" - }, - "time": "2023-04-05T11:54:14+00:00" - }, { "name": "theseer/tokenizer", "version": "1.2.2", diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ClassFileNameCheckTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ClassFileNameCheckTest.php new file mode 100644 index 000000000..cc95a8b36 --- /dev/null +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ClassFileNameCheckTest.php @@ -0,0 +1,42 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +declare(strict_types=1); + +namespace tests\unit\Magento\FunctionalTestFramework\Util; + +use tests\unit\Util\MagentoTestCase; +use Magento\FunctionalTestingFramework\StaticCheck\ClassFileNamingCheck; +use Magento\FunctionalTestingFramework\Util\Script\ScriptUtil; + +class ClassFileNameCheckTest extends MagentoTestCase +{ + /** + * This Test checks if the file name is renamed to match the class name if mismatch found in class and file name + */ + public function testClasAndFileMismatchStaticCheckWhenViolationsFound() + { + $scriptUtil = new ScriptUtil(); + $modulePaths = $scriptUtil->getAllModulePaths(); + $testXmlFiles = $scriptUtil->getModuleXmlFilesByScope($modulePaths, "Test"); + $classFileNameCheck = new ClassFileNamingCheck(); + $result = $classFileNameCheck->findErrorsInFileSet($testXmlFiles, "test"); + $this->assertMatchesRegularExpression('/does not match with file name/', $result[array_keys($result)[0]][0]); + } + + /** + * This Test checks if the file name is renamed to match the class name if + * mismatch not found in class and file name + */ + public function testClasAndFileMismatchStaticCheckWhenViolationsNotFound() + { + $scriptUtil = new ScriptUtil(); + $modulePaths = $scriptUtil->getAllModulePaths(); + $testXmlFiles = $scriptUtil->getModuleXmlFilesByScope($modulePaths, "Page"); + $classFileNameCheck = new ClassFileNamingCheck(); + $result = $classFileNameCheck->findErrorsInFileSet($testXmlFiles, "page"); + $this->assertEquals(count($result), 0); + } +} diff --git a/src/Magento/FunctionalTestingFramework/Console/StaticChecksCommand.php b/src/Magento/FunctionalTestingFramework/Console/StaticChecksCommand.php index 806508ef8..e8d67e04b 100644 --- a/src/Magento/FunctionalTestingFramework/Console/StaticChecksCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/StaticChecksCommand.php @@ -117,7 +117,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $staticOutput = $staticCheck->getOutput(); LoggingUtil::getInstance()->getLogger(get_class($staticCheck))->info($staticOutput); - $this->ioStyle->text($staticOutput); + $this->ioStyle->text($staticOutput??""); $this->ioStyle->text('Total execution time is ' . (string)($end - $start) . ' seconds.' . PHP_EOL); } diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php new file mode 100644 index 000000000..65dbd960b --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php @@ -0,0 +1,182 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\FunctionalTestingFramework\StaticCheck; + +use Symfony\Component\Console\Input\InputInterface; +use Exception; +use Magento\FunctionalTestingFramework\Util\Script\ScriptUtil; +use Symfony\Component\Finder\SplFileInfo; + +/** + * Class ClassFileNamingCheck + * @package Magento\FunctionalTestingFramework\StaticCheck + */ +class ClassFileNamingCheck implements StaticCheckInterface +{ + const ERROR_LOG_FILENAME = 'mftf-class-file-naming-check'; + const ERROR_LOG_MESSAGE = 'MFTF Class File Naming Check'; + const ALLOW_LIST_FILENAME = 'class-file-naming-allowlist'; + const WARNING_LOG_FILENAME = 'mftf-class-file-naming-warnings'; + + /** + * Array containing all warnings found after running the execute() function. + * @var array + */ + private $warnings = []; + /** + * Array containing all errors found after running the execute() function. + * @var array + */ + private $errors = []; + + /** + * String representing the output summary found after running the execute() function. + * @var string + */ + private $output; + + /** + * @var array $allowFailureEntities + */ + private $allowFailureEntities = []; + + /** + * ScriptUtil instance + * + * @var ScriptUtil + */ + private $scriptUtil; + /** + * Checks usage of pause action in action groups, tests and suites and prints out error to file. + * + * @param InputInterface $input + * @return void + * @throws Exception + */ + public function execute(InputInterface $input) + { + $this->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(); + } + foreach ($modulePaths as $modulePath) { + if (file_exists($modulePath . DIRECTORY_SEPARATOR . self::ALLOW_LIST_FILENAME)) { + $contents = file_get_contents($modulePath . DIRECTORY_SEPARATOR . self::ALLOW_LIST_FILENAME); + foreach (explode("\n", $contents) as $entity) { + $this->allowFailureEntities[$entity] = true; + } + } + } + $testXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Test"); + $actionGroupXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "ActionGroup"); + $pageXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Page"); + $sectionXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, "Section"); + $suiteXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'Suite'); + $this->errors = []; + $this->errors += $this->findErrorsInFileSet($testXmlFiles, 'test'); + $this->errors += $this->findErrorsInFileSet($actionGroupXmlFiles, 'actionGroup'); + $this->errors += $this->findErrorsInFileSet($pageXmlFiles, 'page'); + $this->errors += $this->findErrorsInFileSet($sectionXmlFiles, 'section'); + $this->errors += $this->findErrorsInFileSet($suiteXmlFiles, 'suite'); + + // hold on to the output and print any errors to a file + $this->output = $this->scriptUtil->printErrorsToFile( + $this->errors, + StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', + self::ERROR_LOG_MESSAGE + ); + if (!empty($this->warnings)) { + $this->output .= "\n " . $this->scriptUtil->printWarningsToFile( + $this->warnings, + StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::WARNING_LOG_FILENAME . '.txt', + self::ERROR_LOG_MESSAGE + ); + } + } + + /** + * 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; + } + + /** + * Returns Violations if found + * @return string + */ + private function findErrorsInFileSet($files, $fileType) + { + $errors = []; + /** @var SplFileInfo $filePath */ + + foreach ($files as $filePath) { + $fileNameWithoutExtension = pathinfo($filePath->getFilename(), PATHINFO_FILENAME); + $domDocument = new \DOMDocument(); + $domDocument->load($filePath); + $testResult = $this->getAttributesFromDOMNodeList( + $domDocument->getElementsByTagName($fileType), + ["type" => 'name'] + ); + if ($fileNameWithoutExtension != array_values($testResult[0])[0]) { + $isInAllowList = array_key_exists(array_values($testResult[0])[0], $this->allowFailureEntities); + if ($isInAllowList) { + $errorOutput = ucfirst($fileType). " name does not match with file name + {$filePath->getRealPath()}. ".ucfirst($fileType)." ".array_values($testResult[0])[0]; + $this->warnings[$filePath->getFilename()][] = $errorOutput; + continue; + } + $errorOutput = ucfirst($fileType). " name does not match with file name + {$filePath->getRealPath()}. ".ucfirst($fileType)." ".array_values($testResult[0])[0]; + $errors[$filePath->getFilename()][] = $errorOutput; + } + } + return $errors; + } + + /** + * Return attribute value for each node in DOMNodeList as an array + * + * @param DOMNodeList $nodes + * @param string $attributeName + * @return array + */ + private function getAttributesFromDOMNodeList($nodes, $attributeName) + { + $attributes = []; + foreach ($nodes as $node) { + if (is_string($attributeName)) { + $attributeValue = $node->getAttribute($attributeName); + } else { + $attributeValue = [$node->getAttribute(key($attributeName)) => + $node->getAttribute($attributeName[key($attributeName)])]; + } + if (!empty($attributeValue)) { + $attributes[] = $attributeValue; + } + } + return $attributes; + } +} diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php index 15afec527..0cb6b4a73 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php @@ -20,6 +20,9 @@ class StaticChecksList implements StaticCheckListInterface const PAUSE_ACTION_USAGE_CHECK_NAME = 'pauseActionUsage'; const CREATED_DATA_FROM_OUTSIDE_ACTIONGROUP = 'createdDataFromOutsideActionGroup'; const UNUSED_ENTITY_CHECK = 'unusedEntityCheck'; + + const CLASS_FILE_NAMING_CHECK = 'classFileNamingCheck'; + const STATIC_RESULTS = 'tests' . DIRECTORY_SEPARATOR .'_output' . DIRECTORY_SEPARATOR . 'static-results'; /** @@ -51,8 +54,10 @@ public function __construct(array $checks = []) 'annotations' => new AnnotationsCheck(), self::PAUSE_ACTION_USAGE_CHECK_NAME => new PauseActionUsageCheck(), self::UNUSED_ENTITY_CHECK => new UnusedEntityCheck(), - self::CREATED_DATA_FROM_OUTSIDE_ACTIONGROUP => new CreatedDataFromOutsideActionGroupCheck(), - ] + $checks; + self::CREATED_DATA_FROM_OUTSIDE_ACTIONGROUP => new CreatedDataFromOutsideActionGroupCheck(), + self::CLASS_FILE_NAMING_CHECK => new ClassFileNamingCheck(), + + ] + $checks; // Static checks error files directory if (null === self::$errorFilesPath) { diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php index 486fe8cdb..f7bfdeb72 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php @@ -179,7 +179,7 @@ public function getErrors(): array */ public function getOutput(): string { - return $this->output; + return $this->output??""; } /** From 7a1a097571261617e7e2988bd756344f7c798095 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Mon, 25 Mar 2024 15:52:00 +0530 Subject: [PATCH 617/674] ACQE-6085 : Change the access property --- .../StaticCheck/ClassFileNamingCheck.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php index 65dbd960b..03ad006cb 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php @@ -163,7 +163,7 @@ private function findErrorsInFileSet($files, $fileType) * @param string $attributeName * @return array */ - private function getAttributesFromDOMNodeList($nodes, $attributeName) + public function getAttributesFromDOMNodeList($nodes, $attributeName) { $attributes = []; foreach ($nodes as $node) { From 1e011319f36965b9a007b5009d8ad033dfbac136 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Mon, 25 Mar 2024 15:58:03 +0530 Subject: [PATCH 618/674] ACQE-6085 : Change the access property --- .../StaticCheck/ClassFileNamingCheck.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php index 03ad006cb..6606da721 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php @@ -125,7 +125,9 @@ public function getOutput() /** * Returns Violations if found - * @return string + * @param $files SplFileInfo + * @param $fileType string + * @return array */ private function findErrorsInFileSet($files, $fileType) { From 2b3fe51743a9f18cb18c71eced07ebb1101c2dd7 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Mon, 25 Mar 2024 16:00:04 +0530 Subject: [PATCH 619/674] ACQE-6085 : Change the access property --- .../StaticCheck/ClassFileNamingCheck.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php index 6606da721..2c465c97b 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php @@ -129,7 +129,7 @@ public function getOutput() * @param $fileType string * @return array */ - private function findErrorsInFileSet($files, $fileType) + public function findErrorsInFileSet($files, $fileType) { $errors = []; /** @var SplFileInfo $filePath */ From 77d5b807a09356565abe6902a12fbb5292cc4684 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Mon, 25 Mar 2024 16:05:21 +0530 Subject: [PATCH 620/674] ACQE-6085 : Change the access property --- .../StaticCheck/ClassFileNamingCheck.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php index 2c465c97b..2b282a963 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php @@ -125,8 +125,8 @@ public function getOutput() /** * Returns Violations if found - * @param $files SplFileInfo - * @param $fileType string + * @param SplFileInfo $files + * @param string $fileType * @return array */ public function findErrorsInFileSet($files, $fileType) From 0d08de89a1eff13ccf05939de2d69a22a2013a04 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Wed, 27 Mar 2024 12:42:48 -0500 Subject: [PATCH 621/674] ACQE-6085 : Static check for class and file name mismatch - Typo fix --- .../FunctionalTestFramework/Util/ClassFileNameCheckTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ClassFileNameCheckTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ClassFileNameCheckTest.php index cc95a8b36..4c830ca82 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ClassFileNameCheckTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ClassFileNameCheckTest.php @@ -16,7 +16,7 @@ class ClassFileNameCheckTest extends MagentoTestCase /** * This Test checks if the file name is renamed to match the class name if mismatch found in class and file name */ - public function testClasAndFileMismatchStaticCheckWhenViolationsFound() + public function testClassAndFileMismatchStaticCheckWhenViolationsFound() { $scriptUtil = new ScriptUtil(); $modulePaths = $scriptUtil->getAllModulePaths(); @@ -30,7 +30,7 @@ public function testClasAndFileMismatchStaticCheckWhenViolationsFound() * This Test checks if the file name is renamed to match the class name if * mismatch not found in class and file name */ - public function testClasAndFileMismatchStaticCheckWhenViolationsNotFound() + public function testClassAndFileMismatchStaticCheckWhenViolationsNotFound() { $scriptUtil = new ScriptUtil(); $modulePaths = $scriptUtil->getAllModulePaths(); From ae3b0e7c0c86cf8919d5449ba283d4d95209f9f2 Mon Sep 17 00:00:00 2001 From: Manjusha <glo24116@adobe.com> Date: Tue, 2 Apr 2024 10:47:29 +0530 Subject: [PATCH 622/674] MFTF4.7.2 : Release --- CHANGELOG.md | 6 ++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb8550f32..fb9bc98f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Magento Functional Testing Framework Changelog ================================================ +4.7.2 +--------- +### Enhancements +* Fail static tests when introduced filename does not equal the MFTF object name + contained within. + 4.7.1 --------- ### Enhancements diff --git a/composer.json b/composer.json index 54bd351a4..1b3df06bb 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": "4.7.1", + "version": "4.7.2", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index b9e80d0a2..d259ae8ff 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": "2e2f0d12aa6286a374515516107f9f3e", + "content-hash": "05b0c01ac74ec5759e894c033284a3d2", "packages": [ { "name": "allure-framework/allure-codeception", From 0fdedc842a473b10440d6303fab4389fe8318645 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:34:53 +0530 Subject: [PATCH 623/674] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb9bc98f9..2fe99b021 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Magento Functional Testing Framework Changelog 4.7.2 --------- ### Enhancements -* Fail static tests when introduced filename does not equal the MFTF object name +* Fail static test when introduced filename does not equal the MFTF object name contained within. 4.7.1 From 77d94156cbc7796d160d679fad5c59395989ca25 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 16 Apr 2024 11:59:48 +0530 Subject: [PATCH 624/674] ACQE-6470 : Fix error Last time we had introduced some code in ActionGroupArgumentsCheck in static check script . As the new code had to do with standards we had renamed it toActionGroupStandardsCheck . But i had missed to update in this file . As the result , on running upgrade script the was thrown stating that class not found . Fixing in this PR --- .../Upgrade/RemoveUnusedArguments.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Upgrade/RemoveUnusedArguments.php b/src/Magento/FunctionalTestingFramework/Upgrade/RemoveUnusedArguments.php index ced1042ad..87586c181 100644 --- a/src/Magento/FunctionalTestingFramework/Upgrade/RemoveUnusedArguments.php +++ b/src/Magento/FunctionalTestingFramework/Upgrade/RemoveUnusedArguments.php @@ -6,7 +6,7 @@ namespace Magento\FunctionalTestingFramework\Upgrade; -use Magento\FunctionalTestingFramework\StaticCheck\ActionGroupArgumentsCheck; +use Magento\FunctionalTestingFramework\StaticCheck\ActionGroupStandardsCheck; use Magento\FunctionalTestingFramework\Util\Script\ScriptUtil; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -40,7 +40,7 @@ public function execute(InputInterface $input, OutputInterface $output) $fileSystem = new Filesystem(); foreach ($xmlFiles as $file) { $contents = $file->getContents(); - $argumentsCheck = new ActionGroupArgumentsCheck(); + $argumentsCheck = new ActionGroupStandardsCheck(); /** @var DOMElement $actionGroup */ $actionGroup = $argumentsCheck->getActionGroupDomElement($contents); $allArguments = $argumentsCheck->extractActionGroupArguments($actionGroup); From 8e372712ae47963f5afe1cf3a50a60b68a9bd8d4 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Mon, 20 May 2024 11:00:28 +0530 Subject: [PATCH 625/674] MFTF 4.8.0 : Release PR --- CHANGELOG.md | 10 ++++++++++ composer.lock | 5 +---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fe99b021..78e8732ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ Magento Functional Testing Framework Changelog ================================================ +4.8.0 +--------- +### Enhancements +* Bumped phpunit/phpunit to ^10.0 +* Bumped allure-framework/allure-phpunit to ^3 +* Bumped codeception/module-webdriver ^4.0 + +### Fixes +* Fixed Class "Magento\FunctionalTestingFramework\StaticCheck\ActionGroupArgumentsCheck" not found on running vendor/bin/mftf build:project --upgrade. + 4.7.2 --------- ### Enhancements diff --git a/composer.lock b/composer.lock index f219f2227..a66f38246 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": "05b0c01ac74ec5759e894c033284a3d2", + "content-hash": "d7502676b92c5a98d2e2b45caaced667", "packages": [ { "name": "allure-framework/allure-codeception", @@ -268,7 +268,6 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.295.9", "source": { "type": "git", @@ -358,7 +357,6 @@ "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.295.9" }, "time": "2024-01-10T19:07:38+00:00" @@ -431,7 +429,6 @@ "time": "2024-01-08T19:04:58+00:00" }, { - "name": "behat/gherkin", "version": "v4.9.0", "source": { From 873477d524417d336e1c02463e68cbe5f9653c5e Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Mon, 20 May 2024 11:00:45 +0530 Subject: [PATCH 626/674] MFTF 4.8.0 : Release PR --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 55b9c5051..41935544d 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": "4.7.2", + "version": "4.8.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { From 36653586d5d35d08bbb695d2fb9e552804e9fa01 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Mon, 17 Jun 2024 11:10:25 +0530 Subject: [PATCH 627/674] ACQE-6701 : MFTF Component Health --- composer.json | 2 +- composer.lock | 1071 ++++++++++++++++++++++++------------------------- 2 files changed, 528 insertions(+), 545 deletions(-) diff --git a/composer.json b/composer.json index 41935544d..64fb9557f 100755 --- a/composer.json +++ b/composer.json @@ -53,7 +53,7 @@ "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", "phpunit/phpunit": "^10.0", - "squizlabs/php_codesniffer": "~3.7.0" + "squizlabs/php_codesniffer": "~3.10.1" }, "suggest": { "hoa/console": "Enables <pause /> action and interactive console functionality" diff --git a/composer.lock b/composer.lock index a66f38246..01efbf0c9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d7502676b92c5a98d2e2b45caaced667", + "content-hash": "e6e13fcf722a2c7ead9ccb46b3084cc1", "packages": [ { "name": "allure-framework/allure-codeception", - "version": "v2.3.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-codeception.git", - "reference": "d28f6ba7139406974b977e5611bc65b59c492a55" + "reference": "854320894b5e65952eb0cafd1555e9efb4543350" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/d28f6ba7139406974b977e5611bc65b59c492a55", - "reference": "d28f6ba7139406974b977e5611bc65b59c492a55", + "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/854320894b5e65952eb0cafd1555e9efb4543350", + "reference": "854320894b5e65952eb0cafd1555e9efb4543350", "shasum": "" }, "require": { @@ -27,7 +27,7 @@ "php": "^8" }, "require-dev": { - "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-phpunit": "^0.19.0", "remorhaz/php-json-data": "^0.5.3", "remorhaz/php-json-path": "^0.7.7", "squizlabs/php_codesniffer": "^3.7.2", @@ -56,7 +56,7 @@ } ], "description": "Allure Codeception integration", - "homepage": "http://allure.qatools.ru/", + "homepage": "https://allurereport.org/", "keywords": [ "allure", "attachments", @@ -71,7 +71,7 @@ "issues": "https://github.com/allure-framework/allure-codeception/issues", "source": "https://github.com/allure-framework/allure-codeception" }, - "time": "2023-05-31T14:10:46+00:00" + "time": "2024-05-28T09:54:01+00:00" }, { "name": "allure-framework/allure-php-commons", @@ -214,16 +214,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.4", + "version": "v1.2.5", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2" + "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/eb0c6e4e142224a10b08f49ebf87f32611d162b2", - "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", + "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", "shasum": "" }, "require": { @@ -262,22 +262,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.4" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.5" }, - "time": "2023-11-08T00:42:13+00:00" + "time": "2024-04-19T21:30:56+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.295.9", + "version": "3.314.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "8a2710fe85f453ac2face59779e923bbe5b71385" + "reference": "1f5ccf9c73a66fb85c7c5de8f11ed69e44c636ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/8a2710fe85f453ac2face59779e923bbe5b71385", - "reference": "8a2710fe85f453ac2face59779e923bbe5b71385", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/1f5ccf9c73a66fb85c7c5de8f11ed69e44c636ef", + "reference": "1f5ccf9c73a66fb85c7c5de8f11ed69e44c636ef", "shasum": "" }, "require": { @@ -357,76 +357,9 @@ "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.295.9" - }, - "time": "2024-01-10T19:07:38+00:00" - }, - { - "name": "beberlei/assert", - "version": "v3.3.2", - "source": { - "type": "git", - "url": "https://github.com/beberlei/assert.git", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "php": "^7.0 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "*", - "phpstan/phpstan": "*", - "phpunit/phpunit": ">=6.0.0", - "yoast/phpunit-polyfills": "^0.1.0" - }, - "suggest": { - "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles" - }, - "type": "library", - "autoload": { - "files": [ - "lib/Assert/functions.php" - ], - "psr-4": { - "Assert\\": "lib/Assert" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de", - "role": "Lead Developer" - }, - { - "name": "Richard Quadling", - "email": "rquadling@gmail.com", - "role": "Collaborator" - } - ], - "description": "Thin assertion library for input validation in business models.", - "keywords": [ - "assert", - "assertion", - "validation" - ], - "support": { - "issues": "https://github.com/beberlei/assert/issues", - "source": "https://github.com/beberlei/assert/tree/v3.3.2" + "source": "https://github.com/aws/aws-sdk-php/tree/3.314.2" }, - "time": "2024-01-08T19:04:58+00:00" + "time": "2024-06-14T18:11:34+00:00" }, { "name": "behat/gherkin", @@ -493,25 +426,25 @@ }, { "name": "brick/math", - "version": "0.11.0", + "version": "0.12.1", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", - "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", "shasum": "" }, "require": { - "php": "^8.0" + "php": "^8.1" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^9.0", - "vimeo/psalm": "5.0.0" + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" }, "type": "library", "autoload": { @@ -531,12 +464,17 @@ "arithmetic", "bigdecimal", "bignum", + "bignumber", "brick", - "math" + "decimal", + "integer", + "math", + "mathematics", + "rational" ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.11.0" + "source": "https://github.com/brick/math/tree/0.12.1" }, "funding": [ { @@ -544,20 +482,20 @@ "type": "github" } ], - "time": "2023-01-15T23:15:59+00:00" + "time": "2023-11-29T23:19:16+00:00" }, { "name": "codeception/codeception", - "version": "5.0.13", + "version": "5.1.2", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "713a90195efa2926566e24bfc623da703ff42bba" + "reference": "3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/713a90195efa2926566e24bfc623da703ff42bba", - "reference": "713a90195efa2926566e24bfc623da703ff42bba", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374", + "reference": "3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374", "shasum": "" }, "require": { @@ -568,13 +506,13 @@ "ext-json": "*", "ext-mbstring": "*", "php": "^8.0", - "phpunit/php-code-coverage": "^9.2 || ^10.0", - "phpunit/php-text-template": "^2.0 || ^3.0", - "phpunit/php-timer": "^5.0.3 || ^6.0", - "phpunit/phpunit": "^9.5.20 || ^10.0", + "phpunit/php-code-coverage": "^9.2 || ^10.0 || ^11.0", + "phpunit/php-text-template": "^2.0 || ^3.0 || ^4.0", + "phpunit/php-timer": "^5.0.3 || ^6.0 || ^7.0", + "phpunit/phpunit": "^9.5.20 || ^10.0 || ^11.0", "psy/psysh": "^0.11.2 || ^0.12", - "sebastian/comparator": "^4.0.5 || ^5.0", - "sebastian/diff": "^4.0.3 || ^5.0", + "sebastian/comparator": "^4.0.5 || ^5.0 || ^6.0", + "sebastian/diff": "^4.0.3 || ^5.0 || ^6.0", "symfony/console": ">=4.4.24 <8.0", "symfony/css-selector": ">=4.4.24 <8.0", "symfony/event-dispatcher": ">=4.4.24 <8.0", @@ -652,7 +590,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/5.0.13" + "source": "https://github.com/Codeception/Codeception/tree/5.1.2" }, "funding": [ { @@ -660,7 +598,7 @@ "type": "open_collective" } ], - "time": "2023-12-22T19:32:40+00:00" + "time": "2024-03-07T07:19:42+00:00" }, { "name": "codeception/lib-asserts", @@ -718,30 +656,30 @@ }, { "name": "codeception/lib-web", - "version": "1.0.4", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/Codeception/lib-web.git", - "reference": "28cb2ed1169de18e720bec758015aadc37d8344c" + "reference": "01ff7f9ed8760ba0b0805a0b3a843b4e74165a60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/lib-web/zipball/28cb2ed1169de18e720bec758015aadc37d8344c", - "reference": "28cb2ed1169de18e720bec758015aadc37d8344c", + "url": "https://api.github.com/repos/Codeception/lib-web/zipball/01ff7f9ed8760ba0b0805a0b3a843b4e74165a60", + "reference": "01ff7f9ed8760ba0b0805a0b3a843b4e74165a60", "shasum": "" }, "require": { "ext-mbstring": "*", "guzzlehttp/psr7": "^2.0", "php": "^8.0", + "phpunit/phpunit": "^9.5 | ^10.0 | ^11.0", "symfony/css-selector": ">=4.4.24 <8.0" }, "conflict": { "codeception/codeception": "<5.0.0-alpha3" }, "require-dev": { - "php-webdriver/webdriver": "^1.12", - "phpunit/phpunit": "^9.5 | ^10.0" + "php-webdriver/webdriver": "^1.12" }, "type": "library", "autoload": { @@ -765,9 +703,9 @@ ], "support": { "issues": "https://github.com/Codeception/lib-web/issues", - "source": "https://github.com/Codeception/lib-web/tree/1.0.4" + "source": "https://github.com/Codeception/lib-web/tree/1.0.6" }, - "time": "2023-12-01T11:38:22+00:00" + "time": "2024-02-06T20:50:08+00:00" }, { "name": "codeception/module-asserts", @@ -875,16 +813,16 @@ }, { "name": "codeception/module-webdriver", - "version": "4.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/Codeception/module-webdriver.git", - "reference": "c092fa4f686381d0621407c0136d608c2b419b85" + "reference": "68bd12857f2b3321d3114c3c87c9ad9345b3bd5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/c092fa4f686381d0621407c0136d608c2b419b85", - "reference": "c092fa4f686381d0621407c0136d608c2b419b85", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/68bd12857f2b3321d3114c3c87c9ad9345b3bd5e", + "reference": "68bd12857f2b3321d3114c3c87c9ad9345b3bd5e", "shasum": "" }, "require": { @@ -894,8 +832,8 @@ "ext-json": "*", "ext-mbstring": "*", "php": "^8.1", - "php-webdriver/webdriver": "^1.8.0", - "phpunit/phpunit": "^10.0" + "php-webdriver/webdriver": "^1.14.0", + "phpunit/phpunit": "^10.0 || ^11.0" }, "suggest": { "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" @@ -930,27 +868,27 @@ ], "support": { "issues": "https://github.com/Codeception/module-webdriver/issues", - "source": "https://github.com/Codeception/module-webdriver/tree/4.0.0" + "source": "https://github.com/Codeception/module-webdriver/tree/4.0.1" }, - "time": "2023-02-03T21:52:27+00:00" + "time": "2024-02-16T12:47:00+00:00" }, { "name": "codeception/stub", - "version": "4.1.2", + "version": "4.1.3", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "f6bc56e33e3f5ba7a831dfb968c49b27cf1676ad" + "reference": "4fcad2c165f365377486dc3fd8703b07f1f2fcae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/f6bc56e33e3f5ba7a831dfb968c49b27cf1676ad", - "reference": "f6bc56e33e3f5ba7a831dfb968c49b27cf1676ad", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/4fcad2c165f365377486dc3fd8703b07f1f2fcae", + "reference": "4fcad2c165f365377486dc3fd8703b07f1f2fcae", "shasum": "" }, "require": { "php": "^7.4 | ^8.0", - "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | 10.0.x-dev" + "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | ^11" }, "conflict": { "codeception/codeception": "<5.0.6" @@ -971,34 +909,34 @@ "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", "support": { "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/4.1.2" + "source": "https://github.com/Codeception/Stub/tree/4.1.3" }, - "time": "2023-10-07T19:22:36+00:00" + "time": "2024-02-02T19:21:00+00:00" }, { "name": "composer/ca-bundle", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "b66d11b7479109ab547f9405b97205640b17d385" + "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b66d11b7479109ab547f9405b97205640b17d385", - "reference": "b66d11b7479109ab547f9405b97205640b17d385", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", + "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", "shasum": "" }, "require": { "ext-openssl": "*", "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", + "phpstan/phpstan": "^1.10", "psr/log": "^1.0", "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", "extra": { @@ -1033,7 +971,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.4.0" + "source": "https://github.com/composer/ca-bundle/tree/1.5.0" }, "funding": [ { @@ -1049,20 +987,20 @@ "type": "tidelift" } ], - "time": "2023-12-18T12:05:55+00:00" + "time": "2024-03-15T14:00:32+00:00" }, { "name": "composer/class-map-generator", - "version": "1.1.0", + "version": "1.3.4", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9" + "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/953cc4ea32e0c31f2185549c7d216d7921f03da9", - "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", + "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", "shasum": "" }, "require": { @@ -1106,7 +1044,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.1.0" + "source": "https://github.com/composer/class-map-generator/tree/1.3.4" }, "funding": [ { @@ -1122,28 +1060,28 @@ "type": "tidelift" } ], - "time": "2023-06-30T13:58:57+00:00" + "time": "2024-06-12T14:13:04+00:00" }, { "name": "composer/composer", - "version": "2.6.6", + "version": "2.7.7", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "683557bd2466072777309d039534bb1332d0dda5" + "reference": "291942978f39435cf904d33739f98d7d4eca7b23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/683557bd2466072777309d039534bb1332d0dda5", - "reference": "683557bd2466072777309d039534bb1332d0dda5", + "url": "https://api.github.com/repos/composer/composer/zipball/291942978f39435cf904d33739f98d7d4eca7b23", + "reference": "291942978f39435cf904d33739f98d7d4eca7b23", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.0", + "composer/class-map-generator": "^1.3.3", "composer/metadata-minifier": "^1.0", "composer/pcre": "^2.1 || ^3.1", - "composer/semver": "^3.2.5", + "composer/semver": "^3.3", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", @@ -1153,7 +1091,7 @@ "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11", + "symfony/console": "^5.4.11 || ^6.0.11 || ^7", "symfony/filesystem": "^5.4 || ^6.0 || ^7", "symfony/finder": "^5.4 || ^6.0 || ^7", "symfony/polyfill-php73": "^1.24", @@ -1162,12 +1100,12 @@ "symfony/process": "^5.4 || ^6.0 || ^7" }, "require-dev": { - "phpstan/phpstan": "^1.9.3", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1", - "phpstan/phpstan-symfony": "^1.2.10", - "symfony/phpunit-bridge": "^6.0 || ^7" + "phpstan/phpstan": "^1.11.0", + "phpstan/phpstan-deprecation-rules": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.0", + "phpstan/phpstan-symfony": "^1.4.0", + "symfony/phpunit-bridge": "^6.4.1 || ^7.0.1" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -1180,7 +1118,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.6-dev" + "dev-main": "2.7-dev" }, "phpstan": { "includes": [ @@ -1220,7 +1158,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.6.6" + "source": "https://github.com/composer/composer/tree/2.7.7" }, "funding": [ { @@ -1236,7 +1174,7 @@ "type": "tidelift" } ], - "time": "2023-12-08T17:32:26+00:00" + "time": "2024-06-10T20:11:12+00:00" }, { "name": "composer/metadata-minifier", @@ -1309,16 +1247,16 @@ }, { "name": "composer/pcre", - "version": "3.1.1", + "version": "3.1.4", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" + "reference": "04229f163664973f68f38f6f73d917799168ef24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24", + "reference": "04229f163664973f68f38f6f73d917799168ef24", "shasum": "" }, "require": { @@ -1360,7 +1298,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.1" + "source": "https://github.com/composer/pcre/tree/3.1.4" }, "funding": [ { @@ -1376,7 +1314,7 @@ "type": "tidelift" } ], - "time": "2023-10-11T07:11:09+00:00" + "time": "2024-05-27T13:40:54+00:00" }, { "name": "composer/semver", @@ -1541,16 +1479,16 @@ }, { "name": "composer/xdebug-handler", - "version": "3.0.3", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, "require": { @@ -1561,7 +1499,7 @@ "require-dev": { "phpstan/phpstan": "^1.0", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" }, "type": "library", "autoload": { @@ -1585,9 +1523,9 @@ "performance" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" }, "funding": [ { @@ -1603,7 +1541,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T21:32:43+00:00" + "time": "2024-05-06T16:37:16+00:00" }, { "name": "csharpru/vault-php", @@ -1746,27 +1684,27 @@ }, { "name": "doctrine/lexer", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "84a527db05647743d50373e0ec53a152f2cde568" + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", - "reference": "84a527db05647743d50373e0ec53a152f2cde568", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^9.5", + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^5.0" + "vimeo/psalm": "^5.21" }, "type": "library", "autoload": { @@ -1803,7 +1741,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.0" + "source": "https://github.com/doctrine/lexer/tree/3.0.1" }, "funding": [ { @@ -1819,7 +1757,7 @@ "type": "tidelift" } ], - "time": "2022-12-15T16:57:16+00:00" + "time": "2024-02-05T11:56:58+00:00" }, { "name": "guzzlehttp/guzzle", @@ -2151,12 +2089,12 @@ "version": "v5.2.13", "source": { "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", + "url": "https://github.com/jsonrainbow/json-schema.git", "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", "shasum": "" }, @@ -2211,23 +2149,23 @@ "schema" ], "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/v5.2.13" + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/v5.2.13" }, "time": "2023-09-26T02:20:38+00:00" }, { "name": "laminas/laminas-diactoros", - "version": "3.3.0", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "4db52734837c60259c9b2d7caf08eef8f7f9b9ac" + "reference": "74cfb9a7522ffd2a161d1ebe10db2fc2abb9df45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/4db52734837c60259c9b2d7caf08eef8f7f9b9ac", - "reference": "4db52734837c60259c9b2d7caf08eef8f7f9b9ac", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/74cfb9a7522ffd2a161d1ebe10db2fc2abb9df45", + "reference": "74cfb9a7522ffd2a161d1ebe10db2fc2abb9df45", "shasum": "" }, "require": { @@ -2247,9 +2185,9 @@ "http-interop/http-factory-tests": "^0.9.0", "laminas/laminas-coding-standard": "~2.5.0", "php-http/psr7-integration-tests": "^1.3", - "phpunit/phpunit": "^9.5.28", + "phpunit/phpunit": "^9.6.16", "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.15.0" + "vimeo/psalm": "^5.22.1" }, "type": "library", "extra": { @@ -2299,20 +2237,20 @@ "type": "community_bridge" } ], - "time": "2023-10-26T11:01:07+00:00" + "time": "2024-02-16T16:06:16+00:00" }, { "name": "monolog/monolog", - "version": "3.5.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", "shasum": "" }, "require": { @@ -2335,7 +2273,7 @@ "phpstan/phpstan": "^1.9", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.1", + "phpunit/phpunit": "^10.5.17", "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", "symfony/mailer": "^5.4 || ^6", @@ -2388,7 +2326,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.5.0" + "source": "https://github.com/Seldaek/monolog/tree/3.6.0" }, "funding": [ { @@ -2400,7 +2338,7 @@ "type": "tidelift" } ], - "time": "2023-10-27T15:32:31+00:00" + "time": "2024-04-12T21:02:21+00:00" }, { "name": "mtdowling/jmespath.php", @@ -2520,16 +2458,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "shasum": "" }, "require": { @@ -2537,11 +2475,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -2567,7 +2506,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" }, "funding": [ { @@ -2575,7 +2514,7 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-06-12T14:39:25+00:00" }, { "name": "nikic/php-parser", @@ -2637,24 +2576,24 @@ }, { "name": "paragonie/constant_time_encoding", - "version": "v2.6.3", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "58c3f47f650c94ec05a151692652a868995d2938" + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", - "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512", + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512", "shasum": "" }, "require": { - "php": "^7|^8" + "php": "^8" }, "require-dev": { - "phpunit/phpunit": "^6|^7|^8|^9", - "vimeo/psalm": "^1|^2|^3|^4" + "phpunit/phpunit": "^9", + "vimeo/psalm": "^4|^5" }, "type": "library", "autoload": { @@ -2700,24 +2639,25 @@ "issues": "https://github.com/paragonie/constant_time_encoding/issues", "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2022-06-14T06:56:20+00:00" + "time": "2024-05-08T12:36:18+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -2758,9 +2698,15 @@ "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/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -2881,16 +2827,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.11", + "version": "10.1.14", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "78c3b7625965c2513ee96569a4dbb62601784145" + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", - "reference": "78c3b7625965c2513ee96569a4dbb62601784145", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", "shasum": "" }, "require": { @@ -2947,7 +2893,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" }, "funding": [ { @@ -2955,7 +2901,7 @@ "type": "github" } ], - "time": "2023-12-21T15:38:30+00:00" + "time": "2024-03-12T15:33:41+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3202,16 +3148,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.5", + "version": "10.5.21", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "ed21115d505b4b4f7dc7b5651464e19a2c7f7856" + "reference": "ac837816fa52078f7a5e17ed774f256a72a51af6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ed21115d505b4b4f7dc7b5651464e19a2c7f7856", - "reference": "ed21115d505b4b4f7dc7b5651464e19a2c7f7856", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ac837816fa52078f7a5e17ed774f256a72a51af6", + "reference": "ac837816fa52078f7a5e17ed774f256a72a51af6", "shasum": "" }, "require": { @@ -3283,7 +3229,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.5" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.21" }, "funding": [ { @@ -3299,7 +3245,7 @@ "type": "tidelift" } ], - "time": "2023-12-27T15:13:52+00:00" + "time": "2024-06-15T09:13:15+00:00" }, { "name": "psr/cache", @@ -3350,6 +3296,54 @@ }, "time": "2021-02-03T23:26:27+00:00" }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, { "name": "psr/container", "version": "2.0.2", @@ -3507,20 +3501,20 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", @@ -3544,7 +3538,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -3556,9 +3550,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", @@ -3665,16 +3659,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.0", + "version": "v0.12.4", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "750bf031a48fd07c673dbe3f11f72362ea306d0d" + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/750bf031a48fd07c673dbe3f11f72362ea306d0d", - "reference": "750bf031a48fd07c673dbe3f11f72362ea306d0d", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", "shasum": "" }, "require": { @@ -3738,9 +3732,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.0" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" }, - "time": "2023-12-20T15:28:09+00:00" + "time": "2024-06-10T01:18:23+00:00" }, { "name": "ralouphie/getallheaders", @@ -3877,20 +3871,20 @@ }, { "name": "ramsey/uuid", - "version": "4.7.5", + "version": "4.7.6", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" @@ -3953,7 +3947,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.5" + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, "funding": [ { @@ -3965,20 +3959,20 @@ "type": "tidelift" } ], - "time": "2023-11-08T05:53:05+00:00" + "time": "2024-04-27T21:32:50+00:00" }, { "name": "react/promise", - "version": "v3.1.0", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c" + "reference": "8a164643313c71354582dc850b42b33fa12a4b63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/e563d55d1641de1dea9f5e84f3cccc66d2bfe02c", - "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", "shasum": "" }, "require": { @@ -4030,7 +4024,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.1.0" + "source": "https://github.com/reactphp/promise/tree/v3.2.0" }, "funding": [ { @@ -4038,20 +4032,20 @@ "type": "open_collective" } ], - "time": "2023-11-16T16:21:57+00:00" + "time": "2024-05-24T10:39:05+00:00" }, { "name": "sebastian/cli-parser", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "shasum": "" }, "require": { @@ -4086,7 +4080,8 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" }, "funding": [ { @@ -4094,7 +4089,7 @@ "type": "github" } ], - "time": "2023-02-03T06:58:15+00:00" + "time": "2024-03-02T07:12:49+00:00" }, { "name": "sebastian/code-unit", @@ -4344,16 +4339,16 @@ }, { "name": "sebastian/diff", - "version": "5.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "shasum": "" }, "require": { @@ -4361,7 +4356,7 @@ }, "require-dev": { "phpunit/phpunit": "^10.0", - "symfony/process": "^4.2 || ^5" + "symfony/process": "^6.4" }, "type": "library", "extra": { @@ -4399,7 +4394,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" }, "funding": [ { @@ -4407,20 +4402,20 @@ "type": "github" } ], - "time": "2023-12-22T10:55:06+00:00" + "time": "2024-03-02T07:15:17+00:00" }, { "name": "sebastian/environment", - "version": "6.0.1", + "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", - "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "shasum": "" }, "require": { @@ -4435,7 +4430,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "6.1-dev" } }, "autoload": { @@ -4463,7 +4458,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" }, "funding": [ { @@ -4471,20 +4466,20 @@ "type": "github" } ], - "time": "2023-04-11T05:39:26+00:00" + "time": "2024-03-23T08:47:14+00:00" }, { "name": "sebastian/exporter", - "version": "5.1.1", + "version": "5.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", - "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", "shasum": "" }, "require": { @@ -4541,7 +4536,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" }, "funding": [ { @@ -4549,20 +4544,20 @@ "type": "github" } ], - "time": "2023-09-24T13:22:09+00:00" + "time": "2024-03-02T07:17:12+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.1", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "shasum": "" }, "require": { @@ -4596,14 +4591,14 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" }, "funding": [ { @@ -4611,7 +4606,7 @@ "type": "github" } ], - "time": "2023-07-19T07:19:23+00:00" + "time": "2024-03-02T07:19:19+00:00" }, { "name": "sebastian/lines-of-code", @@ -4957,16 +4952,16 @@ }, { "name": "seld/jsonlint", - "version": "1.10.1", + "version": "1.10.2", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "76d449a358ece77d6f1d6331c68453e657172202" + "reference": "9bb7db07b5d66d90f6ebf542f09fc67d800e5259" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/76d449a358ece77d6f1d6331c68453e657172202", - "reference": "76d449a358ece77d6f1d6331c68453e657172202", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9bb7db07b5d66d90f6ebf542f09fc67d800e5259", + "reference": "9bb7db07b5d66d90f6ebf542f09fc67d800e5259", "shasum": "" }, "require": { @@ -5005,7 +5000,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.10.1" + "source": "https://github.com/Seldaek/jsonlint/tree/1.10.2" }, "funding": [ { @@ -5017,7 +5012,7 @@ "type": "tidelift" } ], - "time": "2023-12-18T13:03:25+00:00" + "time": "2024-02-07T12:57:50+00:00" }, { "name": "seld/phar-utils", @@ -5130,36 +5125,38 @@ }, { "name": "spomky-labs/otphp", - "version": "11.2.0", + "version": "11.3.0", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "9a1569038bb1c8e98040b14b8bcbba54f25e7795" + "reference": "2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9a1569038bb1c8e98040b14b8bcbba54f25e7795", - "reference": "9a1569038bb1c8e98040b14b8bcbba54f25e7795", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33", + "reference": "2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33", "shasum": "" }, "require": { "ext-mbstring": "*", - "paragonie/constant_time_encoding": "^2.0", - "php": "^8.1" + "paragonie/constant_time_encoding": "^2.0 || ^3.0", + "php": ">=8.1", + "psr/clock": "^1.0", + "symfony/deprecation-contracts": "^3.2" }, "require-dev": { "ekino/phpstan-banned-code": "^1.0", - "infection/infection": "^0.26", + "infection/infection": "^0.26|^0.27|^0.28|^0.29", "php-parallel-lint/php-parallel-lint": "^1.3", "phpstan/phpstan": "^1.0", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5.26", + "phpunit/phpunit": "^9.5.26|^10.0|^11.0", "qossmic/deptrac-shim": "^1.0", - "rector/rector": "^0.15", - "symfony/phpunit-bridge": "^6.1", - "symplify/easy-coding-standard": "^11.0" + "rector/rector": "^1.0", + "symfony/phpunit-bridge": "^6.1|^7.0", + "symplify/easy-coding-standard": "^12.0" }, "type": "library", "autoload": { @@ -5194,7 +5191,7 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/11.2.0" + "source": "https://github.com/Spomky-Labs/otphp/tree/11.3.0" }, "funding": [ { @@ -5206,20 +5203,20 @@ "type": "patreon" } ], - "time": "2023-03-16T19:16:25+00:00" + "time": "2024-06-12T11:22:32+00:00" }, { "name": "symfony/config", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047" + "reference": "12e7e52515ce37191b193cf3365903c4f3951e35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/6ea4affc27f2086c9d16b92ab5429ce1e3c38047", - "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047", + "url": "https://api.github.com/repos/symfony/config/zipball/12e7e52515ce37191b193cf3365903c4f3951e35", + "reference": "12e7e52515ce37191b193cf3365903c4f3951e35", "shasum": "" }, "require": { @@ -5265,7 +5262,7 @@ "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/v6.4.4" + "source": "https://github.com/symfony/config/tree/v6.4.8" }, "funding": [ { @@ -5281,20 +5278,20 @@ "type": "tidelift" } ], - "time": "2024-02-26T07:52:26+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/console", - "version": "v5.4.36", + "version": "v5.4.40", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e" + "reference": "aa73115c0c24220b523625bfcfa655d7d73662dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e", - "reference": "39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e", + "url": "https://api.github.com/repos/symfony/console/zipball/aa73115c0c24220b523625bfcfa655d7d73662dd", + "reference": "aa73115c0c24220b523625bfcfa655d7d73662dd", "shasum": "" }, "require": { @@ -5364,7 +5361,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.36" + "source": "https://github.com/symfony/console/tree/v5.4.40" }, "funding": [ { @@ -5380,20 +5377,20 @@ "type": "tidelift" } ], - "time": "2024-02-20T16:33:57+00:00" + "time": "2024-05-31T14:33:22+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ee0f7ed5cf298cc019431bb3b3977ebc52b86229" + "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ee0f7ed5cf298cc019431bb3b3977ebc52b86229", - "reference": "ee0f7ed5cf298cc019431bb3b3977ebc52b86229", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4b61b02fe15db48e3687ce1c45ea385d1780fe08", + "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08", "shasum": "" }, "require": { @@ -5429,7 +5426,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.3" + "source": "https://github.com/symfony/css-selector/tree/v6.4.8" }, "funding": [ { @@ -5445,20 +5442,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "6236e5e843cb763e9d0f74245678b994afea5363" + "reference": "d3b618176e8c3a9e5772151c51eba0c52a0c771c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6236e5e843cb763e9d0f74245678b994afea5363", - "reference": "6236e5e843cb763e9d0f74245678b994afea5363", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d3b618176e8c3a9e5772151c51eba0c52a0c771c", + "reference": "d3b618176e8c3a9e5772151c51eba0c52a0c771c", "shasum": "" }, "require": { @@ -5510,7 +5507,7 @@ "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/v6.4.4" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.8" }, "funding": [ { @@ -5526,20 +5523,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { @@ -5548,7 +5545,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5577,7 +5574,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -5593,20 +5590,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/dotenv", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "f6f0a3dd102915b4c5bfdf4f4e3139a8cbf477a0" + "reference": "55aefa0029adff89ecffdb560820e945c7983f06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/f6f0a3dd102915b4c5bfdf4f4e3139a8cbf477a0", - "reference": "f6f0a3dd102915b4c5bfdf4f4e3139a8cbf477a0", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/55aefa0029adff89ecffdb560820e945c7983f06", + "reference": "55aefa0029adff89ecffdb560820e945c7983f06", "shasum": "" }, "require": { @@ -5651,7 +5648,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.4" + "source": "https://github.com/symfony/dotenv/tree/v6.4.8" }, "funding": [ { @@ -5667,20 +5664,20 @@ "type": "tidelift" } ], - "time": "2024-02-08T17:53:17+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef" + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae9d3a6f3003a6caf56acd7466d8d52378d44fef", - "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b", + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b", "shasum": "" }, "require": { @@ -5731,7 +5728,7 @@ "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/v6.4.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.8" }, "funding": [ { @@ -5747,20 +5744,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "shasum": "" }, "require": { @@ -5770,7 +5767,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5807,7 +5804,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" }, "funding": [ { @@ -5823,20 +5820,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/filesystem", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" + "reference": "4d37529150e7081c51b3c5d5718c55a04a9503f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/4d37529150e7081c51b3c5d5718c55a04a9503f3", + "reference": "4d37529150e7081c51b3c5d5718c55a04a9503f3", "shasum": "" }, "require": { @@ -5844,6 +5841,9 @@ "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, + "require-dev": { + "symfony/process": "^5.4|^6.4|^7.0" + }, "type": "library", "autoload": { "psr-4": { @@ -5870,7 +5870,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.3" + "source": "https://github.com/symfony/filesystem/tree/v6.4.8" }, "funding": [ { @@ -5886,20 +5886,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/finder", - "version": "v6.4.0", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + "reference": "3ef977a43883215d560a2cecb82ec8e62131471c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "url": "https://api.github.com/repos/symfony/finder/zipball/3ef977a43883215d560a2cecb82ec8e62131471c", + "reference": "3ef977a43883215d560a2cecb82ec8e62131471c", "shasum": "" }, "require": { @@ -5934,7 +5934,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.0" + "source": "https://github.com/symfony/finder/tree/v6.4.8" }, "funding": [ { @@ -5950,20 +5950,20 @@ "type": "tidelift" } ], - "time": "2023-10-31T17:30:12+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304" + "reference": "27de8cc95e11db7a50b027e71caaab9024545947" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ebc713bc6e6f4b53f46539fc158be85dfcd77304", - "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/27de8cc95e11db7a50b027e71caaab9024545947", + "reference": "27de8cc95e11db7a50b027e71caaab9024545947", "shasum": "" }, "require": { @@ -6011,7 +6011,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.4" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.8" }, "funding": [ { @@ -6027,20 +6027,20 @@ "type": "tidelift" } ], - "time": "2024-02-08T15:01:18+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/mime", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "5017e0a9398c77090b7694be46f20eb796262a34" + "reference": "618597ab8b78ac86d1c75a9d0b35540cda074f33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/5017e0a9398c77090b7694be46f20eb796262a34", - "reference": "5017e0a9398c77090b7694be46f20eb796262a34", + "url": "https://api.github.com/repos/symfony/mime/zipball/618597ab8b78ac86d1c75a9d0b35540cda074f33", + "reference": "618597ab8b78ac86d1c75a9d0b35540cda074f33", "shasum": "" }, "require": { @@ -6061,6 +6061,7 @@ "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", "symfony/property-access": "^5.4|^6.0|^7.0", "symfony/property-info": "^5.4|^6.0|^7.0", "symfony/serializer": "^6.3.2|^7.0" @@ -6095,7 +6096,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.3" + "source": "https://github.com/symfony/mime/tree/v6.4.8" }, "funding": [ { @@ -6111,20 +6112,20 @@ "type": "tidelift" } ], - "time": "2024-01-30T08:32:12+00:00" + "time": "2024-06-01T07:50:16+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "shasum": "" }, "require": { @@ -6138,9 +6139,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6177,7 +6175,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" }, "funding": [ { @@ -6193,20 +6191,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", "shasum": "" }, "require": { @@ -6217,9 +6215,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6258,7 +6253,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" }, "funding": [ { @@ -6274,20 +6269,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", - "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", "shasum": "" }, "require": { @@ -6300,9 +6295,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6345,7 +6337,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" }, "funding": [ { @@ -6361,20 +6353,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:30:37+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "shasum": "" }, "require": { @@ -6385,9 +6377,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6429,7 +6418,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" }, "funding": [ { @@ -6445,20 +6434,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "shasum": "" }, "require": { @@ -6472,9 +6461,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6512,7 +6498,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" }, "funding": [ { @@ -6528,20 +6514,20 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", - "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", "shasum": "" }, "require": { @@ -6549,9 +6535,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6588,7 +6571,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" }, "funding": [ { @@ -6604,20 +6587,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", "shasum": "" }, "require": { @@ -6625,9 +6608,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6667,7 +6647,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" }, "funding": [ { @@ -6683,20 +6663,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", "shasum": "" }, "require": { @@ -6704,9 +6684,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6750,7 +6727,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" }, "funding": [ { @@ -6766,20 +6743,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", "shasum": "" }, "require": { @@ -6787,9 +6764,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6829,7 +6803,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" }, "funding": [ { @@ -6845,20 +6819,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", - "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", "shasum": "" }, "require": { @@ -6867,9 +6841,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6909,7 +6880,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" }, "funding": [ { @@ -6925,20 +6896,20 @@ "type": "tidelift" } ], - "time": "2023-08-16T06:22:46+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/process", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "710e27879e9be3395de2b98da3f52a946039f297" + "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", - "reference": "710e27879e9be3395de2b98da3f52a946039f297", + "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", "shasum": "" }, "require": { @@ -6970,7 +6941,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.4" + "source": "https://github.com/symfony/process/tree/v6.4.8" }, "funding": [ { @@ -6986,25 +6957,26 @@ "type": "tidelift" } ], - "time": "2024-02-20T12:31:00+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.4.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -7012,7 +6984,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -7052,7 +7024,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -7068,20 +7040,20 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1" + "reference": "63e069eb616049632cde9674c46957819454b8aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/416596166641f1f728b0a64f5b9dd07cceb410c1", - "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/63e069eb616049632cde9674c46957819454b8aa", + "reference": "63e069eb616049632cde9674c46957819454b8aa", "shasum": "" }, "require": { @@ -7114,7 +7086,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.3" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.8" }, "funding": [ { @@ -7130,20 +7102,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:35:58+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/string", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9" + "reference": "a147c0f826c4a1f3afb763ab8e009e37c877a44d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", - "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", + "url": "https://api.github.com/repos/symfony/string/zipball/a147c0f826c4a1f3afb763ab8e009e37c877a44d", + "reference": "a147c0f826c4a1f3afb763ab8e009e37c877a44d", "shasum": "" }, "require": { @@ -7200,7 +7172,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.4" + "source": "https://github.com/symfony/string/tree/v6.4.8" }, "funding": [ { @@ -7216,20 +7188,20 @@ "type": "tidelift" } ], - "time": "2024-02-01T13:16:41+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.2", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f" + "reference": "ad23ca4312395f0a8a8633c831ef4c4ee542ed25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", - "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ad23ca4312395f0a8a8633c831ef4c4ee542ed25", + "reference": "ad23ca4312395f0a8a8633c831ef4c4ee542ed25", "shasum": "" }, "require": { @@ -7285,7 +7257,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.2" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.8" }, "funding": [ { @@ -7301,20 +7273,20 @@ "type": "tidelift" } ], - "time": "2023-12-28T19:16:56+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b" + "reference": "792ca836f99b340f2e9ca9497c7953948c49a504" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0bd342e24aef49fc82a21bd4eedd3e665d177e5b", - "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/792ca836f99b340f2e9ca9497c7953948c49a504", + "reference": "792ca836f99b340f2e9ca9497c7953948c49a504", "shasum": "" }, "require": { @@ -7322,6 +7294,8 @@ "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", @@ -7360,7 +7334,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.4" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.8" }, "funding": [ { @@ -7376,20 +7350,20 @@ "type": "tidelift" } ], - "time": "2024-02-26T08:37:45+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.0", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587" + "reference": "52903de178d542850f6f341ba92995d3d63e60c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587", - "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587", + "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", + "reference": "52903de178d542850f6f341ba92995d3d63e60c9", "shasum": "" }, "require": { @@ -7432,7 +7406,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.0" + "source": "https://github.com/symfony/yaml/tree/v6.4.8" }, "funding": [ { @@ -7448,20 +7422,20 @@ "type": "tidelift" } ], - "time": "2023-11-06T11:00:25+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -7490,7 +7464,7 @@ "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/1.2.2" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -7498,7 +7472,7 @@ "type": "github" } ], - "time": "2023-11-20T00:12:19+00:00" + "time": "2024-03-03T12:36:25+00:00" }, { "name": "weew/helpers-array", @@ -7847,16 +7821,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.7.2", + "version": "3.10.1", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" + "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", - "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/8f90f7a53ce271935282967f53d0894f8f1ff877", + "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877", "shasum": "" }, "require": { @@ -7866,11 +7840,11 @@ "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, "bin": [ - "bin/phpcs", - "bin/phpcbf" + "bin/phpcbf", + "bin/phpcs" ], "type": "library", "extra": { @@ -7885,20 +7859,29 @@ "authors": [ { "name": "Greg Sherwood", - "role": "lead" + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ "phpcs", "standards", "static analysis" ], "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, "funding": [ { @@ -7914,7 +7897,7 @@ "type": "open_collective" } ], - "time": "2023-02-22T23:07:41+00:00" + "time": "2024-05-22T21:24:41+00:00" } ], "aliases": [], From a717b6ca901b9c1351ac84ff83df20f9b440ac03 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Tue, 18 Jun 2024 10:54:53 +0530 Subject: [PATCH 628/674] ACQE-6716 | Unneeded reports are shown when MFTF Static tests fail --- .../StaticCheck/ClassFileNamingCheck.php | 2 +- .../StaticCheck/TestDependencyCheck.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php index 2b282a963..5c8df59d3 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php @@ -96,7 +96,7 @@ public function execute(InputInterface $input) StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', self::ERROR_LOG_MESSAGE ); - if (!empty($this->warnings)) { + if (!empty($this->warnings) && !empty($this->errors) ) { $this->output .= "\n " . $this->scriptUtil->printWarningsToFile( $this->warnings, StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::WARNING_LOG_FILENAME . '.txt', diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php index f7bfdeb72..a6050a682 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php @@ -155,7 +155,7 @@ public function execute(InputInterface $input) StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', self::ERROR_LOG_MESSAGE ); - if (!empty($this->warnings)) { + if (!empty($this->warnings) && !empty($this->errors) ) { $this->output .= "\n " . $this->scriptUtil->printWarningsToFile( $this->warnings, StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::WARNING_LOG_FILENAME . '.txt', From 1c53abe8d4a97c5902f22e23eabf5ec05e2fc4fd Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Tue, 18 Jun 2024 10:58:13 +0530 Subject: [PATCH 629/674] ACQE-6716 | Unneeded reports are shown when MFTF Static tests fail --- .../StaticCheck/ClassFileNamingCheck.php | 2 +- .../StaticCheck/TestDependencyCheck.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php index 5c8df59d3..4ce3c83d3 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/ClassFileNamingCheck.php @@ -96,7 +96,7 @@ public function execute(InputInterface $input) StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', self::ERROR_LOG_MESSAGE ); - if (!empty($this->warnings) && !empty($this->errors) ) { + if (!empty($this->warnings) && !empty($this->errors)) { $this->output .= "\n " . $this->scriptUtil->printWarningsToFile( $this->warnings, StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::WARNING_LOG_FILENAME . '.txt', diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php index a6050a682..01660c427 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/TestDependencyCheck.php @@ -155,7 +155,7 @@ public function execute(InputInterface $input) StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', self::ERROR_LOG_MESSAGE ); - if (!empty($this->warnings) && !empty($this->errors) ) { + if (!empty($this->warnings) && !empty($this->errors)) { $this->output .= "\n " . $this->scriptUtil->printWarningsToFile( $this->warnings, StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::WARNING_LOG_FILENAME . '.txt', From 34e4a2aa66f40a7b2efd62fdfde45f4249803581 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Tue, 25 Jun 2024 10:47:29 +0530 Subject: [PATCH 630/674] ACQE-6743 : MFTF 4.8.1 Release --- CHANGELOG.md | 13 +++++++++++++ composer.json | 2 +- composer.lock | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78e8732ba..3bbdf3bf5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,19 @@ Magento Functional Testing Framework Changelog ================================================ +4.8.1 +--------- +### Enhancements +* Bumped allure-codeception to ^2.4 +* Bumped squizlabs/php_codesniffer to 3.10.1 +* Bumped composer/composer to 2.7.7 +* Bumped monolog/monolog to 3.6.0 +* Bumped spomky-labs/otphp to 11.3.0 +* Bumped aws-sdk-php to 3.314.1 + +### Fixes +* Unneeded reports are shown when MFTF Static tests fail. + 4.8.0 --------- ### Enhancements diff --git a/composer.json b/composer.json index 64fb9557f..53992360b 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": "4.8.0", + "version": "4.8.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 01efbf0c9..6de7d9082 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": "e6e13fcf722a2c7ead9ccb46b3084cc1", + "content-hash": "b96c970184acc9d1a4e8c9824d260fa7", "packages": [ { "name": "allure-framework/allure-codeception", From df15e7fd079b6d04f47e53ed84a7890a237b77d0 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Wed, 14 Aug 2024 11:26:24 +0530 Subject: [PATCH 631/674] ACQE-5979 | Upgraded packages --- composer.json | 6 +- composer.lock | 645 +++++++++++++++++++++++++------------------------- 2 files changed, 325 insertions(+), 326 deletions(-) diff --git a/composer.json b/composer.json index 64fb9557f..2beb92e3b 100755 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0||^11.0", "symfony/config": "^6.4", - "symfony/console": "^5.4||^6.4", + "symfony/console": "^6.4", "symfony/dependency-injection": "^6.4", "symfony/dotenv": "^6.4", "symfony/filesystem": "^6.4", @@ -46,10 +46,12 @@ "symfony/var-exporter": "^6.4", "symfony/css-selector": "^6.4", "symfony/event-dispatcher": "^6.4", + "symfony/var-dumper": "^6.4||^7.0", + "symfony/yaml": "^6.4||^7.0", "weew/helpers-array": "^1.3" }, "require-dev": { - "brainmaestro/composer-git-hooks": "^2.8.5", + "brainmaestro/composer-git-hooks": "^3.0", "php-coveralls/php-coveralls": "^1.0||^2.2", "phpmd/phpmd": "^2.8.0", "phpunit/phpunit": "^10.0", diff --git a/composer.lock b/composer.lock index 01efbf0c9..df2adda37 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": "e6e13fcf722a2c7ead9ccb46b3084cc1", + "content-hash": "39f85b614b10e0d725b7e95cc7d6e9a7", "packages": [ { "name": "allure-framework/allure-codeception", @@ -214,16 +214,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.5", + "version": "v1.2.6", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b" + "reference": "a63485b65b6b3367039306496d49737cf1995408" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", - "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/a63485b65b6b3367039306496d49737cf1995408", + "reference": "a63485b65b6b3367039306496d49737cf1995408", "shasum": "" }, "require": { @@ -262,22 +262,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.5" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.6" }, - "time": "2024-04-19T21:30:56+00:00" + "time": "2024-06-13T17:21:28+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.314.2", + "version": "3.319.4", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "1f5ccf9c73a66fb85c7c5de8f11ed69e44c636ef" + "reference": "b39a56786bef9e922c8bdd0e47c73ba828cc512e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/1f5ccf9c73a66fb85c7c5de8f11ed69e44c636ef", - "reference": "1f5ccf9c73a66fb85c7c5de8f11ed69e44c636ef", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b39a56786bef9e922c8bdd0e47c73ba828cc512e", + "reference": "b39a56786bef9e922c8bdd0e47c73ba828cc512e", "shasum": "" }, "require": { @@ -330,7 +330,10 @@ ], "psr-4": { "Aws\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/data/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -357,9 +360,9 @@ "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.314.2" + "source": "https://github.com/aws/aws-sdk-php/tree/3.319.4" }, - "time": "2024-06-14T18:11:34+00:00" + "time": "2024-08-13T18:04:50+00:00" }, { "name": "behat/gherkin", @@ -813,16 +816,16 @@ }, { "name": "codeception/module-webdriver", - "version": "4.0.1", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/Codeception/module-webdriver.git", - "reference": "68bd12857f2b3321d3114c3c87c9ad9345b3bd5e" + "reference": "ef0ea8044eb01dc1e830df27fe431e71440a462f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/68bd12857f2b3321d3114c3c87c9ad9345b3bd5e", - "reference": "68bd12857f2b3321d3114c3c87c9ad9345b3bd5e", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/ef0ea8044eb01dc1e830df27fe431e71440a462f", + "reference": "ef0ea8044eb01dc1e830df27fe431e71440a462f", "shasum": "" }, "require": { @@ -868,9 +871,9 @@ ], "support": { "issues": "https://github.com/Codeception/module-webdriver/issues", - "source": "https://github.com/Codeception/module-webdriver/tree/4.0.1" + "source": "https://github.com/Codeception/module-webdriver/tree/4.0.2" }, - "time": "2024-02-16T12:47:00+00:00" + "time": "2024-08-10T00:18:42+00:00" }, { "name": "codeception/stub", @@ -915,16 +918,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99" + "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", - "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/063d9aa8696582f5a41dffbbaf3c81024f0a604a", + "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a", "shasum": "" }, "require": { @@ -934,7 +937,7 @@ }, "require-dev": { "phpstan/phpstan": "^1.10", - "psr/log": "^1.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", "symfony/phpunit-bridge": "^4.2 || ^5", "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, @@ -971,7 +974,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.0" + "source": "https://github.com/composer/ca-bundle/tree/1.5.1" }, "funding": [ { @@ -987,7 +990,7 @@ "type": "tidelift" } ], - "time": "2024-03-15T14:00:32+00:00" + "time": "2024-07-08T15:28:20+00:00" }, { "name": "composer/class-map-generator", @@ -1247,30 +1250,38 @@ }, { "name": "composer/pcre", - "version": "3.1.4", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "04229f163664973f68f38f6f73d917799168ef24" + "reference": "ea4ab6f9580a4fd221e0418f2c357cdd39102a90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24", - "reference": "04229f163664973f68f38f6f73d917799168ef24", + "url": "https://api.github.com/repos/composer/pcre/zipball/ea4ab6f9580a4fd221e0418f2c357cdd39102a90", + "reference": "ea4ab6f9580a4fd221e0418f2c357cdd39102a90", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, + "conflict": { + "phpstan/phpstan": "<1.11.8" + }, "require-dev": { - "phpstan/phpstan": "^1.3", + "phpstan/phpstan": "^1.11.8", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] } }, "autoload": { @@ -1298,7 +1309,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.4" + "source": "https://github.com/composer/pcre/tree/3.2.0" }, "funding": [ { @@ -1314,20 +1325,20 @@ "type": "tidelift" } ], - "time": "2024-05-27T13:40:54+00:00" + "time": "2024-07-25T09:36:02+00:00" }, { "name": "composer/semver", - "version": "3.4.0", + "version": "3.4.2", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", + "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", "shasum": "" }, "require": { @@ -1379,7 +1390,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.0" + "source": "https://github.com/composer/semver/tree/3.4.2" }, "funding": [ { @@ -1395,7 +1406,7 @@ "type": "tidelift" } ], - "time": "2023-08-31T09:50:34+00:00" + "time": "2024-07-12T11:35:52+00:00" }, { "name": "composer/spdx-licenses", @@ -1761,22 +1772,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.8.1", + "version": "7.9.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -1787,9 +1798,9 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "guzzle/client-integration-tests": "3.0.2", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -1867,7 +1878,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" }, "funding": [ { @@ -1883,20 +1894,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:35:24+00:00" + "time": "2024-07-24T11:22:20+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", "shasum": "" }, "require": { @@ -1904,7 +1915,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "type": "library", "extra": { @@ -1950,7 +1961,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.2" + "source": "https://github.com/guzzle/promises/tree/2.0.3" }, "funding": [ { @@ -1966,20 +1977,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:19:20+00:00" + "time": "2024-07-18T10:29:17+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.2", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { @@ -1994,8 +2005,8 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -2066,7 +2077,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.2" + "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, "funding": [ { @@ -2082,24 +2093,24 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:05:35+00:00" + "time": "2024-07-18T11:15:46+00:00" }, { "name": "justinrainbow/json-schema", - "version": "v5.2.13", + "version": "5.3.0", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", - "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "require-dev": { "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", @@ -2110,11 +2121,6 @@ "bin/validate-json" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, "autoload": { "psr-4": { "JsonSchema\\": "src/JsonSchema/" @@ -2150,9 +2156,9 @@ ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/v5.2.13" + "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" }, - "time": "2023-09-26T02:20:38+00:00" + "time": "2024-07-06T21:00:26+00:00" }, { "name": "laminas/laminas-diactoros", @@ -2241,16 +2247,16 @@ }, { "name": "monolog/monolog", - "version": "3.6.0", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", - "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", "shasum": "" }, "require": { @@ -2326,7 +2332,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.6.0" + "source": "https://github.com/Seldaek/monolog/tree/3.7.0" }, "funding": [ { @@ -2338,7 +2344,7 @@ "type": "tidelift" } ], - "time": "2024-04-12T21:02:21+00:00" + "time": "2024-06-28T09:40:51+00:00" }, { "name": "mtdowling/jmespath.php", @@ -2518,16 +2524,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.0.2", + "version": "v5.1.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", - "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", "shasum": "" }, "require": { @@ -2538,7 +2544,7 @@ }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -2570,9 +2576,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" }, - "time": "2024-03-05T20:51:40+00:00" + "time": "2024-07-01T20:03:41+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -2827,16 +2833,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.14", + "version": "10.1.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", "shasum": "" }, "require": { @@ -2893,7 +2899,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" }, "funding": [ { @@ -2901,7 +2907,7 @@ "type": "github" } ], - "time": "2024-03-12T15:33:41+00:00" + "time": "2024-06-29T08:25:15+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3148,16 +3154,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.21", + "version": "10.5.30", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "ac837816fa52078f7a5e17ed774f256a72a51af6" + "reference": "b15524febac0153876b4ba9aab3326c2ee94c897" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ac837816fa52078f7a5e17ed774f256a72a51af6", - "reference": "ac837816fa52078f7a5e17ed774f256a72a51af6", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b15524febac0153876b4ba9aab3326c2ee94c897", + "reference": "b15524febac0153876b4ba9aab3326c2ee94c897", "shasum": "" }, "require": { @@ -3167,26 +3173,26 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.5", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-invoker": "^4.0", - "phpunit/php-text-template": "^3.0", - "phpunit/php-timer": "^6.0", - "sebastian/cli-parser": "^2.0", - "sebastian/code-unit": "^2.0", - "sebastian/comparator": "^5.0", - "sebastian/diff": "^5.0", - "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.1", - "sebastian/global-state": "^6.0.1", - "sebastian/object-enumerator": "^5.0", - "sebastian/recursion-context": "^5.0", - "sebastian/type": "^4.0", - "sebastian/version": "^4.0" + "phpunit/php-code-coverage": "^10.1.15", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.2", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.2", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.0", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" @@ -3229,7 +3235,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.21" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.30" }, "funding": [ { @@ -3245,7 +3251,7 @@ "type": "tidelift" } ], - "time": "2024-06-15T09:13:15+00:00" + "time": "2024-08-13T06:09:37+00:00" }, { "name": "psr/cache", @@ -4204,16 +4210,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.1", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", + "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", "shasum": "" }, "require": { @@ -4224,7 +4230,7 @@ "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.3" + "phpunit/phpunit": "^10.4" }, "type": "library", "extra": { @@ -4269,7 +4275,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.2" }, "funding": [ { @@ -4277,7 +4283,7 @@ "type": "github" } ], - "time": "2023-08-14T13:18:12+00:00" + "time": "2024-08-12T06:03:08+00:00" }, { "name": "sebastian/complexity", @@ -4952,23 +4958,23 @@ }, { "name": "seld/jsonlint", - "version": "1.10.2", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "9bb7db07b5d66d90f6ebf542f09fc67d800e5259" + "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9bb7db07b5d66d90f6ebf542f09fc67d800e5259", - "reference": "9bb7db07b5d66d90f6ebf542f09fc67d800e5259", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2", + "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.5", + "phpstan/phpstan": "^1.11", "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" }, "bin": [ @@ -5000,7 +5006,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.10.2" + "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0" }, "funding": [ { @@ -5012,7 +5018,7 @@ "type": "tidelift" } ], - "time": "2024-02-07T12:57:50+00:00" + "time": "2024-07-11T14:55:45+00:00" }, { "name": "seld/phar-utils", @@ -5282,52 +5288,47 @@ }, { "name": "symfony/console", - "version": "v5.4.40", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "aa73115c0c24220b523625bfcfa655d7d73662dd" + "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/aa73115c0c24220b523625bfcfa655d7d73662dd", - "reference": "aa73115c0c24220b523625bfcfa655d7d73662dd", + "url": "https://api.github.com/repos/symfony/console/zipball/504974cbe43d05f83b201d6498c206f16fc0cdbc", + "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" }, "provide": { - "psr/log-implementation": "1.0|2.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -5361,7 +5362,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.40" + "source": "https://github.com/symfony/console/tree/v6.4.10" }, "funding": [ { @@ -5377,7 +5378,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-07-26T12:30:32+00:00" }, { "name": "symfony/css-selector", @@ -5446,16 +5447,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v6.4.8", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "d3b618176e8c3a9e5772151c51eba0c52a0c771c" + "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d3b618176e8c3a9e5772151c51eba0c52a0c771c", - "reference": "d3b618176e8c3a9e5772151c51eba0c52a0c771c", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5caf9c5f6085f13b27d70a236b776c07e4a1c3eb", + "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb", "shasum": "" }, "require": { @@ -5507,7 +5508,7 @@ "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/v6.4.8" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.10" }, "funding": [ { @@ -5523,7 +5524,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-07-26T07:32:07+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5594,16 +5595,16 @@ }, { "name": "symfony/dotenv", - "version": "v6.4.8", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "55aefa0029adff89ecffdb560820e945c7983f06" + "reference": "2ae0c84cc9be0dc1eeb86016970b63c764d8472e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/55aefa0029adff89ecffdb560820e945c7983f06", - "reference": "55aefa0029adff89ecffdb560820e945c7983f06", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/2ae0c84cc9be0dc1eeb86016970b63c764d8472e", + "reference": "2ae0c84cc9be0dc1eeb86016970b63c764d8472e", "shasum": "" }, "require": { @@ -5648,7 +5649,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.8" + "source": "https://github.com/symfony/dotenv/tree/v6.4.10" }, "funding": [ { @@ -5664,7 +5665,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-07-09T18:29:35+00:00" }, { "name": "symfony/event-dispatcher", @@ -5824,16 +5825,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.8", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "4d37529150e7081c51b3c5d5718c55a04a9503f3" + "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/4d37529150e7081c51b3c5d5718c55a04a9503f3", - "reference": "4d37529150e7081c51b3c5d5718c55a04a9503f3", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", + "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", "shasum": "" }, "require": { @@ -5870,7 +5871,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.8" + "source": "https://github.com/symfony/filesystem/tree/v6.4.9" }, "funding": [ { @@ -5886,20 +5887,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-06-28T09:49:33+00:00" }, { "name": "symfony/finder", - "version": "v6.4.8", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "3ef977a43883215d560a2cecb82ec8e62131471c" + "reference": "af29198d87112bebdd397bd7735fbd115997824c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3ef977a43883215d560a2cecb82ec8e62131471c", - "reference": "3ef977a43883215d560a2cecb82ec8e62131471c", + "url": "https://api.github.com/repos/symfony/finder/zipball/af29198d87112bebdd397bd7735fbd115997824c", + "reference": "af29198d87112bebdd397bd7735fbd115997824c", "shasum": "" }, "require": { @@ -5934,7 +5935,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.8" + "source": "https://github.com/symfony/finder/tree/v6.4.10" }, "funding": [ { @@ -5950,20 +5951,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-07-24T07:06:38+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.8", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "27de8cc95e11db7a50b027e71caaab9024545947" + "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/27de8cc95e11db7a50b027e71caaab9024545947", - "reference": "27de8cc95e11db7a50b027e71caaab9024545947", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/117f1f20a7ade7bcea28b861fb79160a21a1e37b", + "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b", "shasum": "" }, "require": { @@ -6011,7 +6012,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.8" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.10" }, "funding": [ { @@ -6027,20 +6028,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-07-26T12:36:27+00:00" }, { "name": "symfony/mime", - "version": "v6.4.8", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "618597ab8b78ac86d1c75a9d0b35540cda074f33" + "reference": "7d048964877324debdcb4e0549becfa064a20d43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/618597ab8b78ac86d1c75a9d0b35540cda074f33", - "reference": "618597ab8b78ac86d1c75a9d0b35540cda074f33", + "url": "https://api.github.com/repos/symfony/mime/zipball/7d048964877324debdcb4e0549becfa064a20d43", + "reference": "7d048964877324debdcb4e0549becfa064a20d43", "shasum": "" }, "require": { @@ -6054,7 +6055,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.3.2" + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", @@ -6064,7 +6065,7 @@ "symfony/process": "^5.4|^6.4|^7.0", "symfony/property-access": "^5.4|^6.0|^7.0", "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.3.2|^7.0" + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", "autoload": { @@ -6096,7 +6097,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.8" + "source": "https://github.com/symfony/mime/tree/v6.4.9" }, "funding": [ { @@ -6112,20 +6113,20 @@ "type": "tidelift" } ], - "time": "2024-06-01T07:50:16+00:00" + "time": "2024-06-28T09:49:33+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", "shasum": "" }, "require": { @@ -6175,7 +6176,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" }, "funding": [ { @@ -6191,20 +6192,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", "shasum": "" }, "require": { @@ -6253,7 +6254,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" }, "funding": [ { @@ -6269,20 +6270,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", "shasum": "" }, "require": { @@ -6337,7 +6338,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" }, "funding": [ { @@ -6353,20 +6354,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", "shasum": "" }, "require": { @@ -6418,7 +6419,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" }, "funding": [ { @@ -6434,20 +6435,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "shasum": "" }, "require": { @@ -6498,7 +6499,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" }, "funding": [ { @@ -6514,20 +6515,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + "reference": "10112722600777e02d2745716b70c5db4ca70442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", + "reference": "10112722600777e02d2745716b70c5db4ca70442", "shasum": "" }, "require": { @@ -6571,7 +6572,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" }, "funding": [ { @@ -6587,20 +6588,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" + "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", - "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1", + "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1", "shasum": "" }, "require": { @@ -6647,7 +6648,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0" }, "funding": [ { @@ -6663,20 +6664,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", "shasum": "" }, "require": { @@ -6727,7 +6728,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" }, "funding": [ { @@ -6743,20 +6744,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" + "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", - "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", + "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", "shasum": "" }, "require": { @@ -6803,7 +6804,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" }, "funding": [ { @@ -6819,25 +6820,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-php80": "^1.14" + "php": ">=7.1" }, "type": "library", "extra": { @@ -6880,7 +6880,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" }, "funding": [ { @@ -6896,7 +6896,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:35:24+00:00" }, { "name": "symfony/process", @@ -7106,16 +7106,16 @@ }, { "name": "symfony/string", - "version": "v6.4.8", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "a147c0f826c4a1f3afb763ab8e009e37c877a44d" + "reference": "ccf9b30251719567bfd46494138327522b9a9446" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/a147c0f826c4a1f3afb763ab8e009e37c877a44d", - "reference": "a147c0f826c4a1f3afb763ab8e009e37c877a44d", + "url": "https://api.github.com/repos/symfony/string/zipball/ccf9b30251719567bfd46494138327522b9a9446", + "reference": "ccf9b30251719567bfd46494138327522b9a9446", "shasum": "" }, "require": { @@ -7172,7 +7172,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.8" + "source": "https://github.com/symfony/string/tree/v6.4.10" }, "funding": [ { @@ -7188,38 +7188,36 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-07-22T10:21:14+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.8", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "ad23ca4312395f0a8a8633c831ef4c4ee542ed25" + "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ad23ca4312395f0a8a8633c831ef4c4ee542ed25", - "reference": "ad23ca4312395f0a8a8633c831ef4c4ee542ed25", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/86af4617cca75a6e28598f49ae0690f3b9d4591f", + "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.0.4" }, "bin": [ "Resources/bin/var-dump-server" @@ -7257,7 +7255,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.8" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.3" }, "funding": [ { @@ -7273,20 +7271,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-07-26T12:41:01+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.8", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "792ca836f99b340f2e9ca9497c7953948c49a504" + "reference": "f9a060622e0d93777b7f8687ec4860191e16802e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/792ca836f99b340f2e9ca9497c7953948c49a504", - "reference": "792ca836f99b340f2e9ca9497c7953948c49a504", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9a060622e0d93777b7f8687ec4860191e16802e", + "reference": "f9a060622e0d93777b7f8687ec4860191e16802e", "shasum": "" }, "require": { @@ -7334,7 +7332,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.8" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.9" }, "funding": [ { @@ -7350,32 +7348,31 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-06-24T15:53:56+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.8", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9" + "reference": "fa34c77015aa6720469db7003567b9f772492bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9", + "url": "https://api.github.com/repos/symfony/yaml/zipball/fa34c77015aa6720469db7003567b9f772492bf2", + "reference": "fa34c77015aa6720469db7003567b9f772492bf2", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -7406,7 +7403,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.8" + "source": "https://github.com/symfony/yaml/tree/v7.1.1" }, "funding": [ { @@ -7422,7 +7419,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "theseer/tokenizer", @@ -7519,26 +7516,26 @@ "packages-dev": [ { "name": "brainmaestro/composer-git-hooks", - "version": "v2.8.5", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/BrainMaestro/composer-git-hooks.git", - "reference": "ffed8803690ac12214082120eee3441b00aa390e" + "reference": "684dc85f480268baf5e13f39a3cc494eeb2536e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/BrainMaestro/composer-git-hooks/zipball/ffed8803690ac12214082120eee3441b00aa390e", - "reference": "ffed8803690ac12214082120eee3441b00aa390e", + "url": "https://api.github.com/repos/BrainMaestro/composer-git-hooks/zipball/684dc85f480268baf5e13f39a3cc494eeb2536e8", + "reference": "684dc85f480268baf5e13f39a3cc494eeb2536e8", "shasum": "" }, "require": { - "php": "^5.6 || >=7.0", - "symfony/console": "^3.2 || ^4.0 || ^5.0" + "php": "^8.0", + "symfony/console": "^5.0|^6.0|^7.0" }, "require-dev": { "ext-json": "*", - "friendsofphp/php-cs-fixer": "^2.9", - "phpunit/phpunit": "^5.7 || ^7.0" + "friendsofphp/php-cs-fixer": "^3.0", + "phpunit/phpunit": "^9|^10|^11" }, "bin": [ "cghooks" @@ -7549,11 +7546,11 @@ "pre-commit": "composer check-style", "pre-push": [ "composer test", - "appver=$(grep -o -E '\\d.\\d.\\d' cghooks)", - "tag=$(git describe --tags --abbrev=0)", - "if [ \"$tag\" != \"v$appver\" ]; then", - "echo \"The most recent tag $tag does not match the application version $appver\\n\"", + "appver=$(grep -o -E '[0-9]+\\.[0-9]+\\.[0-9]+(-alpha\\.[0-9]+)?' cghooks)", + "tag=$(git tag | tail -n 1)", "tag=${tag#v}", + "if [ \"$tag\" != \"$appver\" ]; then", + "echo \"The most recent tag $tag does not match the application version $appver\\n\"", "sed -i -E \"s/$appver/$tag/\" cghooks", "exit 1", "fi" @@ -7586,9 +7583,9 @@ ], "support": { "issues": "https://github.com/BrainMaestro/composer-git-hooks/issues", - "source": "https://github.com/BrainMaestro/composer-git-hooks/tree/v2.8.5" + "source": "https://github.com/BrainMaestro/composer-git-hooks/tree/v3.0.0" }, - "time": "2021-02-08T15:59:11+00:00" + "time": "2024-06-22T09:17:59+00:00" }, { "name": "pdepend/pdepend", @@ -7821,16 +7818,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.10.1", + "version": "3.10.2", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877" + "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/8f90f7a53ce271935282967f53d0894f8f1ff877", - "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/86e5f5dd9a840c46810ebe5ff1885581c42a3017", + "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017", "shasum": "" }, "require": { @@ -7897,7 +7894,7 @@ "type": "open_collective" } ], - "time": "2024-05-22T21:24:41+00:00" + "time": "2024-07-21T23:26:44+00:00" } ], "aliases": [], From 450c815a150a77e3070252dab87763f093828413 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Wed, 14 Aug 2024 11:30:10 +0530 Subject: [PATCH 632/674] ACQE-5979 | Upgraded packages --- composer.lock | 47 +++++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/composer.lock b/composer.lock index df2adda37..26fcb29ed 100644 --- a/composer.lock +++ b/composer.lock @@ -7192,32 +7192,34 @@ }, { "name": "symfony/var-dumper", - "version": "v7.1.3", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f" + "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/86af4617cca75a6e28598f49ae0690f3b9d4591f", - "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a71cc3374f5fb9759da1961d28c452373b343dd4", + "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" }, "bin": [ "Resources/bin/var-dump-server" @@ -7255,7 +7257,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.3" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.10" }, "funding": [ { @@ -7271,7 +7273,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-07-26T12:30:32+00:00" }, { "name": "symfony/var-exporter", @@ -7352,27 +7354,28 @@ }, { "name": "symfony/yaml", - "version": "v7.1.1", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "fa34c77015aa6720469db7003567b9f772492bf2" + "reference": "52903de178d542850f6f341ba92995d3d63e60c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/fa34c77015aa6720469db7003567b9f772492bf2", - "reference": "fa34c77015aa6720469db7003567b9f772492bf2", + "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", + "reference": "52903de178d542850f6f341ba92995d3d63e60c9", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0" + "symfony/console": "^5.4|^6.0|^7.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -7403,7 +7406,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.1" + "source": "https://github.com/symfony/yaml/tree/v6.4.8" }, "funding": [ { @@ -7419,7 +7422,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "theseer/tokenizer", From 0a8cada0fb428c618cacc97e57cc3bebad37b411 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Wed, 21 Aug 2024 11:24:13 +0530 Subject: [PATCH 633/674] ACQE-5979 | [MFTF Framework]FollowUp Ticket - Update Symfony/Console to 6.4 and above --- composer.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/composer.lock b/composer.lock index 26fcb29ed..2eacae312 100644 --- a/composer.lock +++ b/composer.lock @@ -268,16 +268,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.319.4", + "version": "3.320.4", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "b39a56786bef9e922c8bdd0e47c73ba828cc512e" + "reference": "e6af3e760864d43a30d8b7deb4f9dc6a49a5f66a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b39a56786bef9e922c8bdd0e47c73ba828cc512e", - "reference": "b39a56786bef9e922c8bdd0e47c73ba828cc512e", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/e6af3e760864d43a30d8b7deb4f9dc6a49a5f66a", + "reference": "e6af3e760864d43a30d8b7deb4f9dc6a49a5f66a", "shasum": "" }, "require": { @@ -360,9 +360,9 @@ "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.319.4" + "source": "https://github.com/aws/aws-sdk-php/tree/3.320.4" }, - "time": "2024-08-13T18:04:50+00:00" + "time": "2024-08-20T18:20:32+00:00" }, { "name": "behat/gherkin", @@ -1250,26 +1250,26 @@ }, { "name": "composer/pcre", - "version": "3.2.0", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "ea4ab6f9580a4fd221e0418f2c357cdd39102a90" + "reference": "1637e067347a0c40bbb1e3cd786b20dcab556a81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/ea4ab6f9580a4fd221e0418f2c357cdd39102a90", - "reference": "ea4ab6f9580a4fd221e0418f2c357cdd39102a90", + "url": "https://api.github.com/repos/composer/pcre/zipball/1637e067347a0c40bbb1e3cd786b20dcab556a81", + "reference": "1637e067347a0c40bbb1e3cd786b20dcab556a81", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, "conflict": { - "phpstan/phpstan": "<1.11.8" + "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "phpstan/phpstan": "^1.11.8", + "phpstan/phpstan": "^1.11.10", "phpstan/phpstan-strict-rules": "^1.1", "phpunit/phpunit": "^8 || ^9" }, @@ -1309,7 +1309,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.2.0" + "source": "https://github.com/composer/pcre/tree/3.3.0" }, "funding": [ { @@ -1325,7 +1325,7 @@ "type": "tidelift" } ], - "time": "2024-07-25T09:36:02+00:00" + "time": "2024-08-19T19:43:53+00:00" }, { "name": "composer/semver", From 3400cb62566e7a5cff4579dd2e525d8b6f14fd1a Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Tue, 15 Oct 2024 11:56:06 +0530 Subject: [PATCH 634/674] ACQE-7089 | MFTF Component Health - Feb Release --- composer.lock | 564 ++++++++++++++++++++++---------------------------- 1 file changed, 246 insertions(+), 318 deletions(-) diff --git a/composer.lock b/composer.lock index 2eacae312..d08c29531 100644 --- a/composer.lock +++ b/composer.lock @@ -268,16 +268,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.320.4", + "version": "3.324.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "e6af3e760864d43a30d8b7deb4f9dc6a49a5f66a" + "reference": "fea3d0ac8f96009cb87cf8166caba6558f26a0ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/e6af3e760864d43a30d8b7deb4f9dc6a49a5f66a", - "reference": "e6af3e760864d43a30d8b7deb4f9dc6a49a5f66a", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fea3d0ac8f96009cb87cf8166caba6558f26a0ab", + "reference": "fea3d0ac8f96009cb87cf8166caba6558f26a0ab", "shasum": "" }, "require": { @@ -360,9 +360,9 @@ "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.320.4" + "source": "https://github.com/aws/aws-sdk-php/tree/3.324.2" }, - "time": "2024-08-20T18:20:32+00:00" + "time": "2024-10-14T18:06:11+00:00" }, { "name": "behat/gherkin", @@ -918,16 +918,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a" + "reference": "48a792895a2b7a6ee65dd5442c299d7b835b6137" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/063d9aa8696582f5a41dffbbaf3c81024f0a604a", - "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/48a792895a2b7a6ee65dd5442c299d7b835b6137", + "reference": "48a792895a2b7a6ee65dd5442c299d7b835b6137", "shasum": "" }, "require": { @@ -937,8 +937,8 @@ }, "require-dev": { "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/phpunit-bridge": "^4.2 || ^5", "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", @@ -974,7 +974,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.1" + "source": "https://github.com/composer/ca-bundle/tree/1.5.2" }, "funding": [ { @@ -990,20 +990,20 @@ "type": "tidelift" } ], - "time": "2024-07-08T15:28:20+00:00" + "time": "2024-09-25T07:49:53+00:00" }, { "name": "composer/class-map-generator", - "version": "1.3.4", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3" + "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", - "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/98bbf6780e56e0fd2404fe4b82eb665a0f93b783", + "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783", "shasum": "" }, "require": { @@ -1016,8 +1016,8 @@ "phpstan/phpstan-deprecation-rules": "^1", "phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6" }, "type": "library", "extra": { @@ -1047,7 +1047,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.3.4" + "source": "https://github.com/composer/class-map-generator/tree/1.4.0" }, "funding": [ { @@ -1063,52 +1063,52 @@ "type": "tidelift" } ], - "time": "2024-06-12T14:13:04+00:00" + "time": "2024-10-03T18:14:00+00:00" }, { "name": "composer/composer", - "version": "2.7.7", + "version": "2.8.1", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "291942978f39435cf904d33739f98d7d4eca7b23" + "reference": "e52b8672276cf436670cdd6bd5de4353740e83b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/291942978f39435cf904d33739f98d7d4eca7b23", - "reference": "291942978f39435cf904d33739f98d7d4eca7b23", + "url": "https://api.github.com/repos/composer/composer/zipball/e52b8672276cf436670cdd6bd5de4353740e83b2", + "reference": "e52b8672276cf436670cdd6bd5de4353740e83b2", "shasum": "" }, "require": { - "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.3.3", + "composer/ca-bundle": "^1.5", + "composer/class-map-generator": "^1.4.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2.1 || ^3.1", + "composer/pcre": "^2.2 || ^3.2", "composer/semver": "^3.3", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", - "justinrainbow/json-schema": "^5.2.11", + "justinrainbow/json-schema": "^5.3", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8 || ^3", + "react/promise": "^3.2", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11 || ^7", - "symfony/filesystem": "^5.4 || ^6.0 || ^7", - "symfony/finder": "^5.4 || ^6.0 || ^7", + "symfony/console": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/filesystem": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/finder": "^5.4.35 || ^6.3.12 || ^7.0.3", "symfony/polyfill-php73": "^1.24", "symfony/polyfill-php80": "^1.24", "symfony/polyfill-php81": "^1.24", - "symfony/process": "^5.4 || ^6.0 || ^7" + "symfony/process": "^5.4.35 || ^6.3.12 || ^7.0.3" }, "require-dev": { - "phpstan/phpstan": "^1.11.0", + "phpstan/phpstan": "^1.11.8", "phpstan/phpstan-deprecation-rules": "^1.2.0", "phpstan/phpstan-phpunit": "^1.4.0", "phpstan/phpstan-strict-rules": "^1.6.0", "phpstan/phpstan-symfony": "^1.4.0", - "symfony/phpunit-bridge": "^6.4.1 || ^7.0.1" + "symfony/phpunit-bridge": "^6.4.3 || ^7.0.1" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -1121,7 +1121,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.7-dev" + "dev-main": "2.8-dev" }, "phpstan": { "includes": [ @@ -1161,7 +1161,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.7.7" + "source": "https://github.com/composer/composer/tree/2.8.1" }, "funding": [ { @@ -1177,7 +1177,7 @@ "type": "tidelift" } ], - "time": "2024-06-10T20:11:12+00:00" + "time": "2024-10-04T09:31:01+00:00" }, { "name": "composer/metadata-minifier", @@ -1250,16 +1250,16 @@ }, { "name": "composer/pcre", - "version": "3.3.0", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "1637e067347a0c40bbb1e3cd786b20dcab556a81" + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/1637e067347a0c40bbb1e3cd786b20dcab556a81", - "reference": "1637e067347a0c40bbb1e3cd786b20dcab556a81", + "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", "shasum": "" }, "require": { @@ -1309,7 +1309,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.0" + "source": "https://github.com/composer/pcre/tree/3.3.1" }, "funding": [ { @@ -1325,28 +1325,28 @@ "type": "tidelift" } ], - "time": "2024-08-19T19:43:53+00:00" + "time": "2024-08-27T18:44:43+00:00" }, { "name": "composer/semver", - "version": "3.4.2", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -1390,7 +1390,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.2" + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { @@ -1406,7 +1406,7 @@ "type": "tidelift" } ], - "time": "2024-07-12T11:35:52+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { "name": "composer/spdx-licenses", @@ -1619,16 +1619,16 @@ }, { "name": "doctrine/annotations", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7", + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7", "shasum": "" }, "require": { @@ -1640,10 +1640,10 @@ "require-dev": { "doctrine/cache": "^2.0", "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.8.0", + "phpstan/phpstan": "^1.10.28", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^5.4 || ^6", - "vimeo/psalm": "^4.10" + "symfony/cache": "^5.4 || ^6.4 || ^7", + "vimeo/psalm": "^4.30 || ^5.14" }, "suggest": { "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" @@ -1689,9 +1689,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/2.0.1" + "source": "https://github.com/doctrine/annotations/tree/2.0.2" }, - "time": "2023-02-02T22:02:53+00:00" + "time": "2024-09-05T10:17:24+00:00" }, { "name": "doctrine/lexer", @@ -2162,25 +2162,28 @@ }, { "name": "laminas/laminas-diactoros", - "version": "3.3.1", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "74cfb9a7522ffd2a161d1ebe10db2fc2abb9df45" + "reference": "143a16306602ce56b8b092a7914fef03c37f9ed2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/74cfb9a7522ffd2a161d1ebe10db2fc2abb9df45", - "reference": "74cfb9a7522ffd2a161d1ebe10db2fc2abb9df45", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/143a16306602ce56b8b092a7914fef03c37f9ed2", + "reference": "143a16306602ce56b8b092a7914fef03c37f9ed2", "shasum": "" }, "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", - "psr/http-factory": "^1.0.2", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/http-factory": "^1.1", "psr/http-message": "^1.1 || ^2.0" }, + "conflict": { + "amphp/amp": "<2.6.4" + }, "provide": { - "psr/http-factory-implementation": "^1.1 || ^2.0", + "psr/http-factory-implementation": "^1.0", "psr/http-message-implementation": "^1.1 || ^2.0" }, "require-dev": { @@ -2188,12 +2191,12 @@ "ext-dom": "*", "ext-gd": "*", "ext-libxml": "*", - "http-interop/http-factory-tests": "^0.9.0", + "http-interop/http-factory-tests": "^2.2.0", "laminas/laminas-coding-standard": "~2.5.0", - "php-http/psr7-integration-tests": "^1.3", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.22.1" + "php-http/psr7-integration-tests": "^1.4.0", + "phpunit/phpunit": "^10.5.36", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.26.1" }, "type": "library", "extra": { @@ -2243,7 +2246,7 @@ "type": "community_bridge" } ], - "time": "2024-02-16T16:06:16+00:00" + "time": "2024-10-14T11:59:49+00:00" }, { "name": "monolog/monolog", @@ -2348,16 +2351,16 @@ }, { "name": "mtdowling/jmespath.php", - "version": "2.7.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b" + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b", - "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", "shasum": "" }, "require": { @@ -2374,7 +2377,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "2.8-dev" } }, "autoload": { @@ -2408,9 +2411,9 @@ ], "support": { "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0" + "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" }, - "time": "2023-08-25T10:54:48+00:00" + "time": "2024-09-04T18:46:31+00:00" }, { "name": "mustache/mustache", @@ -2524,16 +2527,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.1.0", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", "shasum": "" }, "require": { @@ -2576,9 +2579,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" }, - "time": "2024-07-01T20:03:41+00:00" + "time": "2024-10-08T18:51:32+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -2833,32 +2836,32 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.15", + "version": "10.1.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-text-template": "^3.0", - "sebastian/code-unit-reverse-lookup": "^3.0", - "sebastian/complexity": "^3.0", - "sebastian/environment": "^6.0", - "sebastian/lines-of-code": "^2.0", - "sebastian/version": "^4.0", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { "phpunit/phpunit": "^10.1" @@ -2870,7 +2873,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "10.1.x-dev" } }, "autoload": { @@ -2899,7 +2902,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" }, "funding": [ { @@ -2907,7 +2910,7 @@ "type": "github" } ], - "time": "2024-06-29T08:25:15+00:00" + "time": "2024-08-22T04:31:57+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3154,16 +3157,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.30", + "version": "10.5.36", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "b15524febac0153876b4ba9aab3326c2ee94c897" + "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b15524febac0153876b4ba9aab3326c2ee94c897", - "reference": "b15524febac0153876b4ba9aab3326c2ee94c897", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", + "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", "shasum": "" }, "require": { @@ -3177,7 +3180,7 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.15", + "phpunit/php-code-coverage": "^10.1.16", "phpunit/php-file-iterator": "^4.1.0", "phpunit/php-invoker": "^4.0.0", "phpunit/php-text-template": "^3.0.1", @@ -3235,7 +3238,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.30" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.36" }, "funding": [ { @@ -3251,7 +3254,7 @@ "type": "tidelift" } ], - "time": "2024-08-13T06:09:37+00:00" + "time": "2024-10-08T15:36:51+00:00" }, { "name": "psr/cache", @@ -5288,16 +5291,16 @@ }, { "name": "symfony/console", - "version": "v6.4.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc" + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/504974cbe43d05f83b201d6498c206f16fc0cdbc", - "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc", + "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", "shasum": "" }, "require": { @@ -5362,7 +5365,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.10" + "source": "https://github.com/symfony/console/tree/v6.4.12" }, "funding": [ { @@ -5378,7 +5381,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/css-selector", @@ -5447,16 +5450,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v6.4.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb" + "reference": "cfb9d34a1cdd4911bc737a5358fd1cf8ebfb536e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5caf9c5f6085f13b27d70a236b776c07e4a1c3eb", - "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/cfb9d34a1cdd4911bc737a5358fd1cf8ebfb536e", + "reference": "cfb9d34a1cdd4911bc737a5358fd1cf8ebfb536e", "shasum": "" }, "require": { @@ -5508,7 +5511,7 @@ "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/v6.4.10" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.12" }, "funding": [ { @@ -5524,7 +5527,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T07:32:07+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5595,16 +5598,16 @@ }, { "name": "symfony/dotenv", - "version": "v6.4.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "2ae0c84cc9be0dc1eeb86016970b63c764d8472e" + "reference": "815284236cab7d8e1280f53bf562c07a4dfe5954" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/2ae0c84cc9be0dc1eeb86016970b63c764d8472e", - "reference": "2ae0c84cc9be0dc1eeb86016970b63c764d8472e", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/815284236cab7d8e1280f53bf562c07a4dfe5954", + "reference": "815284236cab7d8e1280f53bf562c07a4dfe5954", "shasum": "" }, "require": { @@ -5649,7 +5652,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.10" + "source": "https://github.com/symfony/dotenv/tree/v6.4.12" }, "funding": [ { @@ -5665,7 +5668,7 @@ "type": "tidelift" } ], - "time": "2024-07-09T18:29:35+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/event-dispatcher", @@ -5825,16 +5828,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.9", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/f810e3cbdf7fdc35983968523d09f349fa9ada12", + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12", "shasum": "" }, "require": { @@ -5871,7 +5874,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.9" + "source": "https://github.com/symfony/filesystem/tree/v6.4.12" }, "funding": [ { @@ -5887,20 +5890,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/finder", - "version": "v6.4.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "af29198d87112bebdd397bd7735fbd115997824c" + "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/af29198d87112bebdd397bd7735fbd115997824c", - "reference": "af29198d87112bebdd397bd7735fbd115997824c", + "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453", + "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453", "shasum": "" }, "require": { @@ -5935,7 +5938,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.10" + "source": "https://github.com/symfony/finder/tree/v6.4.11" }, "funding": [ { @@ -5951,20 +5954,20 @@ "type": "tidelift" } ], - "time": "2024-07-24T07:06:38+00:00" + "time": "2024-08-13T14:27:37+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b" + "reference": "133ac043875f59c26c55e79cf074562127cce4d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/117f1f20a7ade7bcea28b861fb79160a21a1e37b", - "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/133ac043875f59c26c55e79cf074562127cce4d2", + "reference": "133ac043875f59c26c55e79cf074562127cce4d2", "shasum": "" }, "require": { @@ -6012,7 +6015,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.10" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.12" }, "funding": [ { @@ -6028,20 +6031,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:36:27+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/mime", - "version": "v6.4.9", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7d048964877324debdcb4e0549becfa064a20d43" + "reference": "abe16ee7790b16aa525877419deb0f113953f0e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7d048964877324debdcb4e0549becfa064a20d43", - "reference": "7d048964877324debdcb4e0549becfa064a20d43", + "url": "https://api.github.com/repos/symfony/mime/zipball/abe16ee7790b16aa525877419deb0f113953f0e1", + "reference": "abe16ee7790b16aa525877419deb0f113953f0e1", "shasum": "" }, "require": { @@ -6097,7 +6100,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.9" + "source": "https://github.com/symfony/mime/tree/v6.4.12" }, "funding": [ { @@ -6113,24 +6116,24 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-09-20T08:18:25+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -6176,7 +6179,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -6192,24 +6195,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -6254,7 +6257,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -6270,26 +6273,25 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -6338,7 +6340,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -6354,24 +6356,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -6419,7 +6421,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -6435,24 +6437,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -6499,7 +6501,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -6515,97 +6517,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.30.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "10112722600777e02d2745716b70c5db4ca70442" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", - "reference": "10112722600777e02d2745716b70c5db4ca70442", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "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 backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.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": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1" + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1", - "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -6648,7 +6577,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" }, "funding": [ { @@ -6664,24 +6593,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -6728,7 +6657,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -6744,24 +6673,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -6804,7 +6733,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" }, "funding": [ { @@ -6820,24 +6749,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", - "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -6880,7 +6809,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { @@ -6896,20 +6825,20 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:35:24+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", "shasum": "" }, "require": { @@ -6941,7 +6870,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.8" + "source": "https://github.com/symfony/process/tree/v6.4.12" }, "funding": [ { @@ -6957,7 +6886,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-17T12:47:12+00:00" }, { "name": "symfony/service-contracts", @@ -7106,16 +7035,16 @@ }, { "name": "symfony/string", - "version": "v6.4.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ccf9b30251719567bfd46494138327522b9a9446" + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ccf9b30251719567bfd46494138327522b9a9446", - "reference": "ccf9b30251719567bfd46494138327522b9a9446", + "url": "https://api.github.com/repos/symfony/string/zipball/f8a1ccebd0997e16112dfecfd74220b78e5b284b", + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b", "shasum": "" }, "require": { @@ -7172,7 +7101,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.10" + "source": "https://github.com/symfony/string/tree/v6.4.12" }, "funding": [ { @@ -7188,7 +7117,7 @@ "type": "tidelift" } ], - "time": "2024-07-22T10:21:14+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/var-dumper", @@ -7354,28 +7283,27 @@ }, { "name": "symfony/yaml", - "version": "v6.4.8", + "version": "v7.1.5", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9" + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -7406,7 +7334,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.8" + "source": "https://github.com/symfony/yaml/tree/v7.1.5" }, "funding": [ { @@ -7422,7 +7350,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-17T12:49:58+00:00" }, { "name": "theseer/tokenizer", @@ -7821,16 +7749,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.10.2", + "version": "3.10.3", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017" + "reference": "62d32998e820bddc40f99f8251958aed187a5c9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/86e5f5dd9a840c46810ebe5ff1885581c42a3017", - "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/62d32998e820bddc40f99f8251958aed187a5c9c", + "reference": "62d32998e820bddc40f99f8251958aed187a5c9c", "shasum": "" }, "require": { @@ -7897,7 +7825,7 @@ "type": "open_collective" } ], - "time": "2024-07-21T23:26:44+00:00" + "time": "2024-09-18T10:38:58+00:00" } ], "aliases": [], From e407d4f612ad441da9c9f0a0c6bd131ec2d04170 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Tue, 15 Oct 2024 11:59:22 +0530 Subject: [PATCH 635/674] ACQE-7089 | MFTF Component Health - Feb Release --- composer.lock | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/composer.lock b/composer.lock index d08c29531..399a96bb1 100644 --- a/composer.lock +++ b/composer.lock @@ -7283,27 +7283,28 @@ }, { "name": "symfony/yaml", - "version": "v7.1.5", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" + "reference": "52903de178d542850f6f341ba92995d3d63e60c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", + "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", + "reference": "52903de178d542850f6f341ba92995d3d63e60c9", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0" + "symfony/console": "^5.4|^6.0|^7.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -7334,7 +7335,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.5" + "source": "https://github.com/symfony/yaml/tree/v6.4.8" }, "funding": [ { @@ -7350,7 +7351,7 @@ "type": "tidelift" } ], - "time": "2024-09-17T12:49:58+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "theseer/tokenizer", From ef682d8293a196e1f7b408108cd1e19fcace9dc4 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Tue, 29 Oct 2024 11:55:44 +0530 Subject: [PATCH 636/674] ACQE-7127 | Added support for php 8.4 --- .github/workflows/main.yml | 8 ++++---- composer.lock | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index da5f161cb..80bbaa3f6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.1', '8.2', '8.3'] + php-versions: ['8.1', '8.2', '8.3', '8.4'] steps: - uses: actions/checkout@v2 @@ -54,7 +54,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.1', '8.2', '8.3'] + php-versions: ['8.1', '8.2', '8.3', '8.4'] steps: - uses: actions/checkout@v2 @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.1', '8.2', '8.3'] + php-versions: ['8.1', '8.2', '8.3', '8.4'] steps: - uses: actions/checkout@v2 @@ -118,7 +118,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.1', '8.2', '8.3'] + php-versions: ['8.1', '8.2', '8.3', '8.4'] services: chrome: diff --git a/composer.lock b/composer.lock index 399a96bb1..b7bc3cf71 100644 --- a/composer.lock +++ b/composer.lock @@ -159,7 +159,7 @@ }, "require": { "allure-framework/allure-php-commons": "^2", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", "phpunit/phpunit": "^10" }, "conflict": { From ba3bfb0ae511eb781e0ec9a76d5c6a51bf4c44e6 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Tue, 29 Oct 2024 12:06:03 +0530 Subject: [PATCH 637/674] ACQE-7127 | Added support for php 8.4 --- .../Test/Util/ObjectExtensionUtilTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php index cfad47c97..466edc322 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php @@ -402,7 +402,7 @@ public function testExtendedTestSkippedParent(): void * @return void * @throws Exception */ - private function setMockTestOutput(array $testData = null, array $actionGroupData = null): void + private function setMockTestOutput(?array $testData = null, ?array $actionGroupData = null): void { // clear test object handler value to inject parsed content $property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler'); From 2d6a6e4f8e5c53345d6bc70afa5bfdfe96eb72f7 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Tue, 29 Oct 2024 13:06:17 +0530 Subject: [PATCH 638/674] ACQE-7119 | MFTF Framework - MFTF 4.8.3 Release --- CHANGELOG.md | 10 + composer.json | 2 +- composer.lock | 2 +- .../Allure/Adapter/MagentoAllureAdapter.php | 452 ------------------ 4 files changed, 12 insertions(+), 454 deletions(-) delete mode 100644 src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 999dbd50f..59944cb68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ Magento Functional Testing Framework Changelog ================================================ +4.8.3 +--------- +### Enhancements +* Bumped aws/aws-sdk-php package to 3.323.4 +* Bumped composer/composer to 2.8.1 +* Bumped laminas/laminas-diactoros to 3.4.1 +* Bumped nikic/php-parser to 5.3.1 +* Bumped squizlabs/php_codesniffer to 3.10.3 +* Remove any unused files remaining after upgrading Codeception. + 4.8.2 --------- ### Enhancements diff --git a/composer.json b/composer.json index 827a9cc57..ba800b270 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": "4.8.2", + "version": "4.8.3", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 5b55297a5..e93215e56 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": "a595a3e12845c71e60dacc16ee246fc0", + "content-hash": "b6e2c33b79c4eecb9ccbecc3d36296d3", "packages": [ { "name": "allure-framework/allure-codeception", diff --git a/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php b/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php deleted file mode 100644 index 485a86fe1..000000000 --- a/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php +++ /dev/null @@ -1,452 +0,0 @@ -<?php -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -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; -use Yandex\Allure\Adapter\Event\StepFailedEvent; -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 - * - * Extends AllureAdapter to provide further information for allure reports - * - * @package Magento\FunctionalTestingFramework\Allure - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - */ - -class MagentoAllureAdapter extends AllureCodeception -{ - const STEP_PASSED = "passed"; - - /** - * @var array - */ - private $options = []; - - /** - * Test files cache. - * - * @var array - */ - private $testFiles = []; - - /** - * Boolean value to indicate if steps are invisible steps - * - * @var boolean - */ - private $atInvisibleSteps = false; - - /** - * Array of group values passed to test runner command - * - * @return string - */ - private function getGroup() - { - if ($this->options['groups'] !== null) { - return $this->options['groups'][0]; - } - return null; - } - - /** - * Override of parent method to set suitename as suitename and group name concatenated - * - * @param SuiteEvent $suiteEvent - * @return void - */ - public function suiteBefore(SuiteEvent $suiteEvent) - { - $changeSuiteEvent = $suiteEvent; - - if ($this->getGroup() !== null) { - $suite = $suiteEvent->getSuite(); - $suiteName = ($suite->getName()) . "\\" . $this->sanitizeGroupName($this->getGroup()); - - call_user_func(\Closure::bind( - function () use ($suite, $suiteName) { - $suite->name = $suiteName; - }, - null, - $suite - )); - - //change suiteEvent - $changeSuiteEvent = new SuiteEvent( - $suiteEvent->getSuite(), - $suiteEvent->getResult(), - $suiteEvent->getSettings() - ); - } - // call parent function - parent::suiteBefore($changeSuiteEvent); - } - - /** - * Function which santizes any group names changed by the framework for execution in order to consolidate reporting. - * - * @param string $group - * @return string - */ - private function sanitizeGroupName($group) - { - $suiteNames = array_keys(SuiteObjectHandler::getInstance()->getAllObjects()); - $exactMatch = in_array($group, $suiteNames); - - // if this is an existing suite name we dont' need to worry about changing it - if ($exactMatch || strpos($group, "_") === false) { - return $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 - $originalName = in_array($originalName, $suiteNames) ? $originalName : $group; - return $originalName; - } - - /** - * Override of parent method: - * prevent replacing of . to • - * strips control characters - * inserts stepKey into step name - * - * @param StepEvent $stepEvent - * @return void - * @throws \Yandex\Allure\Adapter\AllureException - */ - public function stepBefore(StepEvent $stepEvent) - { - $stepAction = $stepEvent->getStep()->getAction(); - - // Set atInvisibleSteps flag and return if step is in INVISIBLE_STEP_ACTIONS - if (in_array($stepAction, ActionObject::INVISIBLE_STEP_ACTIONS)) { - $this->atInvisibleSteps = true; - return; - } - - // Set back atInvisibleSteps flag - if ($this->atInvisibleSteps && !in_array($stepAction, ActionObject::INVISIBLE_STEP_ACTIONS)) { - $this->atInvisibleSteps = false; - } - - //Hard set to 200; we don't expose this config in MFTF - $argumentsLength = 200; - $stepKey = null; - - if (!($stepEvent->getStep() instanceof Comment)) { - $stepKey = $this->retrieveStepKey($stepEvent->getStep()->getLine()); - } - - // DO NOT alter action if actionGroup is starting, need the exact actionGroup name for good logging - if (strpos($stepAction, ActionGroupObject::ACTION_GROUP_CONTEXT_START) === false - && !($stepEvent->getStep() instanceof Comment) - ) { - $stepAction = $stepEvent->getStep()->getHumanizedActionWithoutArguments(); - } - $stepArgs = $stepEvent->getStep()->getArgumentsAsString($argumentsLength); - - if (!trim($stepAction)) { - $stepAction = $stepEvent->getStep()->getMetaStep()->getHumanizedActionWithoutArguments(); - $stepArgs = $stepEvent->getStep()->getMetaStep()->getArgumentsAsString($argumentsLength); - } - - $stepName = ''; - if ($stepKey !== null) { - $stepName .= '[' . $stepKey . '] '; - } - $stepName .= $stepAction . ' ' . $stepArgs; - - // Strip control characters so that report generation does not fail - $stepName = preg_replace('/[[:cntrl:]]/', '', $stepName); - - $this->getLifecycle()->fire(new StepStartedEvent($stepName)); - } - - /** - * Override of parent method, fires StepFailedEvent if step has failed (for xml output) - * @param StepEvent $stepEvent - * @throws \Yandex\Allure\Adapter\AllureException - * @return void - */ - public function stepAfter(StepEvent $stepEvent = null) - { - // Simply return if step is INVISIBLE_STEP_ACTIONS - if ($this->atInvisibleSteps) { - if ($stepEvent->getStep()->hasFailed()) { - $this->atInvisibleSteps = false; - } - return; - } - - if ($stepEvent->getStep()->hasFailed()) { - $this->getLifecycle()->fire(new StepFailedEvent()); - } - - $this->getLifecycle()->fire(new StepFinishedEvent()); - } - - /** - * Override of parent method, fires a TestCaseFailedEvent if a test is marked as incomplete. - * - * @param FailEvent $failEvent - * @return void - */ - public function testIncomplete(FailEvent $failEvent) - { - $event = new TestCaseFailedEvent(); - $e = $failEvent->getFail(); - $message = $e->getMessage(); - $this->getLifecycle()->fire($event->withException($e)->withMessage($message)); - } - - /** - * Override of parent method. Adds in steps for hard PHP Errors if they arrise. - * - * @param FailEvent $failEvent - * @return void - */ - public function testError(FailEvent $failEvent) - { - $event = new TestCaseBrokenEvent(); - $e = $failEvent->getFail(); - $message = $e->getMessage(); - - // Create new step with an error for Allure - $failStep = new Step(); - $failStep->setName("ERROR"); - $failStep->setTitle($message); - $failStep->setStatus(Status::BROKEN); - - // Retrieve Allure Steps and add in the new BROKEN step - $rootStep = $this->getLifecycle()->getStepStorage()->pollLast(); - $rootStep->addStep($failStep); - $this->getLifecycle()->getStepStorage()->put($rootStep); - - $this->getLifecycle()->fire($event->withException($e)->withMessage($message)); - } - - /** - * 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(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 = []; - $actionGroupStepContainer = null; - - $actionGroupStepKey = null; - foreach ($rootStep->getSteps() as $step) { - $this->removeAttachments($step, $testFailed); - $stepKey = str_replace($actionGroupStepKey, '', $step->getName()); - if ($stepKey !== '[]' && $stepKey !== null) { - $step->setName($stepKey); - } - // if actionGroup flag, start nesting - if (strpos($step->getName(), ActionGroupObject::ACTION_GROUP_CONTEXT_START) !== false) { - if ($actionGroupStepContainer !== null) { - //actionGroup still being nested, need to close out and finish it. - $formattedSteps[] = $actionGroupStepContainer; - $actionGroupStepContainer = null; - $actionGroupStepKey = null; - } - - $step->setName(str_replace(ActionGroupObject::ACTION_GROUP_CONTEXT_START, '', $step->getName())); - $actionGroupStepContainer = $step; - $actionGroupStepKey = $this->retrieveActionGroupStepKey($step); - continue; - } - - // if actionGroup ended, add stack to steps - if (stripos($step->getName(), ActionGroupObject::ACTION_GROUP_CONTEXT_END) !== false) { - $formattedSteps[] = $actionGroupStepContainer; - $actionGroupStepContainer = null; - $actionGroupStepKey = null; - continue; - } - - if ($actionGroupStepContainer !== null) { - $actionGroupStepContainer->addStep($step); - if ($step->getStatus() !== self::STEP_PASSED) { - // If step didn't pass, need to end action group nesting and set overall step status - $actionGroupStepContainer->setStatus($step->getStatus()); - $formattedSteps[] = $actionGroupStepContainer; - $actionGroupStepContainer = null; - } - } else { - // Add step as normal - $formattedSteps[] = $step; - } - } - - // No public function for setting the step's steps - call_user_func(\Closure::bind( - function () use ($rootStep, $formattedSteps) { - $rootStep->steps = $formattedSteps; - }, - null, - $rootStep - )); - - $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. - * - * @param Step $step - * @return string|null - */ - private function retrieveActionGroupStepKey($step) - { - $actionGroupStepKey = null; - - preg_match(TestGenerator::ACTION_GROUP_STEP_KEY_REGEX, $step->getName(), $matches); - - if (!empty($matches['actionGroupStepKey'])) { - $actionGroupStepKey = ucfirst($matches['actionGroupStepKey']); - } - - return $actionGroupStepKey; - } - - /** - * Reading stepKey from file. - * - * @param string $stepLine - * @return string|null - */ - private function retrieveStepKey($stepLine) - { - $stepKey = null; - list($filePath, $stepLine) = explode(":", $stepLine); - $stepLine = $stepLine - 1; - - if (!array_key_exists($filePath, $this->testFiles)) { - $this->testFiles[$filePath] = explode(PHP_EOL, file_get_contents($filePath)); - } - - preg_match(TestGenerator::ACTION_STEP_KEY_REGEX, $this->testFiles[$filePath][$stepLine], $matches); - if (!empty($matches['stepKey'])) { - $stepKey = $matches['stepKey']; - } - - 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 $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; - } -} From 88e6014d8e879908b17063b3589c9bfa69b1aa8c Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Tue, 29 Oct 2024 12:39:01 +0530 Subject: [PATCH 639/674] ACQE-7127 | Added support for php 8.4 --- .github/workflows/main.yml | 8 +- composer.json | 3 +- composer.lock | 380 +++++++----------- .../Commenting/FunctionCommentSniff.php | 4 +- .../Objects/EntityDataObjectTest.php | 4 +- .../unit/Util/ActionGroupArrayBuilder.php | 2 +- dev/tests/unit/Util/SuiteDataArrayBuilder.php | 4 +- dev/tests/unit/Util/TestDataArrayBuilder.php | 14 +- .../Config/Data.php | 4 +- .../Config/DataInterface.php | 4 +- .../Config/Reader/Filesystem.php | 4 +- .../Config/ReaderInterface.php | 2 +- .../Persist/DataPersistenceHandler.php | 4 +- .../Persist/OperationDataArrayResolver.php | 2 +- .../DataTransport/AdminFormExecutor.php | 2 +- .../DataTransport/Auth/Tfa/OTP.php | 2 +- .../DataTransport/Auth/WebApiAuth.php | 2 +- .../DataTransport/FrontendFormExecutor.php | 2 +- .../DataTransport/Protocol/CurlInterface.php | 2 +- .../DataTransport/Protocol/CurlTransport.php | 2 +- .../DataTransport/WebApiExecutor.php | 4 +- .../Util/TestGenerator.php | 8 +- 22 files changed, 196 insertions(+), 267 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 80bbaa3f6..ce667e709 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.1', '8.2', '8.3', '8.4'] + php-versions: ['8.3', '8.4'] steps: - uses: actions/checkout@v2 @@ -54,7 +54,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.1', '8.2', '8.3', '8.4'] + php-versions: ['8.3', '8.4'] steps: - uses: actions/checkout@v2 @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.1', '8.2', '8.3', '8.4'] + php-versions: ['8.3', '8.4'] steps: - uses: actions/checkout@v2 @@ -118,7 +118,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.1', '8.2', '8.3', '8.4'] + php-versions: ['8.3', '8.4'] services: chrome: diff --git a/composer.json b/composer.json index 827a9cc57..0c37d1d25 100755 --- a/composer.json +++ b/composer.json @@ -10,7 +10,6 @@ }, "require": { "allure-framework/allure-codeception": "^2.1", - "allure-framework/allure-phpunit": "^3", "aws/aws-sdk-php": "^3.132", "codeception/codeception": "^5.0", "codeception/module-asserts": "^3.0", @@ -29,7 +28,7 @@ "monolog/monolog": "^2.3||^3.0", "mustache/mustache": "~2.5", "nikic/php-parser": "^4.4||^5.0", - "php": ">=8.1", + "php": ">8.2", "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0||^11.0", "symfony/config": "^6.4", diff --git a/composer.lock b/composer.lock index db25e20ba..381ff0862 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": "a595a3e12845c71e60dacc16ee246fc0", + "content-hash": "f82575a7f1049c14a7ed97c3ddd58403", "packages": [ { "name": "allure-framework/allure-codeception", @@ -143,87 +143,18 @@ }, "time": "2023-05-30T10:55:43+00:00" }, - { - "name": "allure-framework/allure-phpunit", - "version": "v3.0.1", - "source": { - "type": "git", - "url": "https://github.com/allure-framework/allure-phpunit.git", - "reference": "1b800cdf612d4ec6e916e959a95604c91f0ba7e9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-phpunit/zipball/1b800cdf612d4ec6e916e959a95604c91f0ba7e9", - "reference": "1b800cdf612d4ec6e916e959a95604c91f0ba7e9", - "shasum": "" - }, - "require": { - "allure-framework/allure-php-commons": "^2", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", - "phpunit/phpunit": "^10" - }, - "conflict": { - "amphp/byte-stream": "<1.5.1", - "brianium/paratest": "<7.0.3" - }, - "require-dev": { - "brianium/paratest": "^7", - "psalm/plugin-phpunit": "^0.18.4", - "squizlabs/php_codesniffer": "^3.7.2", - "vimeo/psalm": "^5.15" - }, - "type": "library", - "autoload": { - "psr-4": { - "Qameta\\Allure\\PHPUnit\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Ivan Krutov", - "email": "vania-pooh@yandex-team.ru", - "role": "Developer" - }, - { - "name": "Edward Surov", - "email": "zoohie@gmail.com", - "role": "Developer" - } - ], - "description": "Allure PHPUnit integration", - "homepage": "http://allure.qatools.ru/", - "keywords": [ - "allure", - "attachments", - "cases", - "phpunit", - "report", - "steps", - "testing" - ], - "support": { - "email": "allure@qameta.io", - "issues": "https://github.com/allure-framework/allure-phpunit/issues", - "source": "https://github.com/allure-framework/allure-phpunit" - }, - "time": "2023-11-10T15:32:58+00:00" - }, { "name": "aws/aws-crt-php", - "version": "v1.2.6", + "version": "v1.2.7", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "a63485b65b6b3367039306496d49737cf1995408" + "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/a63485b65b6b3367039306496d49737cf1995408", - "reference": "a63485b65b6b3367039306496d49737cf1995408", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e", + "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e", "shasum": "" }, "require": { @@ -262,22 +193,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.6" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7" }, - "time": "2024-06-13T17:21:28+00:00" + "time": "2024-10-18T22:15:13+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.324.2", + "version": "3.325.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "fea3d0ac8f96009cb87cf8166caba6558f26a0ab" + "reference": "9e354a5e0cd1d563ec85245e3000e98e16a44fce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fea3d0ac8f96009cb87cf8166caba6558f26a0ab", - "reference": "fea3d0ac8f96009cb87cf8166caba6558f26a0ab", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9e354a5e0cd1d563ec85245e3000e98e16a44fce", + "reference": "9e354a5e0cd1d563ec85245e3000e98e16a44fce", "shasum": "" }, "require": { @@ -360,31 +291,31 @@ "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.324.2" + "source": "https://github.com/aws/aws-sdk-php/tree/3.325.2" }, - "time": "2024-10-14T18:06:11+00:00" + "time": "2024-11-01T18:08:38+00:00" }, { "name": "behat/gherkin", - "version": "v4.9.0", + "version": "v4.10.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4" + "reference": "cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/0bc8d1e30e96183e4f36db9dc79caead300beff4", - "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6", + "reference": "cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6", "shasum": "" }, "require": { "php": "~7.2|~8.0" }, "require-dev": { - "cucumber/cucumber": "dev-gherkin-22.0.0", + "cucumber/cucumber": "dev-gherkin-24.1.0", "phpunit/phpunit": "~8|~9", - "symfony/yaml": "~3|~4|~5" + "symfony/yaml": "~3|~4|~5|~6|~7" }, "suggest": { "symfony/yaml": "If you want to parse features, represented in YAML files" @@ -423,9 +354,9 @@ ], "support": { "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.9.0" + "source": "https://github.com/Behat/Gherkin/tree/v4.10.0" }, - "time": "2021-10-12T13:05:09+00:00" + "time": "2024-10-19T14:46:06+00:00" }, { "name": "brick/math", @@ -1067,16 +998,16 @@ }, { "name": "composer/composer", - "version": "2.8.1", + "version": "2.8.2", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "e52b8672276cf436670cdd6bd5de4353740e83b2" + "reference": "6e543d03187c882ea1c6ba43add2467754427803" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/e52b8672276cf436670cdd6bd5de4353740e83b2", - "reference": "e52b8672276cf436670cdd6bd5de4353740e83b2", + "url": "https://api.github.com/repos/composer/composer/zipball/6e543d03187c882ea1c6ba43add2467754427803", + "reference": "6e543d03187c882ea1c6ba43add2467754427803", "shasum": "" }, "require": { @@ -1161,7 +1092,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.8.1" + "source": "https://github.com/composer/composer/tree/2.8.2" }, "funding": [ { @@ -1177,7 +1108,7 @@ "type": "tidelift" } ], - "time": "2024-10-04T09:31:01+00:00" + "time": "2024-10-29T15:12:11+00:00" }, { "name": "composer/metadata-minifier", @@ -1898,16 +1829,16 @@ }, { "name": "guzzlehttp/promises", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", "shasum": "" }, "require": { @@ -1961,7 +1892,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.3" + "source": "https://github.com/guzzle/promises/tree/2.0.4" }, "funding": [ { @@ -1977,7 +1908,7 @@ "type": "tidelift" } ], - "time": "2024-07-18T10:29:17+00:00" + "time": "2024-10-17T10:06:22+00:00" }, { "name": "guzzlehttp/psr7", @@ -3157,16 +3088,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.36", + "version": "10.5.38", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870" + "reference": "a86773b9e887a67bc53efa9da9ad6e3f2498c132" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", - "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a86773b9e887a67bc53efa9da9ad6e3f2498c132", + "reference": "a86773b9e887a67bc53efa9da9ad6e3f2498c132", "shasum": "" }, "require": { @@ -3187,7 +3118,7 @@ "phpunit/php-timer": "^6.0.0", "sebastian/cli-parser": "^2.0.1", "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.2", + "sebastian/comparator": "^5.0.3", "sebastian/diff": "^5.1.1", "sebastian/environment": "^6.1.0", "sebastian/exporter": "^5.1.2", @@ -3238,7 +3169,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.36" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.38" }, "funding": [ { @@ -3254,7 +3185,7 @@ "type": "tidelift" } ], - "time": "2024-10-08T15:36:51+00:00" + "time": "2024-10-28T13:06:21+00:00" }, { "name": "psr/cache", @@ -4213,16 +4144,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.2", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53" + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", - "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", "shasum": "" }, "require": { @@ -4233,7 +4164,7 @@ "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.4" + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { @@ -4278,7 +4209,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.2" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" }, "funding": [ { @@ -4286,7 +4217,7 @@ "type": "github" } ], - "time": "2024-08-12T06:03:08+00:00" + "time": "2024-10-18T14:56:07+00:00" }, { "name": "sebastian/complexity", @@ -5216,16 +5147,16 @@ }, { "name": "symfony/config", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "12e7e52515ce37191b193cf3365903c4f3951e35" + "reference": "5ed4195a81d2352e0e4ce24e5f7e26fc794e7597" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/12e7e52515ce37191b193cf3365903c4f3951e35", - "reference": "12e7e52515ce37191b193cf3365903c4f3951e35", + "url": "https://api.github.com/repos/symfony/config/zipball/5ed4195a81d2352e0e4ce24e5f7e26fc794e7597", + "reference": "5ed4195a81d2352e0e4ce24e5f7e26fc794e7597", "shasum": "" }, "require": { @@ -5271,7 +5202,7 @@ "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/v6.4.8" + "source": "https://github.com/symfony/config/tree/v6.4.13" }, "funding": [ { @@ -5287,20 +5218,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/console", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" + "reference": "f793dd5a7d9ae9923e35d0503d08ba734cec1d79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", - "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", + "url": "https://api.github.com/repos/symfony/console/zipball/f793dd5a7d9ae9923e35d0503d08ba734cec1d79", + "reference": "f793dd5a7d9ae9923e35d0503d08ba734cec1d79", "shasum": "" }, "require": { @@ -5365,7 +5296,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.12" + "source": "https://github.com/symfony/console/tree/v6.4.13" }, "funding": [ { @@ -5381,20 +5312,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:15:52+00:00" + "time": "2024-10-09T08:40:40+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08" + "reference": "cb23e97813c5837a041b73a6d63a9ddff0778f5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/4b61b02fe15db48e3687ce1c45ea385d1780fe08", - "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/cb23e97813c5837a041b73a6d63a9ddff0778f5e", + "reference": "cb23e97813c5837a041b73a6d63a9ddff0778f5e", "shasum": "" }, "require": { @@ -5430,7 +5361,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.8" + "source": "https://github.com/symfony/css-selector/tree/v6.4.13" }, "funding": [ { @@ -5446,20 +5377,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "cfb9d34a1cdd4911bc737a5358fd1cf8ebfb536e" + "reference": "728ae8f4e190133ce99d6d5f0bc1e8c8bd7c7a96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/cfb9d34a1cdd4911bc737a5358fd1cf8ebfb536e", - "reference": "cfb9d34a1cdd4911bc737a5358fd1cf8ebfb536e", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/728ae8f4e190133ce99d6d5f0bc1e8c8bd7c7a96", + "reference": "728ae8f4e190133ce99d6d5f0bc1e8c8bd7c7a96", "shasum": "" }, "require": { @@ -5511,7 +5442,7 @@ "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/v6.4.12" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.13" }, "funding": [ { @@ -5527,7 +5458,7 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:18:25+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5598,16 +5529,16 @@ }, { "name": "symfony/dotenv", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "815284236cab7d8e1280f53bf562c07a4dfe5954" + "reference": "436ae2dd89360fea8c7d5ff3f48ecf523c80bfb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/815284236cab7d8e1280f53bf562c07a4dfe5954", - "reference": "815284236cab7d8e1280f53bf562c07a4dfe5954", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/436ae2dd89360fea8c7d5ff3f48ecf523c80bfb4", + "reference": "436ae2dd89360fea8c7d5ff3f48ecf523c80bfb4", "shasum": "" }, "require": { @@ -5652,7 +5583,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.12" + "source": "https://github.com/symfony/dotenv/tree/v6.4.13" }, "funding": [ { @@ -5668,20 +5599,20 @@ "type": "tidelift" } ], - "time": "2024-09-16T16:01:33+00:00" + "time": "2024-09-28T07:43:51+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b" + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b", - "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", "shasum": "" }, "require": { @@ -5732,7 +5663,7 @@ "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/v6.4.8" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.13" }, "funding": [ { @@ -5748,7 +5679,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5828,16 +5759,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12" + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/f810e3cbdf7fdc35983968523d09f349fa9ada12", - "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/4856c9cf585d5a0313d8d35afd681a526f038dd3", + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3", "shasum": "" }, "require": { @@ -5874,7 +5805,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.12" + "source": "https://github.com/symfony/filesystem/tree/v6.4.13" }, "funding": [ { @@ -5890,20 +5821,20 @@ "type": "tidelift" } ], - "time": "2024-09-16T16:01:33+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/finder", - "version": "v6.4.11", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453" + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453", - "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453", + "url": "https://api.github.com/repos/symfony/finder/zipball/daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958", "shasum": "" }, "require": { @@ -5938,7 +5869,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.11" + "source": "https://github.com/symfony/finder/tree/v6.4.13" }, "funding": [ { @@ -5954,20 +5885,20 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:27:37+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "133ac043875f59c26c55e79cf074562127cce4d2" + "reference": "4c0341b3e0a7291e752c69d2a1ed9a84b68d604c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/133ac043875f59c26c55e79cf074562127cce4d2", - "reference": "133ac043875f59c26c55e79cf074562127cce4d2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4c0341b3e0a7291e752c69d2a1ed9a84b68d604c", + "reference": "4c0341b3e0a7291e752c69d2a1ed9a84b68d604c", "shasum": "" }, "require": { @@ -6015,7 +5946,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.12" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.13" }, "funding": [ { @@ -6031,20 +5962,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:18:25+00:00" + "time": "2024-10-11T19:20:58+00:00" }, { "name": "symfony/mime", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "abe16ee7790b16aa525877419deb0f113953f0e1" + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/abe16ee7790b16aa525877419deb0f113953f0e1", - "reference": "abe16ee7790b16aa525877419deb0f113953f0e1", + "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855", "shasum": "" }, "require": { @@ -6100,7 +6031,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.12" + "source": "https://github.com/symfony/mime/tree/v6.4.13" }, "funding": [ { @@ -6116,7 +6047,7 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:18:25+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6829,16 +6760,16 @@ }, { "name": "symfony/process", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" + "reference": "1f9f59b46880201629df3bd950fc5ae8c55b960f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", - "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "url": "https://api.github.com/repos/symfony/process/zipball/1f9f59b46880201629df3bd950fc5ae8c55b960f", + "reference": "1f9f59b46880201629df3bd950fc5ae8c55b960f", "shasum": "" }, "require": { @@ -6870,7 +6801,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.12" + "source": "https://github.com/symfony/process/tree/v6.4.13" }, "funding": [ { @@ -6886,7 +6817,7 @@ "type": "tidelift" } ], - "time": "2024-09-17T12:47:12+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/service-contracts", @@ -6973,16 +6904,16 @@ }, { "name": "symfony/stopwatch", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "63e069eb616049632cde9674c46957819454b8aa" + "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/63e069eb616049632cde9674c46957819454b8aa", - "reference": "63e069eb616049632cde9674c46957819454b8aa", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2cae0a6f8d04937d02f6d19806251e2104d54f92", + "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92", "shasum": "" }, "require": { @@ -7015,7 +6946,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.8" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.13" }, "funding": [ { @@ -7031,20 +6962,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/string", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b" + "reference": "38371c60c71c72b3d64d8d76f6b1bb81a2cc3627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f8a1ccebd0997e16112dfecfd74220b78e5b284b", - "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b", + "url": "https://api.github.com/repos/symfony/string/zipball/38371c60c71c72b3d64d8d76f6b1bb81a2cc3627", + "reference": "38371c60c71c72b3d64d8d76f6b1bb81a2cc3627", "shasum": "" }, "require": { @@ -7101,7 +7032,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.12" + "source": "https://github.com/symfony/string/tree/v6.4.13" }, "funding": [ { @@ -7117,38 +7048,36 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:15:52+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.10", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4" + "reference": "cb5bd55a6b8c2c1c7fb68b0aeae0e257948a720c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a71cc3374f5fb9759da1961d28c452373b343dd4", - "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cb5bd55a6b8c2c1c7fb68b0aeae0e257948a720c", + "reference": "cb5bd55a6b8c2c1c7fb68b0aeae0e257948a720c", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.0.4" }, "bin": [ "Resources/bin/var-dump-server" @@ -7186,7 +7115,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.10" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.6" }, "funding": [ { @@ -7202,20 +7131,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "f9a060622e0d93777b7f8687ec4860191e16802e" + "reference": "0f605f72a363f8743001038a176eeb2a11223b51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9a060622e0d93777b7f8687ec4860191e16802e", - "reference": "f9a060622e0d93777b7f8687ec4860191e16802e", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f605f72a363f8743001038a176eeb2a11223b51", + "reference": "0f605f72a363f8743001038a176eeb2a11223b51", "shasum": "" }, "require": { @@ -7263,7 +7192,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.9" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.13" }, "funding": [ { @@ -7279,32 +7208,31 @@ "type": "tidelift" } ], - "time": "2024-06-24T15:53:56+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.8", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9" + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -7335,7 +7263,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.8" + "source": "https://github.com/symfony/yaml/tree/v7.1.6" }, "funding": [ { @@ -7351,7 +7279,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "theseer/tokenizer", @@ -7841,7 +7769,7 @@ "ext-intl": "*", "ext-json": "*", "ext-openssl": "*", - "php": ">=8.1" + "php": ">8.2" }, "platform-dev": [], "plugin-api-version": "2.6.0" diff --git a/dev/tests/static/Magento/Sniffs/Commenting/FunctionCommentSniff.php b/dev/tests/static/Magento/Sniffs/Commenting/FunctionCommentSniff.php index 8985f2407..09b330ccf 100644 --- a/dev/tests/static/Magento/Sniffs/Commenting/FunctionCommentSniff.php +++ b/dev/tests/static/Magento/Sniffs/Commenting/FunctionCommentSniff.php @@ -422,7 +422,9 @@ protected function processParams(File $phpcsFile, $stackPtr, $commentStart) $typeHint, $param['var'], ); - $phpcsFile->addError($error, $stackPtr, 'IncorrectTypeHint', $data); + if(ltrim($typeHint, '?') !== $suggestedTypeHint) { + $phpcsFile->addError($error, $stackPtr, 'IncorrectTypeHint', $data); + } }//end if } else if ($suggestedTypeHint === '' && isset($realParams[$pos]) === true) { $typeHint = $realParams[$pos]['type_hint']; diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Objects/EntityDataObjectTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Objects/EntityDataObjectTest.php index 3fc2aaacb..20c16428c 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Objects/EntityDataObjectTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Objects/EntityDataObjectTest.php @@ -20,12 +20,12 @@ function function_exists($val) return true; } -function msq($id = null) +function msq(?string $id = null) { return "msqUnique"; } -function msqs($id = null) +function msqs(?string $id = null) { return "msqsUnique"; } diff --git a/dev/tests/unit/Util/ActionGroupArrayBuilder.php b/dev/tests/unit/Util/ActionGroupArrayBuilder.php index 14877f4dd..49f9076e1 100644 --- a/dev/tests/unit/Util/ActionGroupArrayBuilder.php +++ b/dev/tests/unit/Util/ActionGroupArrayBuilder.php @@ -111,7 +111,7 @@ public function withActionObjects($actionObjs = []) * @param string $extendedActionGroup * @return $this */ - public function withExtendedAction($extendedActionGroup = null) + public function withExtendedAction(?string $extendedActionGroup = null) { $this->extends = $extendedActionGroup; return $this; diff --git a/dev/tests/unit/Util/SuiteDataArrayBuilder.php b/dev/tests/unit/Util/SuiteDataArrayBuilder.php index 9f937707a..fefc535df 100644 --- a/dev/tests/unit/Util/SuiteDataArrayBuilder.php +++ b/dev/tests/unit/Util/SuiteDataArrayBuilder.php @@ -179,7 +179,7 @@ private function appendEntriesToSuiteContents($currentContents, $type, $contents * @param null $afterHook * @return $this */ - public function withAfterHook($afterHook = null) + public function withAfterHook(?array $afterHook = null) { if ($afterHook === null) { $this->afterHook = [$this->testActionAfterName => [ @@ -200,7 +200,7 @@ public function withAfterHook($afterHook = null) * @param null $beforeHook * @return $this */ - public function withBeforeHook($beforeHook = null) + public function withBeforeHook(?array $beforeHook = null) { if ($beforeHook === null) { $this->beforeHook = [$this->testActionBeforeName => [ diff --git a/dev/tests/unit/Util/TestDataArrayBuilder.php b/dev/tests/unit/Util/TestDataArrayBuilder.php index 0a9672dd7..b2569111b 100644 --- a/dev/tests/unit/Util/TestDataArrayBuilder.php +++ b/dev/tests/unit/Util/TestDataArrayBuilder.php @@ -107,7 +107,7 @@ public function withName($name) * @param array $annotations * @return $this */ - public function withAnnotations($annotations = null) + public function withAnnotations(?array $annotations = null) { if ($annotations === null) { $this->annotations = ['group' => [['value' => 'test']]]; @@ -124,7 +124,7 @@ public function withAnnotations($annotations = null) * @param null $beforeHook * @return $this */ - public function withBeforeHook($beforeHook = null) + public function withBeforeHook(?array $beforeHook = null) { if ($beforeHook === null) { $this->beforeHook = [$this->testActionBeforeName => [ @@ -144,7 +144,7 @@ public function withBeforeHook($beforeHook = null) * @param null $afterHook * @return $this */ - public function withAfterHook($afterHook = null) + public function withAfterHook(?array $afterHook = null) { if ($afterHook === null) { $this->afterHook = [$this->testActionAfterName => [ @@ -165,7 +165,7 @@ public function withAfterHook($afterHook = null) * @param null $failedHook * @return $this */ - public function withFailedHook($failedHook = null) + public function withFailedHook(?array $failedHook = null) { if ($failedHook === null) { $this->failedHook = [$this->testActionFailedName => [ @@ -186,7 +186,7 @@ public function withFailedHook($failedHook = null) * @param array $actions * @return $this */ - public function withTestActions($actions = null) + public function withTestActions(?array $actions = null) { if ($actions === null) { $this->testActions = [$this->testTestActionName => [ @@ -205,7 +205,7 @@ public function withTestActions($actions = null) * @param string $filename * @return $this */ - public function withFileName($filename = null) + public function withFileName(?string $filename = null) { if ($filename === null) { $this->filename = @@ -223,7 +223,7 @@ public function withFileName($filename = null) * @param string $reference * @return $this */ - public function withTestReference($reference = null) + public function withTestReference(?string $reference = null) { if ($reference !== null) { $this->testReference = $reference; diff --git a/src/Magento/FunctionalTestingFramework/Config/Data.php b/src/Magento/FunctionalTestingFramework/Config/Data.php index a34ec1bf3..e9b9c377d 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Data.php +++ b/src/Magento/FunctionalTestingFramework/Config/Data.php @@ -56,7 +56,7 @@ public function merge(array $config) * @param null|mixed $default * @return array|mixed|null */ - public function get($path = null, $default = null) + public function get(mixed $path = null, mixed $default = null) { if ($path === null) { return $this->data; @@ -94,7 +94,7 @@ public function setFileName($fileName) * @param string|null $scope * @return void */ - public function load($scope = null) + public function load(?string $scope = null) { $this->merge( $this->reader->read($scope) diff --git a/src/Magento/FunctionalTestingFramework/Config/DataInterface.php b/src/Magento/FunctionalTestingFramework/Config/DataInterface.php index 6af873001..80636c2e4 100644 --- a/src/Magento/FunctionalTestingFramework/Config/DataInterface.php +++ b/src/Magento/FunctionalTestingFramework/Config/DataInterface.php @@ -26,7 +26,7 @@ public function merge(array $config); * @param mixed|null $default * @return mixed|null */ - public function get($key = null, $default = null); + public function get(mixed $key = null, mixed $default = null); // @codingStandardsIgnoreEnd /** @@ -35,7 +35,7 @@ public function get($key = null, $default = null); * @param string|null $scope * @return void */ - public function load($scope = null); + public function load(?string $scope = null); /** * Set name of the config file diff --git a/src/Magento/FunctionalTestingFramework/Config/Reader/Filesystem.php b/src/Magento/FunctionalTestingFramework/Config/Reader/Filesystem.php index 8e36a63d7..a9dc6785c 100644 --- a/src/Magento/FunctionalTestingFramework/Config/Reader/Filesystem.php +++ b/src/Magento/FunctionalTestingFramework/Config/Reader/Filesystem.php @@ -124,7 +124,7 @@ public function __construct( * @param string|null $scope * @return array */ - public function read($scope = null) + public function read(?string $scope = null) { $scope = $scope ?: $this->defaultScope; $fileList = $this->fileResolver->get($this->fileName, $scope); @@ -228,7 +228,7 @@ protected function verifyFileEmpty($content, $fileName) * @throws \Exception * @return void */ - protected function validateSchema($configMerger, $filename = null) + protected function validateSchema($configMerger, ?string $filename = null) { if ($this->validationState->isValidationRequired()) { $errors = []; diff --git a/src/Magento/FunctionalTestingFramework/Config/ReaderInterface.php b/src/Magento/FunctionalTestingFramework/Config/ReaderInterface.php index 9e64a6715..9fc374f7b 100644 --- a/src/Magento/FunctionalTestingFramework/Config/ReaderInterface.php +++ b/src/Magento/FunctionalTestingFramework/Config/ReaderInterface.php @@ -19,5 +19,5 @@ interface ReaderInterface * @param string|null $scope * @return array */ - public function read($scope = null); + public function read(?string $scope = null); } diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php index fe4a10186..55197a211 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php @@ -82,7 +82,7 @@ public function __construct($entityObject, $dependentObjects = [], $customFields * @return void * @throws TestFrameworkException */ - public function createEntity($storeCode = null) + public function createEntity(?string $storeCode = null) { if (!empty($storeCode)) { $this->storeCode = $storeCode; @@ -136,7 +136,7 @@ public function updateEntity($updateDataName, $updateDependentObjects = []) * @return void * @throws TestFrameworkException */ - public function getEntity($index = null, $storeCode = null) + public function getEntity(?string $index = null, ?string $storeCode = null) { if (!empty($storeCode)) { $this->storeCode = $storeCode; diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/OperationDataArrayResolver.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/OperationDataArrayResolver.php index 3266f5a24..8ff1f72c9 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/OperationDataArrayResolver.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/OperationDataArrayResolver.php @@ -46,7 +46,7 @@ class OperationDataArrayResolver * * @param array $dependentEntities */ - public function __construct($dependentEntities = null) + public function __construct(?array $dependentEntities = null) { if ($dependentEntities !== null) { foreach ($dependentEntities as $entity) { diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/AdminFormExecutor.php b/src/Magento/FunctionalTestingFramework/DataTransport/AdminFormExecutor.php index 0573f48ce..105cce7e7 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/AdminFormExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/AdminFormExecutor.php @@ -157,7 +157,7 @@ public function write($url, $data = [], $method = CurlInterface::POST, $headers * @return string|array * @throws TestFrameworkException */ - public function read($successRegex = null, $returnRegex = null, $returnIndex = null) + public function read(?string $successRegex = null, ?string $returnRegex = null, ?string $returnIndex = null) { $this->response = $this->transport->read(); $this->setFormKey(); diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/Tfa/OTP.php b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/Tfa/OTP.php index 32c1f6b81..b12733b33 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/Tfa/OTP.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/Tfa/OTP.php @@ -31,7 +31,7 @@ class OTP * @return string * @throws TestFrameworkException */ - public static function getOTP($path = null) + public static function getOTP(?string $path = null) { if ($path === null) { $path = self::OTP_SHARED_SECRET_PATH; diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php index 775dcc6e9..ac2d3ae99 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/WebApiAuth.php @@ -56,7 +56,7 @@ class WebApiAuth * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public static function getAdminToken($username = null, $password = null) + public static function getAdminToken(?string $username = null, ?string $password = null) { $login = $username ?? getenv('MAGENTO_ADMIN_USERNAME'); try { diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/FrontendFormExecutor.php b/src/Magento/FunctionalTestingFramework/DataTransport/FrontendFormExecutor.php index 0cf69ec94..c167c79b6 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/FrontendFormExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/FrontendFormExecutor.php @@ -165,7 +165,7 @@ public function write($url, $data = [], $method = CurlInterface::POST, $headers * @return string|array * @throws TestFrameworkException */ - public function read($successRegex = null, $returnRegex = null, $returnIndex = null) + public function read(?string $successRegex = null, ?string $returnRegex = null, ?string $returnIndex = null) { $this->response = $this->transport->read(); $this->setCookies(); diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Protocol/CurlInterface.php b/src/Magento/FunctionalTestingFramework/DataTransport/Protocol/CurlInterface.php index d15dbb18b..31d931819 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Protocol/CurlInterface.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Protocol/CurlInterface.php @@ -47,7 +47,7 @@ public function write($url, $body = [], $method = CurlInterface::POST, $headers * @param string|null $returnIndex * @return string|array */ - public function read($successRegex = null, $returnRegex = null, $returnIndex = null); + public function read(?string $successRegex = null, ?string $returnRegex = null, ?string $returnIndex = null); /** * Close the connection to the server. diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Protocol/CurlTransport.php b/src/Magento/FunctionalTestingFramework/DataTransport/Protocol/CurlTransport.php index 6d064feb5..fc35da08e 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Protocol/CurlTransport.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Protocol/CurlTransport.php @@ -167,7 +167,7 @@ public function write($url, $body = [], $method = CurlInterface::POST, $headers * @return string * @throws TestFrameworkException */ - public function read($successRegex = null, $returnRegex = null, $returnIndex = null) + public function read(?string $successRegex = null, ?string $returnRegex = null, ?string $returnIndex = null) { $response = curl_exec($this->getResource()); diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/WebApiExecutor.php b/src/Magento/FunctionalTestingFramework/DataTransport/WebApiExecutor.php index 3a4b627bd..52b7cdb65 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/WebApiExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/WebApiExecutor.php @@ -48,7 +48,7 @@ class WebApiExecutor implements CurlInterface * @param string $storeCode * @throws FastFailException */ - public function __construct($storeCode = null) + public function __construct(?string $storeCode = null) { $this->storeCode = $storeCode; $this->transport = new CurlTransport(); @@ -98,7 +98,7 @@ public function write($url, $data = [], $method = CurlInterface::POST, $headers * @return string * @throws TestFrameworkException */ - public function read($successRegex = null, $returnRegex = null, $returnIndex = null) + public function read(?string $successRegex = null, ?string $returnRegex = null, ?string $returnIndex = null) { return $this->transport->read(); } diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 46a05c946..01eab2996 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -158,7 +158,7 @@ private function __construct($exportDir, $tests, $debug = false) * @param boolean $debug * @return TestGenerator */ - public static function getInstance($dir = null, $tests = [], $debug = false) + public static function getInstance(?string $dir = null, $tests = [], $debug = false) { return new TestGenerator($dir, $tests, $debug); } @@ -230,7 +230,7 @@ private function createCestFile(string $testPhp, string $filename) * @throws FastFailException * @throws TestReferenceException */ - public function createAllTestFiles($testManifest = null, $testsToIgnore = null) + public function createAllTestFiles(?BaseTestManifest $testManifest = null, ?array $testsToIgnore = null) { if ($this->tests === null) { // no-op if the test configuration is null @@ -563,7 +563,7 @@ private function generateAnnotationsPhp($testObject, $isMethod = false) * @param string|null $annotationName * @return null|string */ - private function generateMethodAnnotations($annotationType = null, $annotationName = null) + private function generateMethodAnnotations(?string $annotationType = null, mixed $annotationName = null) { $annotationToAppend = null; $indent = "\t"; @@ -2342,7 +2342,7 @@ private function isWrappedArray(string $paramArray) * @return string|null * @throws TestReferenceException */ - private function resolveValueByType($value = null, $type = null) + private function resolveValueByType(?string $value = null, ?string $type = null) { if (null === $value) { return null; From 76fe4caec75b4e07dd6fb2edb0fafd215df47a53 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Wed, 13 Nov 2024 14:36:18 +0530 Subject: [PATCH 640/674] ACQE-7127 | Remove unused dependencies --- composer.json | 11 - composer.lock | 939 +++++++++++++++++++++----------------------------- 2 files changed, 393 insertions(+), 557 deletions(-) diff --git a/composer.json b/composer.json index 0c37d1d25..df7710af5 100755 --- a/composer.json +++ b/composer.json @@ -31,22 +31,11 @@ "php": ">8.2", "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0||^11.0", - "symfony/config": "^6.4", "symfony/console": "^6.4", - "symfony/dependency-injection": "^6.4", "symfony/dotenv": "^6.4", - "symfony/filesystem": "^6.4", "symfony/finder": "^6.4", - "symfony/http-foundation": "^6.4", "symfony/mime": "^6.4", "symfony/process": "^6.4", - "symfony/stopwatch": "^6.4", - "symfony/string": "^6.4", - "symfony/var-exporter": "^6.4", - "symfony/css-selector": "^6.4", - "symfony/event-dispatcher": "^6.4", - "symfony/var-dumper": "^6.4||^7.0", - "symfony/yaml": "^6.4||^7.0", "weew/helpers-array": "^1.3" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 381ff0862..0914eebc4 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": "f82575a7f1049c14a7ed97c3ddd58403", + "content-hash": "e915b0e354229e5ab93b5e87e4fee528", "packages": [ { "name": "allure-framework/allure-codeception", @@ -199,16 +199,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.325.2", + "version": "3.325.7", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "9e354a5e0cd1d563ec85245e3000e98e16a44fce" + "reference": "55852104253172e66c3358bf4c35281bbd8622b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9e354a5e0cd1d563ec85245e3000e98e16a44fce", - "reference": "9e354a5e0cd1d563ec85245e3000e98e16a44fce", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/55852104253172e66c3358bf4c35281bbd8622b2", + "reference": "55852104253172e66c3358bf4c35281bbd8622b2", "shasum": "" }, "require": { @@ -291,9 +291,9 @@ "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.325.2" + "source": "https://github.com/aws/aws-sdk-php/tree/3.325.7" }, - "time": "2024-11-01T18:08:38+00:00" + "time": "2024-11-12T19:27:31+00:00" }, { "name": "behat/gherkin", @@ -849,16 +849,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.2", + "version": "1.5.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "48a792895a2b7a6ee65dd5442c299d7b835b6137" + "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/48a792895a2b7a6ee65dd5442c299d7b835b6137", - "reference": "48a792895a2b7a6ee65dd5442c299d7b835b6137", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3b1fc3f0be055baa7c6258b1467849c3e8204eb2", + "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2", "shasum": "" }, "require": { @@ -905,7 +905,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.2" + "source": "https://github.com/composer/ca-bundle/tree/1.5.3" }, "funding": [ { @@ -921,7 +921,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T07:49:53+00:00" + "time": "2024-11-04T10:15:26+00:00" }, { "name": "composer/class-map-generator", @@ -1181,16 +1181,16 @@ }, { "name": "composer/pcre", - "version": "3.3.1", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", - "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { @@ -1200,8 +1200,8 @@ "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "phpstan/phpstan": "^1.11.10", - "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", "phpunit/phpunit": "^8 || ^9" }, "type": "library", @@ -1240,7 +1240,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.1" + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -1256,7 +1256,7 @@ "type": "tidelift" } ], - "time": "2024-08-27T18:44:43+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { "name": "composer/semver", @@ -2181,16 +2181,16 @@ }, { "name": "monolog/monolog", - "version": "3.7.0", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" + "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", - "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/32e515fdc02cdafbe4593e30a9350d486b125b67", + "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67", "shasum": "" }, "require": { @@ -2210,12 +2210,14 @@ "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.5.17", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", "predis/predis": "^1.1 || ^2", - "ruflin/elastica": "^7", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -2266,7 +2268,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.7.0" + "source": "https://github.com/Seldaek/monolog/tree/3.8.0" }, "funding": [ { @@ -2278,7 +2280,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:40:51+00:00" + "time": "2024-11-12T13:57:08+00:00" }, { "name": "mtdowling/jmespath.php", @@ -2398,16 +2400,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.12.0", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", "shasum": "" }, "require": { @@ -2446,7 +2448,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" }, "funding": [ { @@ -2454,7 +2456,7 @@ "type": "tidelift" } ], - "time": "2024-06-12T14:39:25+00:00" + "time": "2024-11-08T17:47:46+00:00" }, { "name": "nikic/php-parser", @@ -5145,93 +5147,18 @@ ], "time": "2024-06-12T11:22:32+00:00" }, - { - "name": "symfony/config", - "version": "v6.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "5ed4195a81d2352e0e4ce24e5f7e26fc794e7597" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/5ed4195a81d2352e0e4ce24e5f7e26fc794e7597", - "reference": "5ed4195a81d2352e0e4ce24e5f7e26fc794e7597", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<5.4", - "symfony/service-contracts": "<2.5" - }, - "require-dev": { - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "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/v6.4.13" - }, - "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": "2024-10-25T15:07:50+00:00" - }, { "name": "symfony/console", - "version": "v6.4.13", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "f793dd5a7d9ae9923e35d0503d08ba734cec1d79" + "reference": "897c2441ed4eec8a8a2c37b943427d24dba3f26b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f793dd5a7d9ae9923e35d0503d08ba734cec1d79", - "reference": "f793dd5a7d9ae9923e35d0503d08ba734cec1d79", + "url": "https://api.github.com/repos/symfony/console/zipball/897c2441ed4eec8a8a2c37b943427d24dba3f26b", + "reference": "897c2441ed4eec8a8a2c37b943427d24dba3f26b", "shasum": "" }, "require": { @@ -5296,7 +5223,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.13" + "source": "https://github.com/symfony/console/tree/v6.4.14" }, "funding": [ { @@ -5312,24 +5239,24 @@ "type": "tidelift" } ], - "time": "2024-10-09T08:40:40+00:00" + "time": "2024-11-05T15:34:40+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.13", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "cb23e97813c5837a041b73a6d63a9ddff0778f5e" + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/cb23e97813c5837a041b73a6d63a9ddff0778f5e", - "reference": "cb23e97813c5837a041b73a6d63a9ddff0778f5e", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -5361,88 +5288,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.13" - }, - "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": "2024-09-25T14:18:03+00:00" - }, - { - "name": "symfony/dependency-injection", - "version": "v6.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "728ae8f4e190133ce99d6d5f0bc1e8c8bd7c7a96" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/728ae8f4e190133ce99d6d5f0bc1e8c8bd7c7a96", - "reference": "728ae8f4e190133ce99d6d5f0bc1e8c8bd7c7a96", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.2.10|^7.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2", - "symfony/config": "<6.1", - "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.3", - "symfony/yaml": "<5.4" - }, - "provide": { - "psr/container-implementation": "1.1|2.0", - "symfony/service-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "symfony/config": "^6.1|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "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/v6.4.13" + "source": "https://github.com/symfony/css-selector/tree/v7.1.6" }, "funding": [ { @@ -5458,7 +5304,7 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:07:50+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5603,24 +5449,24 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.4.13", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e" + "reference": "87254c78dd50721cfd015b62277a8281c5589702" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", - "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", + "reference": "87254c78dd50721cfd015b62277a8281c5589702", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4", + "symfony/dependency-injection": "<6.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -5629,13 +5475,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -5663,7 +5509,7 @@ "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/v6.4.13" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6" }, "funding": [ { @@ -5679,7 +5525,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:18:03+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5759,25 +5605,25 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.13", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3" + "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/4856c9cf585d5a0313d8d35afd681a526f038dd3", - "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/c835867b3c62bb05c7fe3d637c871c7ae52024d4", + "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^5.4|^6.4|^7.0" + "symfony/process": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -5805,7 +5651,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.13" + "source": "https://github.com/symfony/filesystem/tree/v7.1.6" }, "funding": [ { @@ -5821,7 +5667,7 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:07:50+00:00" + "time": "2024-10-25T15:11:02+00:00" }, { "name": "symfony/finder", @@ -5887,83 +5733,6 @@ ], "time": "2024-10-01T08:30:56+00:00" }, - { - "name": "symfony/http-foundation", - "version": "v6.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "4c0341b3e0a7291e752c69d2a1ed9a84b68d604c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4c0341b3e0a7291e752c69d2a1ed9a84b68d604c", - "reference": "4c0341b3e0a7291e752c69d2a1ed9a84b68d604c", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php83": "^1.27" - }, - "conflict": { - "symfony/cache": "<6.3" - }, - "require-dev": { - "doctrine/dbal": "^2.13.1|^3|^4", - "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.3|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.13" - }, - "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": "2024-10-11T19:20:58+00:00" - }, { "name": "symfony/mime", "version": "v6.4.13", @@ -6683,38 +6452,29 @@ "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php83", - "version": "v1.31.0", + "name": "symfony/process", + "version": "v6.4.14", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "url": "https://github.com/symfony/process.git", + "reference": "25214adbb0996d18112548de20c281be9f27279f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/symfony/process/zipball/25214adbb0996d18112548de20c281be9f27279f", + "reference": "25214adbb0996d18112548de20c281be9f27279f", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.1" }, "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" + "Symfony\\Component\\Process\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -6723,24 +6483,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + "source": "https://github.com/symfony/process/tree/v6.4.14" }, "funding": [ { @@ -6756,76 +6510,15 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-11-06T09:25:01+00:00" }, { - "name": "symfony/process", - "version": "v6.4.13", + "name": "symfony/service-contracts", + "version": "v3.5.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "1f9f59b46880201629df3bd950fc5ae8c55b960f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/1f9f59b46880201629df3bd950fc5ae8c55b960f", - "reference": "1f9f59b46880201629df3bd950fc5ae8c55b960f", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v6.4.13" - }, - "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": "2024-09-25T14:18:03+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", @@ -6902,68 +6595,6 @@ ], "time": "2024-04-18T09:32:20+00:00" }, - { - "name": "symfony/stopwatch", - "version": "v6.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2cae0a6f8d04937d02f6d19806251e2104d54f92", - "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.13" - }, - "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": "2024-09-25T14:18:03+00:00" - }, { "name": "symfony/string", "version": "v6.4.13", @@ -7052,16 +6683,16 @@ }, { "name": "symfony/var-dumper", - "version": "v7.1.6", + "version": "v7.1.7", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "cb5bd55a6b8c2c1c7fb68b0aeae0e257948a720c" + "reference": "f6ea51f669760cacd7464bf7eaa0be87b8072db1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cb5bd55a6b8c2c1c7fb68b0aeae0e257948a720c", - "reference": "cb5bd55a6b8c2c1c7fb68b0aeae0e257948a720c", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/f6ea51f669760cacd7464bf7eaa0be87b8072db1", + "reference": "f6ea51f669760cacd7464bf7eaa0be87b8072db1", "shasum": "" }, "require": { @@ -7115,84 +6746,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.6" - }, - "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": "2024-09-25T14:20:29+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v6.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "0f605f72a363f8743001038a176eeb2a11223b51" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f605f72a363f8743001038a176eeb2a11223b51", - "reference": "0f605f72a363f8743001038a176eeb2a11223b51", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "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": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.13" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.7" }, "funding": [ { @@ -7208,7 +6762,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:18:03+00:00" + "time": "2024-11-05T15:34:55+00:00" }, { "name": "symfony/yaml", @@ -7755,6 +7309,299 @@ } ], "time": "2024-09-18T10:38:58+00:00" + }, + { + "name": "symfony/config", + "version": "v7.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8", + "reference": "dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^7.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "require-dev": { + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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/v7.1.7" + }, + "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": "2024-11-04T11:34:07+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "1f12f9d580ef8dd09e3b756aa111cc2d5f311bfd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/1f12f9d580ef8dd09e3b756aa111cc2d5f311bfd", + "reference": "1f12f9d580ef8dd09e3b756aa111cc2d5f311bfd", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^3.5", + "symfony/var-exporter": "^6.4|^7.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<6.4", + "symfony/finder": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "symfony/config": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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/v7.1.6" + }, + "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": "2024-10-25T15:11:02+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8b4a434e6e7faf6adedffb48783a5c75409a1a05", + "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v7.1.6" + }, + "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": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "90173ef89c40e7c8c616653241048705f84130ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/90173ef89c40e7c8c616653241048705f84130ef", + "reference": "90173ef89c40e7c8c616653241048705f84130ef", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v7.1.6" + }, + "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": "2024-09-25T14:20:29+00:00" } ], "aliases": [], From 929cda89bb3ba6dd6bf78f682643e2ba13c028e3 Mon Sep 17 00:00:00 2001 From: Dnyaneshwar Jambhulkar <pru34625@adobe.com> Date: Wed, 20 Nov 2024 23:20:37 +0530 Subject: [PATCH 641/674] Mftf - removed --ignore-certificate-errors for chrome new version --- 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 cacc6836f..25cad8342 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -38,4 +38,4 @@ modules: capabilities: unhandledPromptBehavior: "ignore" chromeOptions: - args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--ignore-certificate-errors", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad"] + args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad"] From 6ced94d89caeb3ff0105a3cd2abdbb05a71063cf Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Thu, 5 Dec 2024 10:25:33 +0530 Subject: [PATCH 642/674] Update functional.suite.dist.yml --- 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 25cad8342..f0f8f028b 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -38,4 +38,4 @@ modules: capabilities: unhandledPromptBehavior: "ignore" chromeOptions: - args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad"] + args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad", "--allow-running-insecure-content"] From 25726b6a498a800b69d60c5978b4969c2d82e58e Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Thu, 5 Dec 2024 11:55:32 +0530 Subject: [PATCH 643/674] Update functional.suite.dist.yml --- 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 f0f8f028b..aec5dd144 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -38,4 +38,4 @@ modules: capabilities: unhandledPromptBehavior: "ignore" chromeOptions: - args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad", "--allow-running-insecure-content"] + args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--ignore-certificate-errors", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad", "--disable-web-security", "--allow-insecure-localhost"] From 6d95b7a7bcc1b888a7a731a292c0939fc0043314 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Thu, 5 Dec 2024 17:14:45 +0530 Subject: [PATCH 644/674] Update functional.suite.dist.yml --- 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 aec5dd144..d2b46e6a1 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -38,4 +38,4 @@ modules: capabilities: unhandledPromptBehavior: "ignore" chromeOptions: - args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--ignore-certificate-errors", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad", "--disable-web-security", "--allow-insecure-localhost"] + args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad", "--disable-web-security", "--allow-insecure-localhost"] From a0cb2eeb20a9120236cf0b659ce8ea08bfeb2658 Mon Sep 17 00:00:00 2001 From: Saurabh Kumar <glo17680@adobe.com> Date: Fri, 13 Dec 2024 09:25:54 +0530 Subject: [PATCH 645/674] PHP 8.4: deprecation fixes --- .../Allure/Adapter/MagentoAllureAdapter.php | 2 +- .../FunctionalTestingFramework/Config/FileResolver/Mask.php | 2 +- .../FunctionalTestingFramework/Config/FileResolver/Module.php | 2 +- src/Magento/FunctionalTestingFramework/ObjectManager.php | 4 ++-- .../ObjectManager/Config/Config.php | 2 +- .../ObjectManager/Config/Mapper/Dom.php | 4 ++-- .../ObjectManager/Definition/Runtime.php | 2 +- .../FunctionalTestingFramework/ObjectManager/Factory.php | 4 ++-- .../ObjectManager/Factory/Dynamic/Developer.php | 4 ++-- .../ObjectManager/Relations/Runtime.php | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php b/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php index 485a86fe1..1c4766f56 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php +++ b/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php @@ -199,7 +199,7 @@ public function stepBefore(StepEvent $stepEvent) * @throws \Yandex\Allure\Adapter\AllureException * @return void */ - public function stepAfter(StepEvent $stepEvent = null) + public function stepAfter(?StepEvent $stepEvent = null) { // Simply return if step is INVISIBLE_STEP_ACTIONS if ($this->atInvisibleSteps) { diff --git a/src/Magento/FunctionalTestingFramework/Config/FileResolver/Mask.php b/src/Magento/FunctionalTestingFramework/Config/FileResolver/Mask.php index e3f29f954..7db1514af 100644 --- a/src/Magento/FunctionalTestingFramework/Config/FileResolver/Mask.php +++ b/src/Magento/FunctionalTestingFramework/Config/FileResolver/Mask.php @@ -28,7 +28,7 @@ class Mask implements FileResolverInterface * * @param ModuleResolver|null $moduleResolver */ - public function __construct(ModuleResolver $moduleResolver = null) + public function __construct(?ModuleResolver $moduleResolver = null) { if ($moduleResolver) { $this->moduleResolver = $moduleResolver; diff --git a/src/Magento/FunctionalTestingFramework/Config/FileResolver/Module.php b/src/Magento/FunctionalTestingFramework/Config/FileResolver/Module.php index 7cff19c87..18432c876 100644 --- a/src/Magento/FunctionalTestingFramework/Config/FileResolver/Module.php +++ b/src/Magento/FunctionalTestingFramework/Config/FileResolver/Module.php @@ -27,7 +27,7 @@ class Module implements FileResolverInterface * @param ModuleResolver|null $moduleResolver * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function __construct(ModuleResolver $moduleResolver = null) + public function __construct(?ModuleResolver $moduleResolver = null) { $this->moduleResolver = ModuleResolver::getInstance(); } diff --git a/src/Magento/FunctionalTestingFramework/ObjectManager.php b/src/Magento/FunctionalTestingFramework/ObjectManager.php index 8b0f34537..ed07a0d9f 100644 --- a/src/Magento/FunctionalTestingFramework/ObjectManager.php +++ b/src/Magento/FunctionalTestingFramework/ObjectManager.php @@ -39,8 +39,8 @@ class ObjectManager extends \Magento\FunctionalTestingFramework\ObjectManager\Ob * @param array $sharedInstances */ public function __construct( - \Magento\FunctionalTestingFramework\ObjectManager\Factory $factory = null, - \Magento\FunctionalTestingFramework\ObjectManager\ConfigInterface $config = null, + ?\Magento\FunctionalTestingFramework\ObjectManager\Factory $factory = null, + ?\Magento\FunctionalTestingFramework\ObjectManager\ConfigInterface $config = null, array $sharedInstances = [] ) { parent::__construct($factory, $config, $sharedInstances); diff --git a/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Config.php b/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Config.php index 3b2c827d5..435b29818 100644 --- a/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Config.php +++ b/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Config.php @@ -76,7 +76,7 @@ class Config implements \Magento\FunctionalTestingFramework\ObjectManager\Config * @param RelationsInterface|null $relations * @param DefinitionInterface|null $definitions */ - public function __construct(RelationsInterface $relations = null, DefinitionInterface $definitions = null) + public function __construct(?RelationsInterface $relations = null, ?DefinitionInterface $definitions = null) { $this->relations = $relations ? : new RelationsRuntime(); $this->definitions = $definitions ? : new DefinitionRuntime(); diff --git a/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Mapper/Dom.php b/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Mapper/Dom.php index 99912355d..ee1ef6045 100644 --- a/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Mapper/Dom.php +++ b/src/Magento/FunctionalTestingFramework/ObjectManager/Config/Mapper/Dom.php @@ -33,8 +33,8 @@ class Dom implements \Magento\FunctionalTestingFramework\Config\ConverterInterfa */ public function __construct( InterpreterInterface $argumentInterpreter, - BooleanUtils $booleanUtils = null, - ArgumentParser $argumentParser = null + ?BooleanUtils $booleanUtils = null, + ?ArgumentParser $argumentParser = null ) { $this->argumentInterpreter = $argumentInterpreter; $this->booleanUtils = $booleanUtils ?: new BooleanUtils(); diff --git a/src/Magento/FunctionalTestingFramework/ObjectManager/Definition/Runtime.php b/src/Magento/FunctionalTestingFramework/ObjectManager/Definition/Runtime.php index f77e7d110..095bf17eb 100644 --- a/src/Magento/FunctionalTestingFramework/ObjectManager/Definition/Runtime.php +++ b/src/Magento/FunctionalTestingFramework/ObjectManager/Definition/Runtime.php @@ -29,7 +29,7 @@ class Runtime implements \Magento\FunctionalTestingFramework\ObjectManager\Defin * Runtime constructor. * @param \Magento\FunctionalTestingFramework\Code\Reader\ClassReader|null $reader */ - public function __construct(\Magento\FunctionalTestingFramework\Code\Reader\ClassReader $reader = null) + public function __construct(?\Magento\FunctionalTestingFramework\Code\Reader\ClassReader $reader = null) { $this->reader = $reader ? : new \Magento\FunctionalTestingFramework\Code\Reader\ClassReader(); } diff --git a/src/Magento/FunctionalTestingFramework/ObjectManager/Factory.php b/src/Magento/FunctionalTestingFramework/ObjectManager/Factory.php index 922235011..31b6c4f50 100644 --- a/src/Magento/FunctionalTestingFramework/ObjectManager/Factory.php +++ b/src/Magento/FunctionalTestingFramework/ObjectManager/Factory.php @@ -31,8 +31,8 @@ class Factory extends \Magento\FunctionalTestingFramework\ObjectManager\Factory\ */ public function __construct( ConfigInterface $config, - \Magento\FunctionalTestingFramework\ObjectManagerInterface $objectManager = null, - DefinitionInterface $definitions = null, + ?\Magento\FunctionalTestingFramework\ObjectManagerInterface $objectManager = null, + ?DefinitionInterface $definitions = null, $globalArguments = [] ) { parent::__construct($config, $objectManager, $definitions, $globalArguments); diff --git a/src/Magento/FunctionalTestingFramework/ObjectManager/Factory/Dynamic/Developer.php b/src/Magento/FunctionalTestingFramework/ObjectManager/Factory/Dynamic/Developer.php index 0d6623d09..17c7fd972 100644 --- a/src/Magento/FunctionalTestingFramework/ObjectManager/Factory/Dynamic/Developer.php +++ b/src/Magento/FunctionalTestingFramework/ObjectManager/Factory/Dynamic/Developer.php @@ -54,8 +54,8 @@ class Developer implements \Magento\FunctionalTestingFramework\ObjectManager\Fac */ public function __construct( \Magento\FunctionalTestingFramework\ObjectManager\ConfigInterface $config, - \Magento\FunctionalTestingFramework\ObjectManagerInterface $objectManager = null, - \Magento\FunctionalTestingFramework\ObjectManager\DefinitionInterface $definitions = null, + ?\Magento\FunctionalTestingFramework\ObjectManagerInterface $objectManager = null, + ?\Magento\FunctionalTestingFramework\ObjectManager\DefinitionInterface $definitions = null, $globalArguments = [] ) { $this->config = $config; diff --git a/src/Magento/FunctionalTestingFramework/ObjectManager/Relations/Runtime.php b/src/Magento/FunctionalTestingFramework/ObjectManager/Relations/Runtime.php index 192758220..1a49a120d 100644 --- a/src/Magento/FunctionalTestingFramework/ObjectManager/Relations/Runtime.php +++ b/src/Magento/FunctionalTestingFramework/ObjectManager/Relations/Runtime.php @@ -28,7 +28,7 @@ class Runtime implements \Magento\FunctionalTestingFramework\ObjectManager\Relat * Runtime constructor. * @param \Magento\FunctionalTestingFramework\Code\Reader\ClassReader|null $classReader */ - public function __construct(\Magento\FunctionalTestingFramework\Code\Reader\ClassReader $classReader = null) + public function __construct(?\Magento\FunctionalTestingFramework\Code\Reader\ClassReader $classReader = null) { $this->classReader = $classReader ? : new \Magento\FunctionalTestingFramework\Code\Reader\ClassReader(); } From a2d57234bbfb9e4de61ebf6e13346d3515d6c711 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Fri, 13 Dec 2024 13:21:27 +0530 Subject: [PATCH 646/674] PHP 8.4 upgrade | adding support for php8.2 --- .github/workflows/main.yml | 8 ++++---- composer.json | 2 +- composer.lock | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ce667e709..f860dd5ae 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.3', '8.4'] + php-versions: ['8.2', '8.3', '8.4'] steps: - uses: actions/checkout@v2 @@ -54,7 +54,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.3', '8.4'] + php-versions: ['8.2', '8.3', '8.4'] steps: - uses: actions/checkout@v2 @@ -86,7 +86,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.3', '8.4'] + php-versions: ['8.2', '8.3', '8.4'] steps: - uses: actions/checkout@v2 @@ -118,7 +118,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['8.3', '8.4'] + php-versions: ['8.2', '8.3', '8.4'] services: chrome: diff --git a/composer.json b/composer.json index df7710af5..77969fd3b 100755 --- a/composer.json +++ b/composer.json @@ -28,7 +28,7 @@ "monolog/monolog": "^2.3||^3.0", "mustache/mustache": "~2.5", "nikic/php-parser": "^4.4||^5.0", - "php": ">8.2", + "php": ">=8.2", "php-webdriver/webdriver": "^1.14.0", "spomky-labs/otphp": "^10.0||^11.0", "symfony/console": "^6.4", diff --git a/composer.lock b/composer.lock index 0914eebc4..842484983 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": "e915b0e354229e5ab93b5e87e4fee528", + "content-hash": "6ae26aa3d9b7f2d35cf78b9810e52e9b", "packages": [ { "name": "allure-framework/allure-codeception", @@ -7616,7 +7616,7 @@ "ext-intl": "*", "ext-json": "*", "ext-openssl": "*", - "php": ">8.2" + "php": ">=8.2" }, "platform-dev": [], "plugin-api-version": "2.6.0" From ce903419522c171bf580b1fe8122aa4eebf4150f Mon Sep 17 00:00:00 2001 From: Keerthana SL <85945557+Keerthana81187@users.noreply.github.com> Date: Mon, 16 Dec 2024 20:18:47 +0530 Subject: [PATCH 647/674] MFTF_5.0.0_RC: Update CHANGELOG.md --- CHANGELOG.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bae239af6..63a3daf6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Magento Functional Testing Framework Changelog ### Enhancements * Provided support for PHP 8.4 * Dropped the support for PHP 8.1 +* Removed unwanted dependent packages 4.8.3 --------- @@ -51,16 +52,16 @@ Magento Functional Testing Framework Changelog 4.7.2 --------- ### Enhancements -* Fail static test when introduced filename does not equal the MFTF object name +* Fail static test when introduced filename does not equal the MFTF object name contained within. 4.7.1 --------- ### Enhancements * Bumped all symfony dependencies to `^6.0 -* Removed abandoned package codacy/coverage +* Removed abandoned package codacy/coverage * Removed abandoned package sebastian/phpcpd -* Bumped monolog/monolog to ^3.0 +* Bumped monolog/monolog to ^3.0 * Bumped nikic/php-parser to ^5.0 4.7.0 From d94b6c3dbc388760ad95ad8a65908e37c2df1dea Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Mon, 23 Dec 2024 13:33:56 +0530 Subject: [PATCH 648/674] Update functional.suite.dist.yml --- 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 d2b46e6a1..25cad8342 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -38,4 +38,4 @@ modules: capabilities: unhandledPromptBehavior: "ignore" chromeOptions: - args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad", "--disable-web-security", "--allow-insecure-localhost"] + args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad"] From 8ad7599c9eecab035012b3772ad093a4389a7120 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Tue, 31 Dec 2024 12:34:53 +0530 Subject: [PATCH 649/674] remove dependency of magento sequence library --- composer.json | 1 - composer.lock | 481 ++++++++---------- src/Codeception/Module/Sequence.php | 0 src/Codeception/Util/sq.php | 0 .../Codeception/Module/Sequence.php | 134 +++++ .../Codeception/Util/sq.php | 37 ++ .../Module/MagentoSequence.php | 2 +- .../FunctionalTestingFramework/Util/msq.php | 43 +- 8 files changed, 416 insertions(+), 282 deletions(-) create mode 100644 src/Codeception/Module/Sequence.php create mode 100644 src/Codeception/Util/sq.php create mode 100644 src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php create mode 100644 src/Magento/FunctionalTestingFramework/Codeception/Util/sq.php diff --git a/composer.json b/composer.json index 77969fd3b..f0ea832cb 100755 --- a/composer.json +++ b/composer.json @@ -13,7 +13,6 @@ "aws/aws-sdk-php": "^3.132", "codeception/codeception": "^5.0", "codeception/module-asserts": "^3.0", - "codeception/module-sequence": "^3.0", "codeception/module-webdriver": "^4.0", "composer/composer": "^1.9||^2.0,!=2.2.16", "csharpru/vault-php": "^4.2.1", diff --git a/composer.lock b/composer.lock index 842484983..76eb7e056 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": "6ae26aa3d9b7f2d35cf78b9810e52e9b", + "content-hash": "358c40222c9d8cc40ba6d26bfd485c5e", "packages": [ { "name": "allure-framework/allure-codeception", @@ -199,16 +199,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.325.7", + "version": "3.336.6", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "55852104253172e66c3358bf4c35281bbd8622b2" + "reference": "0a99dab427f0a1c082775301141aeac3558691ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/55852104253172e66c3358bf4c35281bbd8622b2", - "reference": "55852104253172e66c3358bf4c35281bbd8622b2", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0a99dab427f0a1c082775301141aeac3558691ad", + "reference": "0a99dab427f0a1c082775301141aeac3558691ad", "shasum": "" }, "require": { @@ -237,8 +237,8 @@ "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", - "psr/cache": "^1.0", - "psr/simple-cache": "^1.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0", "sebastian/comparator": "^1.2.3 || ^4.0", "yoast/phpunit-polyfills": "^1.0" }, @@ -291,31 +291,31 @@ "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.325.7" + "source": "https://github.com/aws/aws-sdk-php/tree/3.336.6" }, - "time": "2024-11-12T19:27:31+00:00" + "time": "2024-12-28T04:16:13+00:00" }, { "name": "behat/gherkin", - "version": "v4.10.0", + "version": "v4.11.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6" + "reference": "32821a17b12620951e755b5d49328a6421a5b5b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6", - "reference": "cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/32821a17b12620951e755b5d49328a6421a5b5b5", + "reference": "32821a17b12620951e755b5d49328a6421a5b5b5", "shasum": "" }, "require": { - "php": "~7.2|~8.0" + "php": "8.1.* || 8.2.* || 8.3.* || 8.4.*" }, "require-dev": { "cucumber/cucumber": "dev-gherkin-24.1.0", - "phpunit/phpunit": "~8|~9", - "symfony/yaml": "~3|~4|~5|~6|~7" + "phpunit/phpunit": "^9.6", + "symfony/yaml": "^5.4 || ^6.4 || ^7.0" }, "suggest": { "symfony/yaml": "If you want to parse features, represented in YAML files" @@ -354,9 +354,9 @@ ], "support": { "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.10.0" + "source": "https://github.com/Behat/Gherkin/tree/v4.11.0" }, - "time": "2024-10-19T14:46:06+00:00" + "time": "2024-12-06T10:07:25+00:00" }, { "name": "brick/math", @@ -698,53 +698,6 @@ }, "time": "2022-02-16T19:48:08+00:00" }, - { - "name": "codeception/module-sequence", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/Codeception/module-sequence.git", - "reference": "9738e2eb06035a0975171a0aa3fce00d284b4dfb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-sequence/zipball/9738e2eb06035a0975171a0aa3fce00d284b4dfb", - "reference": "9738e2eb06035a0975171a0aa3fce00d284b4dfb", - "shasum": "" - }, - "require": { - "codeception/codeception": "^5.0", - "php": "^8.0" - }, - "type": "library", - "autoload": { - "files": [ - "src/Codeception/Util/sq.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Bodnarchuk" - } - ], - "description": "Sequence module for Codeception", - "homepage": "https://codeception.com/", - "keywords": [ - "codeception" - ], - "support": { - "issues": "https://github.com/Codeception/module-sequence/issues", - "source": "https://github.com/Codeception/module-sequence/tree/3.0.0" - }, - "time": "2022-05-31T05:45:36+00:00" - }, { "name": "codeception/module-webdriver", "version": "4.0.2", @@ -849,16 +802,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.3", + "version": "1.5.4", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2" + "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3b1fc3f0be055baa7c6258b1467849c3e8204eb2", - "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/bc0593537a463e55cadf45fd938d23b75095b7e1", + "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1", "shasum": "" }, "require": { @@ -905,7 +858,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.3" + "source": "https://github.com/composer/ca-bundle/tree/1.5.4" }, "funding": [ { @@ -921,20 +874,20 @@ "type": "tidelift" } ], - "time": "2024-11-04T10:15:26+00:00" + "time": "2024-11-27T15:35:25+00:00" }, { "name": "composer/class-map-generator", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783" + "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/98bbf6780e56e0fd2404fe4b82eb665a0f93b783", - "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915", + "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915", "shasum": "" }, "require": { @@ -943,10 +896,10 @@ "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" }, "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", "phpunit/phpunit": "^8", "symfony/filesystem": "^5.4 || ^6" }, @@ -978,7 +931,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.4.0" + "source": "https://github.com/composer/class-map-generator/tree/1.5.0" }, "funding": [ { @@ -994,20 +947,20 @@ "type": "tidelift" } ], - "time": "2024-10-03T18:14:00+00:00" + "time": "2024-11-25T16:11:06+00:00" }, { "name": "composer/composer", - "version": "2.8.2", + "version": "2.8.4", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "6e543d03187c882ea1c6ba43add2467754427803" + "reference": "112e37d1dca22b3fdb81cf3524ab4994f47fdb8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/6e543d03187c882ea1c6ba43add2467754427803", - "reference": "6e543d03187c882ea1c6ba43add2467754427803", + "url": "https://api.github.com/repos/composer/composer/zipball/112e37d1dca22b3fdb81cf3524ab4994f47fdb8c", + "reference": "112e37d1dca22b3fdb81cf3524ab4994f47fdb8c", "shasum": "" }, "require": { @@ -1021,7 +974,7 @@ "justinrainbow/json-schema": "^5.3", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^3.2", + "react/promise": "^2.11 || ^3.2", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", "seld/signal-handler": "^2.0", @@ -1051,13 +1004,13 @@ ], "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.8-dev" - }, "phpstan": { "includes": [ "phpstan/rules.neon" ] + }, + "branch-alias": { + "dev-main": "2.8-dev" } }, "autoload": { @@ -1092,7 +1045,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.8.2" + "source": "https://github.com/composer/composer/tree/2.8.4" }, "funding": [ { @@ -1108,7 +1061,7 @@ "type": "tidelift" } ], - "time": "2024-10-29T15:12:11+00:00" + "time": "2024-12-11T10:57:47+00:00" }, { "name": "composer/metadata-minifier", @@ -1206,13 +1159,13 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - }, "phpstan": { "includes": [ "extension.neon" ] + }, + "branch-alias": { + "dev-main": "3.x-dev" } }, "autoload": { @@ -2132,8 +2085,8 @@ "type": "library", "extra": { "laminas": { - "config-provider": "Laminas\\Diactoros\\ConfigProvider", - "module": "Laminas\\Diactoros" + "module": "Laminas\\Diactoros", + "config-provider": "Laminas\\Diactoros\\ConfigProvider" } }, "autoload": { @@ -2181,16 +2134,16 @@ }, { "name": "monolog/monolog", - "version": "3.8.0", + "version": "3.8.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67" + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/32e515fdc02cdafbe4593e30a9350d486b125b67", - "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", "shasum": "" }, "require": { @@ -2268,7 +2221,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.8.0" + "source": "https://github.com/Seldaek/monolog/tree/3.8.1" }, "funding": [ { @@ -2280,7 +2233,7 @@ "type": "tidelift" } ], - "time": "2024-11-12T13:57:08+00:00" + "time": "2024-12-05T17:15:07+00:00" }, { "name": "mtdowling/jmespath.php", @@ -2460,16 +2413,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.3.1", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", - "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", "shasum": "" }, "require": { @@ -2512,9 +2465,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" }, - "time": "2024-10-08T18:51:32+00:00" + "time": "2024-12-30T11:07:19+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -2703,16 +2656,16 @@ }, { "name": "php-webdriver/webdriver", - "version": "1.15.1", + "version": "1.15.2", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8" + "reference": "998e499b786805568deaf8cbf06f4044f05d91bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/cd52d9342c5aa738c2e75a67e47a1b6df97154e8", - "reference": "cd52d9342c5aa738c2e75a67e47a1b6df97154e8", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/998e499b786805568deaf8cbf06f4044f05d91bf", + "reference": "998e499b786805568deaf8cbf06f4044f05d91bf", "shasum": "" }, "require": { @@ -2734,7 +2687,7 @@ "php-parallel-lint/php-parallel-lint": "^1.2", "phpunit/phpunit": "^9.3", "squizlabs/php_codesniffer": "^3.5", - "symfony/var-dumper": "^5.0 || ^6.0" + "symfony/var-dumper": "^5.0 || ^6.0 || ^7.0" }, "suggest": { "ext-SimpleXML": "For Firefox profile creation" @@ -2763,9 +2716,9 @@ ], "support": { "issues": "https://github.com/php-webdriver/php-webdriver/issues", - "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.1" + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.2" }, - "time": "2023-10-20T12:21:20+00:00" + "time": "2024-11-21T15:12:59+00:00" }, { "name": "phpunit/php-code-coverage", @@ -3090,16 +3043,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.38", + "version": "10.5.40", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "a86773b9e887a67bc53efa9da9ad6e3f2498c132" + "reference": "e6ddda95af52f69c1e0c7b4f977cccb58048798c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a86773b9e887a67bc53efa9da9ad6e3f2498c132", - "reference": "a86773b9e887a67bc53efa9da9ad6e3f2498c132", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e6ddda95af52f69c1e0c7b4f977cccb58048798c", + "reference": "e6ddda95af52f69c1e0c7b4f977cccb58048798c", "shasum": "" }, "require": { @@ -3109,7 +3062,7 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.0", + "myclabs/deep-copy": "^1.12.1", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.1", @@ -3171,7 +3124,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.38" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.40" }, "funding": [ { @@ -3187,7 +3140,7 @@ "type": "tidelift" } ], - "time": "2024-10-28T13:06:21+00:00" + "time": "2024-12-21T05:49:06+00:00" }, { "name": "psr/cache", @@ -3601,16 +3554,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.4", + "version": "v0.12.7", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" + "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", - "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", "shasum": "" }, "require": { @@ -3637,12 +3590,12 @@ ], "type": "library", "extra": { - "branch-alias": { - "dev-main": "0.12.x-dev" - }, "bamarni-bin": { "bin-links": false, "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" } }, "autoload": { @@ -3674,9 +3627,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.7" }, - "time": "2024-06-10T01:18:23+00:00" + "time": "2024-12-10T01:58:33+00:00" }, { "name": "ralouphie/getallheaders", @@ -5149,16 +5102,16 @@ }, { "name": "symfony/console", - "version": "v6.4.14", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "897c2441ed4eec8a8a2c37b943427d24dba3f26b" + "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/897c2441ed4eec8a8a2c37b943427d24dba3f26b", - "reference": "897c2441ed4eec8a8a2c37b943427d24dba3f26b", + "url": "https://api.github.com/repos/symfony/console/zipball/f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", + "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", "shasum": "" }, "require": { @@ -5223,7 +5176,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.14" + "source": "https://github.com/symfony/console/tree/v6.4.15" }, "funding": [ { @@ -5239,20 +5192,20 @@ "type": "tidelift" } ], - "time": "2024-11-05T15:34:40+00:00" + "time": "2024-11-06T14:19:14+00:00" }, { "name": "symfony/css-selector", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66" + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", - "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", "shasum": "" }, "require": { @@ -5288,7 +5241,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.6" + "source": "https://github.com/symfony/css-selector/tree/v7.2.0" }, "funding": [ { @@ -5304,20 +5257,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { @@ -5325,12 +5278,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -5355,7 +5308,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, "funding": [ { @@ -5371,20 +5324,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/dotenv", - "version": "v6.4.13", + "version": "v6.4.16", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "436ae2dd89360fea8c7d5ff3f48ecf523c80bfb4" + "reference": "1ac5e7e7e862d4d574258daf08bd569ba926e4a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/436ae2dd89360fea8c7d5ff3f48ecf523c80bfb4", - "reference": "436ae2dd89360fea8c7d5ff3f48ecf523c80bfb4", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/1ac5e7e7e862d4d574258daf08bd569ba926e4a5", + "reference": "1ac5e7e7e862d4d574258daf08bd569ba926e4a5", "shasum": "" }, "require": { @@ -5429,7 +5382,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.13" + "source": "https://github.com/symfony/dotenv/tree/v6.4.16" }, "funding": [ { @@ -5445,20 +5398,20 @@ "type": "tidelift" } ], - "time": "2024-09-28T07:43:51+00:00" + "time": "2024-11-27T11:08:19+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "87254c78dd50721cfd015b62277a8281c5589702" + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", - "reference": "87254c78dd50721cfd015b62277a8281c5589702", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", "shasum": "" }, "require": { @@ -5509,7 +5462,7 @@ "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/v7.1.6" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" }, "funding": [ { @@ -5525,20 +5478,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", "shasum": "" }, "require": { @@ -5547,12 +5500,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -5585,7 +5538,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" }, "funding": [ { @@ -5601,20 +5554,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/filesystem", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4" + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/c835867b3c62bb05c7fe3d637c871c7ae52024d4", - "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", "shasum": "" }, "require": { @@ -5651,7 +5604,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.1.6" + "source": "https://github.com/symfony/filesystem/tree/v7.2.0" }, "funding": [ { @@ -5667,7 +5620,7 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:11:02+00:00" + "time": "2024-10-25T15:15:23+00:00" }, { "name": "symfony/finder", @@ -5844,8 +5797,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -5920,8 +5873,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -5999,8 +5952,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -6081,8 +6034,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -6165,8 +6118,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -6239,8 +6192,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -6315,8 +6268,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -6395,8 +6348,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -6453,16 +6406,16 @@ }, { "name": "symfony/process", - "version": "v6.4.14", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "25214adbb0996d18112548de20c281be9f27279f" + "reference": "3cb242f059c14ae08591c5c4087d1fe443564392" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/25214adbb0996d18112548de20c281be9f27279f", - "reference": "25214adbb0996d18112548de20c281be9f27279f", + "url": "https://api.github.com/repos/symfony/process/zipball/3cb242f059c14ae08591c5c4087d1fe443564392", + "reference": "3cb242f059c14ae08591c5c4087d1fe443564392", "shasum": "" }, "require": { @@ -6494,7 +6447,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.14" + "source": "https://github.com/symfony/process/tree/v6.4.15" }, "funding": [ { @@ -6510,20 +6463,20 @@ "type": "tidelift" } ], - "time": "2024-11-06T09:25:01+00:00" + "time": "2024-11-06T14:19:14+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", "shasum": "" }, "require": { @@ -6536,12 +6489,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "3.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -6577,7 +6530,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" }, "funding": [ { @@ -6593,24 +6546,24 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/string", - "version": "v6.4.13", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "38371c60c71c72b3d64d8d76f6b1bb81a2cc3627" + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/38371c60c71c72b3d64d8d76f6b1bb81a2cc3627", - "reference": "38371c60c71c72b3d64d8d76f6b1bb81a2cc3627", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", @@ -6620,11 +6573,12 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "symfony/var-exporter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -6663,7 +6617,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.13" + "source": "https://github.com/symfony/string/tree/v7.2.0" }, "funding": [ { @@ -6679,20 +6633,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:18:03+00:00" + "time": "2024-11-13T13:31:26+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.1.7", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "f6ea51f669760cacd7464bf7eaa0be87b8072db1" + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/f6ea51f669760cacd7464bf7eaa0be87b8072db1", - "reference": "f6ea51f669760cacd7464bf7eaa0be87b8072db1", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c", + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c", "shasum": "" }, "require": { @@ -6708,7 +6662,7 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "bin": [ "Resources/bin/var-dump-server" @@ -6746,7 +6700,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.7" + "source": "https://github.com/symfony/var-dumper/tree/v7.2.0" }, "funding": [ { @@ -6762,24 +6716,25 @@ "type": "tidelift" } ], - "time": "2024-11-05T15:34:55+00:00" + "time": "2024-11-08T15:48:14+00:00" }, { "name": "symfony/yaml", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" + "reference": "099581e99f557e9f16b43c5916c26380b54abb22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", - "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22", + "reference": "099581e99f557e9f16b43c5916c26380b54abb22", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -6817,7 +6772,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.6" + "source": "https://github.com/symfony/yaml/tree/v7.2.0" }, "funding": [ { @@ -6833,7 +6788,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-10-23T06:56:12+00:00" }, { "name": "theseer/tokenizer", @@ -6957,7 +6912,6 @@ "type": "library", "extra": { "hooks": { - "pre-commit": "composer check-style", "pre-push": [ "composer test", "appver=$(grep -o -E '[0-9]+\\.[0-9]+\\.[0-9]+(-alpha\\.[0-9]+)?' cghooks)", @@ -6968,7 +6922,8 @@ "sed -i -E \"s/$appver/$tag/\" cghooks", "exit 1", "fi" - ] + ], + "pre-commit": "composer check-style" } }, "autoload": { @@ -7312,16 +7267,16 @@ }, { "name": "symfony/config", - "version": "v7.1.7", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8" + "reference": "bcd3c4adf0144dee5011bb35454728c38adec055" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8", - "reference": "dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8", + "url": "https://api.github.com/repos/symfony/config/zipball/bcd3c4adf0144dee5011bb35454728c38adec055", + "reference": "bcd3c4adf0144dee5011bb35454728c38adec055", "shasum": "" }, "require": { @@ -7367,7 +7322,7 @@ "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/v7.1.7" + "source": "https://github.com/symfony/config/tree/v7.2.0" }, "funding": [ { @@ -7383,20 +7338,20 @@ "type": "tidelift" } ], - "time": "2024-11-04T11:34:07+00:00" + "time": "2024-11-04T11:36:24+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "1f12f9d580ef8dd09e3b756aa111cc2d5f311bfd" + "reference": "a475747af1a1c98272a5471abc35f3da81197c5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/1f12f9d580ef8dd09e3b756aa111cc2d5f311bfd", - "reference": "1f12f9d580ef8dd09e3b756aa111cc2d5f311bfd", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a475747af1a1c98272a5471abc35f3da81197c5d", + "reference": "a475747af1a1c98272a5471abc35f3da81197c5d", "shasum": "" }, "require": { @@ -7447,7 +7402,7 @@ "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/v7.1.6" + "source": "https://github.com/symfony/dependency-injection/tree/v7.2.0" }, "funding": [ { @@ -7463,20 +7418,20 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:11:02+00:00" + "time": "2024-11-25T15:45:00+00:00" }, { "name": "symfony/stopwatch", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05" + "reference": "696f418b0d722a4225e1c3d95489d262971ca924" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8b4a434e6e7faf6adedffb48783a5c75409a1a05", - "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/696f418b0d722a4225e1c3d95489d262971ca924", + "reference": "696f418b0d722a4225e1c3d95489d262971ca924", "shasum": "" }, "require": { @@ -7509,7 +7464,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.1.6" + "source": "https://github.com/symfony/stopwatch/tree/v7.2.0" }, "funding": [ { @@ -7525,20 +7480,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "90173ef89c40e7c8c616653241048705f84130ef" + "reference": "1a6a89f95a46af0f142874c9d650a6358d13070d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/90173ef89c40e7c8c616653241048705f84130ef", - "reference": "90173ef89c40e7c8c616653241048705f84130ef", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1a6a89f95a46af0f142874c9d650a6358d13070d", + "reference": "1a6a89f95a46af0f142874c9d650a6358d13070d", "shasum": "" }, "require": { @@ -7585,7 +7540,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.1.6" + "source": "https://github.com/symfony/var-exporter/tree/v7.2.0" }, "funding": [ { @@ -7601,7 +7556,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-10-18T07:58:17+00:00" } ], "aliases": [], diff --git a/src/Codeception/Module/Sequence.php b/src/Codeception/Module/Sequence.php new file mode 100644 index 000000000..e69de29bb diff --git a/src/Codeception/Util/sq.php b/src/Codeception/Util/sq.php new file mode 100644 index 000000000..e69de29bb diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php new file mode 100644 index 000000000..b3902b121 --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php @@ -0,0 +1,134 @@ +<?php + +declare(strict_types=1); + +namespace Magento\FunctionalTestingFramework\Codeception\Module; + +use Codeception\Module; +use Codeception\Exception\ModuleException; +use Codeception\TestInterface; + +/** + * Sequence solves data cleanup issue in alternative way. + * Instead cleaning up the database between tests, + * you can use generated unique names, that should not conflict. + * When you create article on a site, for instance, you can assign it a unique name and then check it. + * + * This module has no actions, but introduces a function `sq` for generating unique sequences within test and + * `sqs` for generating unique sequences across suite. + * + * ### Usage + * + * Function `sq` generates sequence, the only parameter it takes, is id. + * You can get back to previously generated sequence using that id: + * + * ``` php + * <?php + * sq('post1'); // post1_521fbc63021eb + * sq('post2'); // post2_521fbc6302266 + * sq('post1'); // post1_521fbc63021eb + * ``` + * + * Example: + * + * ``` php + * <?php + * $I->wantTo('create article'); + * $I->click('New Article'); + * $I->fillField('Title', sq('Article')); + * $I->fillField('Body', 'Demo article with Lorem Ipsum'); + * $I->click('save'); + * $I->see(sq('Article') ,'#articles') + * ``` + * + * Populating Database: + * + * ``` php + * <?php + * + * for ($i = 0; $i<10; $i++) { + * $I->haveInDatabase('users', array('login' => sq("user$i"), 'email' => sq("user$i").'@email.com'); + * } + * ``` + * + * Cest Suite tests: + * + * ``` php + * <?php + * class UserTest + * { + * public function createUser(AcceptanceTester $I) + * { + * $I->createUser(sqs('user') . '@mailserver.com', sqs('login'), sqs('pwd')); + * } + * + * public function checkEmail(AcceptanceTester $I) + * { + * $I->seeInEmailTo(sqs('user') . '@mailserver.com', sqs('login')); + * } + * + * public function removeUser(AcceptanceTester $I) + * { + * $I->removeUser(sqs('user') . '@mailserver.com'); + * } + * } + * ``` + * + * ### Config + * + * By default produces unique string with param as a prefix: + * + * ``` + * sq('user') => 'user_876asd8as87a' + * ``` + * + * This behavior can be configured using `prefix` config param. + * + * Old style sequences: + * + * ```yaml + * Sequence: + * prefix: '_' + * ``` + * + * Using id param inside prefix: + * + * ```yaml + * Sequence: + * prefix: '{id}.' + * ``` + */ +class Sequence extends Module +{ + /** + * @var array<int|string,string> + */ + public static array $hash = []; + + /** + * @var array<int|string,string> + */ + public static array $suiteHash = []; + + public static string $prefix = ''; + + /** + * @var array<string, string> + */ + protected array $config = ['prefix' => '{id}_']; + + public function _initialize(): void + { + static::$prefix = $this->config['prefix']; + } + + public function _after(TestInterface $test): void + { + self::$hash = []; + } + + public function _afterSuite(): void + { + self::$suiteHash = []; + } +} \ No newline at end of file diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Util/sq.php b/src/Magento/FunctionalTestingFramework/Codeception/Util/sq.php new file mode 100644 index 000000000..492455135 --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/Codeception/Util/sq.php @@ -0,0 +1,37 @@ +<?php + +declare(strict_types=1); +namespace Magento\FunctionalTestingFramework\Codeception\Util; + + +use Magento\FunctionalTestingFramework\Codeception\Module\Sequence; + +function sq(int|string|null $id = null): string +{ + if ($id && isset(Sequence::$hash[$id])) { + return Sequence::$hash[$id]; + } + + $prefix = str_replace('{id}', (string)$id, Sequence::$prefix); + $sequence = $prefix . uniqid((string)$id); + if ($id) { + Sequence::$hash[$id] = $sequence; + } + + return $sequence; +} + +function sqs(int|string|null $id = null): string +{ + if ($id && isset(Sequence::$suiteHash[$id])) { + return Sequence::$suiteHash[$id]; + } + + $prefix = str_replace('{id}', (string)$id, Sequence::$prefix); + $sequence = $prefix . uniqid((string)$id); + if ($id) { + Sequence::$suiteHash[$id] = $sequence; + } + + return $sequence; +} \ No newline at end of file diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoSequence.php b/src/Magento/FunctionalTestingFramework/Module/MagentoSequence.php index 36c76ab27..02f60c736 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoSequence.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoSequence.php @@ -7,7 +7,7 @@ // @codingStandardsIgnoreFile namespace Magento\FunctionalTestingFramework\Module; -use Codeception\Module\Sequence; +use Magento\FunctionalTestingFramework\Codeception\Module\Sequence; use Codeception\Exception\ModuleException; /** diff --git a/src/Magento/FunctionalTestingFramework/Util/msq.php b/src/Magento/FunctionalTestingFramework/Util/msq.php index 3968e3c82..d2ce54d38 100644 --- a/src/Magento/FunctionalTestingFramework/Util/msq.php +++ b/src/Magento/FunctionalTestingFramework/Util/msq.php @@ -1,28 +1,34 @@ <?php + +declare(strict_types=1); + /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ - + use Magento\FunctionalTestingFramework\Module\MagentoSequence; if (!function_exists('msq')) { /** * Return unique sequence within test. * - * @param null $id - * @return string + * @param int|string|null $id Optional identifier for the sequence. + * @return string The generated unique sequence. */ - function msq($id = null) + function msq(int|string|null $id = null): string { - if ($id and isset(MagentoSequence::$hash[$id])) { + if ($id !== null && isset(MagentoSequence::$hash[$id])) { return MagentoSequence::$hash[$id]; } - $prefix = MagentoSequence::$prefix; - $sequence = $prefix . uniqid(); - if ($id) { - MagentoSequence::$hash[$id] = $sequence; + + $prefix = MagentoSequence::$prefix ?? ''; + $sequence = $prefix . uniqid('', true); // Use true for high-entropy ID + + if ($id !== null) { + MagentoSequence::$hash[$id] = $sequence; // Avoid dynamic properties } + return $sequence; } } @@ -31,19 +37,22 @@ function msq($id = null) /** * Return unique sequence within suite. * - * @param null $id - * @return string + * @param int|string|null $id Optional identifier for the suite sequence. + * @return string The generated unique suite sequence. */ - function msqs($id = null) + function msqs(int|string|null $id = null): string { - if ($id and isset(MagentoSequence::$suiteHash[$id])) { + if ($id !== null && isset(MagentoSequence::$suiteHash[$id])) { return MagentoSequence::$suiteHash[$id]; } - $prefix = MagentoSequence::$prefix; - $sequence = $prefix . uniqid(); - if ($id) { - MagentoSequence::$suiteHash[$id] = $sequence; + + $prefix = MagentoSequence::$prefix ?? ''; + $sequence = $prefix . uniqid('', true); // Use true for high-entropy ID + + if ($id !== null) { + MagentoSequence::$suiteHash[$id] = $sequence; // Avoid dynamic properties } + return $sequence; } } From 6a1c4b671a81372e614fc8f677879413690b1524 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 31 Dec 2024 12:35:49 +0530 Subject: [PATCH 650/674] Delete src/Codeception/Module/Sequence.php --- src/Codeception/Module/Sequence.php | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/Codeception/Module/Sequence.php diff --git a/src/Codeception/Module/Sequence.php b/src/Codeception/Module/Sequence.php deleted file mode 100644 index e69de29bb..000000000 From 60d36787b823c340995a74efa594e532c999750a Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Tue, 31 Dec 2024 12:36:11 +0530 Subject: [PATCH 651/674] Delete src/Codeception/Util/sq.php --- src/Codeception/Util/sq.php | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/Codeception/Util/sq.php diff --git a/src/Codeception/Util/sq.php b/src/Codeception/Util/sq.php deleted file mode 100644 index e69de29bb..000000000 From 4ff89c9c84027622505cafbe429cfd9bef605f82 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Thu, 2 Jan 2025 13:22:10 +0530 Subject: [PATCH 652/674] Update composer.json --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 77969fd3b..66468cafe 100755 --- a/composer.json +++ b/composer.json @@ -72,3 +72,4 @@ }, "bin": ["bin/mftf"] } + From fc97172c75df3d55c19b030f055c94039cfa1fb1 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:34:37 +0530 Subject: [PATCH 653/674] Update msq.php --- .../FunctionalTestingFramework/Util/msq.php | 43 ++++++++----------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/msq.php b/src/Magento/FunctionalTestingFramework/Util/msq.php index d2ce54d38..b6e8731d8 100644 --- a/src/Magento/FunctionalTestingFramework/Util/msq.php +++ b/src/Magento/FunctionalTestingFramework/Util/msq.php @@ -1,34 +1,28 @@ <?php - -declare(strict_types=1); - /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ - + use Magento\FunctionalTestingFramework\Module\MagentoSequence; if (!function_exists('msq')) { /** * Return unique sequence within test. * - * @param int|string|null $id Optional identifier for the sequence. - * @return string The generated unique sequence. + * @param null $id + * @return string */ - function msq(int|string|null $id = null): string + function msq(int|string|null $id = null) { - if ($id !== null && isset(MagentoSequence::$hash[$id])) { + if ($id and isset(MagentoSequence::$hash[$id])) { return MagentoSequence::$hash[$id]; } - - $prefix = MagentoSequence::$prefix ?? ''; - $sequence = $prefix . uniqid('', true); // Use true for high-entropy ID - - if ($id !== null) { - MagentoSequence::$hash[$id] = $sequence; // Avoid dynamic properties + $prefix = MagentoSequence::$prefix; + $sequence = $prefix . uniqid(); + if ($id) { + MagentoSequence::$hash[$id] = $sequence; } - return $sequence; } } @@ -37,22 +31,19 @@ function msq(int|string|null $id = null): string /** * Return unique sequence within suite. * - * @param int|string|null $id Optional identifier for the suite sequence. - * @return string The generated unique suite sequence. + * @param null $id + * @return string */ - function msqs(int|string|null $id = null): string + function msqs(int|string|null $id = null) { - if ($id !== null && isset(MagentoSequence::$suiteHash[$id])) { + if ($id and isset(MagentoSequence::$suiteHash[$id])) { return MagentoSequence::$suiteHash[$id]; } - - $prefix = MagentoSequence::$prefix ?? ''; - $sequence = $prefix . uniqid('', true); // Use true for high-entropy ID - - if ($id !== null) { - MagentoSequence::$suiteHash[$id] = $sequence; // Avoid dynamic properties + $prefix = MagentoSequence::$prefix; + $sequence = $prefix . uniqid(); + if ($id) { + MagentoSequence::$suiteHash[$id] = $sequence; } - return $sequence; } } From 61a797ddab931ecc28fe6a5e37c5555b10db015c Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 6 Jan 2025 15:22:19 +0530 Subject: [PATCH 654/674] Update Sequence.php --- .../Codeception/Module/Sequence.php | 92 +------------------ 1 file changed, 1 insertion(+), 91 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php index b3902b121..234679a16 100644 --- a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php +++ b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php @@ -8,96 +8,6 @@ use Codeception\Exception\ModuleException; use Codeception\TestInterface; -/** - * Sequence solves data cleanup issue in alternative way. - * Instead cleaning up the database between tests, - * you can use generated unique names, that should not conflict. - * When you create article on a site, for instance, you can assign it a unique name and then check it. - * - * This module has no actions, but introduces a function `sq` for generating unique sequences within test and - * `sqs` for generating unique sequences across suite. - * - * ### Usage - * - * Function `sq` generates sequence, the only parameter it takes, is id. - * You can get back to previously generated sequence using that id: - * - * ``` php - * <?php - * sq('post1'); // post1_521fbc63021eb - * sq('post2'); // post2_521fbc6302266 - * sq('post1'); // post1_521fbc63021eb - * ``` - * - * Example: - * - * ``` php - * <?php - * $I->wantTo('create article'); - * $I->click('New Article'); - * $I->fillField('Title', sq('Article')); - * $I->fillField('Body', 'Demo article with Lorem Ipsum'); - * $I->click('save'); - * $I->see(sq('Article') ,'#articles') - * ``` - * - * Populating Database: - * - * ``` php - * <?php - * - * for ($i = 0; $i<10; $i++) { - * $I->haveInDatabase('users', array('login' => sq("user$i"), 'email' => sq("user$i").'@email.com'); - * } - * ``` - * - * Cest Suite tests: - * - * ``` php - * <?php - * class UserTest - * { - * public function createUser(AcceptanceTester $I) - * { - * $I->createUser(sqs('user') . '@mailserver.com', sqs('login'), sqs('pwd')); - * } - * - * public function checkEmail(AcceptanceTester $I) - * { - * $I->seeInEmailTo(sqs('user') . '@mailserver.com', sqs('login')); - * } - * - * public function removeUser(AcceptanceTester $I) - * { - * $I->removeUser(sqs('user') . '@mailserver.com'); - * } - * } - * ``` - * - * ### Config - * - * By default produces unique string with param as a prefix: - * - * ``` - * sq('user') => 'user_876asd8as87a' - * ``` - * - * This behavior can be configured using `prefix` config param. - * - * Old style sequences: - * - * ```yaml - * Sequence: - * prefix: '_' - * ``` - * - * Using id param inside prefix: - * - * ```yaml - * Sequence: - * prefix: '{id}.' - * ``` - */ class Sequence extends Module { /** @@ -131,4 +41,4 @@ public function _afterSuite(): void { self::$suiteHash = []; } -} \ No newline at end of file +} From 06239472a6b44df88ed5528981b0a7756e9b3df7 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 6 Jan 2025 15:46:00 +0530 Subject: [PATCH 655/674] Delete src/Magento/FunctionalTestingFramework/Codeception/Util/sq.php --- .../Codeception/Util/sq.php | 37 ------------------- 1 file changed, 37 deletions(-) delete mode 100644 src/Magento/FunctionalTestingFramework/Codeception/Util/sq.php diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Util/sq.php b/src/Magento/FunctionalTestingFramework/Codeception/Util/sq.php deleted file mode 100644 index 492455135..000000000 --- a/src/Magento/FunctionalTestingFramework/Codeception/Util/sq.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -declare(strict_types=1); -namespace Magento\FunctionalTestingFramework\Codeception\Util; - - -use Magento\FunctionalTestingFramework\Codeception\Module\Sequence; - -function sq(int|string|null $id = null): string -{ - if ($id && isset(Sequence::$hash[$id])) { - return Sequence::$hash[$id]; - } - - $prefix = str_replace('{id}', (string)$id, Sequence::$prefix); - $sequence = $prefix . uniqid((string)$id); - if ($id) { - Sequence::$hash[$id] = $sequence; - } - - return $sequence; -} - -function sqs(int|string|null $id = null): string -{ - if ($id && isset(Sequence::$suiteHash[$id])) { - return Sequence::$suiteHash[$id]; - } - - $prefix = str_replace('{id}', (string)$id, Sequence::$prefix); - $sequence = $prefix . uniqid((string)$id); - if ($id) { - Sequence::$suiteHash[$id] = $sequence; - } - - return $sequence; -} \ No newline at end of file From cbc8530e9f983b02526dc3183e01d02241833da5 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 6 Jan 2025 21:24:18 +0530 Subject: [PATCH 656/674] Update msq.php --- src/Magento/FunctionalTestingFramework/Util/msq.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/msq.php b/src/Magento/FunctionalTestingFramework/Util/msq.php index b6e8731d8..4bdbe2676 100644 --- a/src/Magento/FunctionalTestingFramework/Util/msq.php +++ b/src/Magento/FunctionalTestingFramework/Util/msq.php @@ -13,7 +13,7 @@ * @param null $id * @return string */ - function msq(int|string|null $id = null) + function msq(?int|string|null $id = null) { if ($id and isset(MagentoSequence::$hash[$id])) { return MagentoSequence::$hash[$id]; @@ -34,7 +34,7 @@ function msq(int|string|null $id = null) * @param null $id * @return string */ - function msqs(int|string|null $id = null) + function msqs(?int|string|null $id = null) { if ($id and isset(MagentoSequence::$suiteHash[$id])) { return MagentoSequence::$suiteHash[$id]; From bdc0dd3401c8809603589c267702a6b5acd3b7d7 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 6 Jan 2025 21:35:49 +0530 Subject: [PATCH 657/674] Update msq.php --- src/Magento/FunctionalTestingFramework/Util/msq.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/msq.php b/src/Magento/FunctionalTestingFramework/Util/msq.php index 4bdbe2676..06bc35f66 100644 --- a/src/Magento/FunctionalTestingFramework/Util/msq.php +++ b/src/Magento/FunctionalTestingFramework/Util/msq.php @@ -13,7 +13,7 @@ * @param null $id * @return string */ - function msq(?int|string|null $id = null) + function msq(?int|string $id = null) { if ($id and isset(MagentoSequence::$hash[$id])) { return MagentoSequence::$hash[$id]; @@ -34,7 +34,7 @@ function msq(?int|string|null $id = null) * @param null $id * @return string */ - function msqs(?int|string|null $id = null) + function msqs(?int|string $id = null) { if ($id and isset(MagentoSequence::$suiteHash[$id])) { return MagentoSequence::$suiteHash[$id]; From 4dd346495e488fe35e99c627edc25d56012e8a73 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 6 Jan 2025 21:40:47 +0530 Subject: [PATCH 658/674] Update msq.php --- src/Magento/FunctionalTestingFramework/Util/msq.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Util/msq.php b/src/Magento/FunctionalTestingFramework/Util/msq.php index 06bc35f66..b6f03ae6c 100644 --- a/src/Magento/FunctionalTestingFramework/Util/msq.php +++ b/src/Magento/FunctionalTestingFramework/Util/msq.php @@ -13,7 +13,7 @@ * @param null $id * @return string */ - function msq(?int|string $id = null) + function msq(?string $id = null) { if ($id and isset(MagentoSequence::$hash[$id])) { return MagentoSequence::$hash[$id]; @@ -34,7 +34,7 @@ function msq(?int|string $id = null) * @param null $id * @return string */ - function msqs(?int|string $id = null) + function msqs(?string $id = null) { if ($id and isset(MagentoSequence::$suiteHash[$id])) { return MagentoSequence::$suiteHash[$id]; From a87917f0e520f2d645612297002c9ebb607f060e Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Mon, 6 Jan 2025 23:01:47 +0530 Subject: [PATCH 659/674] Fix static check errors --- .../Commenting/FunctionCommentSniff.php | 2 +- .../Codeception/Module/Sequence.php | 23 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/dev/tests/static/Magento/Sniffs/Commenting/FunctionCommentSniff.php b/dev/tests/static/Magento/Sniffs/Commenting/FunctionCommentSniff.php index 09b330ccf..5e539aeaf 100644 --- a/dev/tests/static/Magento/Sniffs/Commenting/FunctionCommentSniff.php +++ b/dev/tests/static/Magento/Sniffs/Commenting/FunctionCommentSniff.php @@ -422,7 +422,7 @@ protected function processParams(File $phpcsFile, $stackPtr, $commentStart) $typeHint, $param['var'], ); - if(ltrim($typeHint, '?') !== $suggestedTypeHint) { + if ($suggestedTypeHint != "null" && (ltrim($typeHint, '?') !== $suggestedTypeHint)) { $phpcsFile->addError($error, $stackPtr, 'IncorrectTypeHint', $data); } }//end if diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php index 234679a16..bf8e4fe74 100644 --- a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php +++ b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php @@ -13,30 +13,45 @@ class Sequence extends Module /** * @var array<int|string,string> */ - public static array $hash = []; + public static array $hash = [];// phpcs:ignore /** * @var array<int|string,string> */ - public static array $suiteHash = []; + public static array $suiteHash = [];// phpcs:ignore - public static string $prefix = ''; + /** + * @var string + */ + public static string $prefix = '';// phpcs:ignore /** * @var array<string, string> */ - protected array $config = ['prefix' => '{id}_']; + protected array $config = ['prefix' => '{id}_'];// phpcs:ignore + /** + * Initialise method + * @return void + */ public function _initialize(): void { static::$prefix = $this->config['prefix']; } + /** + * after method + * @return void + */ public function _after(TestInterface $test): void { self::$hash = []; } + /** + * after suite method + * @return void + */ public function _afterSuite(): void { self::$suiteHash = []; From 5366534c5111688eddd9c56506ade729a9307cee Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Mon, 6 Jan 2025 23:05:31 +0530 Subject: [PATCH 660/674] Fix static check errors --- .../FunctionalTestingFramework/Codeception/Module/Sequence.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php index bf8e4fe74..6c7c88d97 100644 --- a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php +++ b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php @@ -40,6 +40,7 @@ public function _initialize(): void } /** + * @phpcs:ignore * after method * @return void */ From 5dde652d4ca1464a877a1f7de495e67e9e96e22d Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Mon, 6 Jan 2025 23:07:50 +0530 Subject: [PATCH 661/674] Fixed static check error --- .../FunctionalTestingFramework/Codeception/Module/Sequence.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php index 6c7c88d97..bf0ecedcf 100644 --- a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php +++ b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php @@ -40,7 +40,7 @@ public function _initialize(): void } /** - * @phpcs:ignore + * @SuppressWarnings(PHPMD.UnusedFormalParameter) * after method * @return void */ From 2fbf68cfc576f478e414d831d0eb7815a0774416 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Mon, 6 Jan 2025 23:09:55 +0530 Subject: [PATCH 662/674] Fixed static check error --- .../Codeception/Module/Sequence.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php index bf0ecedcf..96c82f164 100644 --- a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php +++ b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php @@ -1,4 +1,8 @@ <?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ declare(strict_types=1); From 8ad9bad091893a42ca6a3407776569d6799c46a3 Mon Sep 17 00:00:00 2001 From: Kevin Kozan <kkozan@magento.com> Date: Mon, 6 Jan 2025 12:36:20 -0600 Subject: [PATCH 663/674] Added Comment Block - Explaining class can be removed if 8.4 compatibility is updated --- .../Codeception/Module/Sequence.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php index 96c82f164..a7d763cfc 100644 --- a/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php +++ b/src/Magento/FunctionalTestingFramework/Codeception/Module/Sequence.php @@ -12,6 +12,11 @@ use Codeception\Exception\ModuleException; use Codeception\TestInterface; +/** + * Class Sequence + * Implemented here as a replacement for codeception/module-sequence due to PHP 8.4 deprecation errors. + * This class can be removed when PHP 8.4 compatibility is updated in codeception/module-sequence. + */ class Sequence extends Module { /** From 6ec4dfbe19bd0c46d460b3d4fcefdf2079f9c751 Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Tue, 7 Jan 2025 08:03:51 +0530 Subject: [PATCH 664/674] MFTF 5.0.0 release --- CHANGELOG.md | 1 + composer.lock | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63a3daf6c..63c6bc030 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Magento Functional Testing Framework Changelog * Provided support for PHP 8.4 * Dropped the support for PHP 8.1 * Removed unwanted dependent packages +* Removed the dependency of codeception/module-sequence and implemented internal adjustments to address PHP 8.4 deprecations. 4.8.3 --------- diff --git a/composer.lock b/composer.lock index 2799a5858..ec1a25272 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": "358c40222c9d8cc40ba6d26bfd485c5e", + "content-hash": "4092635850a3aa7f59f696051ba82151", "packages": [ { "name": "allure-framework/allure-codeception", @@ -7561,7 +7561,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -7573,6 +7573,6 @@ "ext-openssl": "*", "php": ">=8.2" }, - "platform-dev": {}, + "platform-dev": [], "plugin-api-version": "2.6.0" } From 29ee2e2c692a61108153465772ab95b683454af5 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Wed, 8 Jan 2025 12:09:16 +0530 Subject: [PATCH 665/674] ACQE-7425: Unable to Read .credentials Values in Page Builder Module Added more tags in the allow list to reger secret data --- .../FunctionalTestingFramework/Test/Util/ActionMergeUtil.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php b/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php index a601deb24..04f4ba1d5 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php +++ b/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php @@ -26,7 +26,7 @@ class ActionMergeUtil const DEFAULT_SKIP_ON_ORDER = 'before'; const DEFAULT_SKIP_OFF_ORDER = 'after'; const DEFAULT_WAIT_ORDER = 'after'; - const APPROVED_ACTIONS = ['fillField', 'magentoCLI', 'field']; + const APPROVED_ACTIONS = ['fillField', 'magentoCLI', 'field', 'waitForElement', 'seeInField']; const SECRET_MAPPING = ['fillField' => 'fillSecretField', 'magentoCLI' => 'magentoCLISecret']; const CREDS_REGEX = "/{{_CREDS\.([\w|\/]+)}}/"; From 26cdbe7e9af92d583f7a08b384eba81671801d20 Mon Sep 17 00:00:00 2001 From: mohit-adobe <84013331+mohit-adobe@users.noreply.github.com> Date: Fri, 10 Jan 2025 10:20:57 +0530 Subject: [PATCH 666/674] Revert "ACQE-7278: Add support for chrome 131" --- 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 25cad8342..cacc6836f 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -38,4 +38,4 @@ modules: capabilities: unhandledPromptBehavior: "ignore" chromeOptions: - args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad"] + args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--ignore-certificate-errors", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad"] From 02d5e82fd85fc65b89fd2b430f82f3bb65bf3d27 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Thu, 6 Feb 2025 17:13:49 +0530 Subject: [PATCH 667/674] ACQE-7537: MFTF Components Upgrade --- composer.lock | 186 +++++++++++++++++++++++++------------------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/composer.lock b/composer.lock index 76eb7e056..40c23e003 100644 --- a/composer.lock +++ b/composer.lock @@ -199,16 +199,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.336.6", + "version": "3.339.7", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "0a99dab427f0a1c082775301141aeac3558691ad" + "reference": "7b7e48ce7970c0416c5fda045df7b93948fbf643" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0a99dab427f0a1c082775301141aeac3558691ad", - "reference": "0a99dab427f0a1c082775301141aeac3558691ad", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/7b7e48ce7970c0416c5fda045df7b93948fbf643", + "reference": "7b7e48ce7970c0416c5fda045df7b93948fbf643", "shasum": "" }, "require": { @@ -216,31 +216,31 @@ "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", - "mtdowling/jmespath.php": "^2.6", - "php": ">=7.2.5", - "psr/http-message": "^1.0 || ^2.0" + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/promises": "^2.0", + "guzzlehttp/psr7": "^2.4.5", + "mtdowling/jmespath.php": "^2.8.0", + "php": ">=8.1", + "psr/http-message": "^2.0" }, "require-dev": { "andrewsville/php-token-reflection": "^1.4", "aws/aws-php-sns-message-validator": "~1.0", "behat/behat": "~3.0", - "composer/composer": "^1.10.22", + "composer/composer": "^2.7.8", "dms/phpunit-arraysubset-asserts": "^0.4.0", "doctrine/cache": "~1.4", "ext-dom": "*", "ext-openssl": "*", "ext-pcntl": "*", "ext-sockets": "*", - "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "psr/simple-cache": "^1.0 || ^2.0 || ^3.0", - "sebastian/comparator": "^1.2.3 || ^4.0", - "yoast/phpunit-polyfills": "^1.0" + "psr/cache": "^2.0 || ^3.0", + "psr/simple-cache": "^2.0 || ^3.0", + "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0", + "symfony/filesystem": "^v6.4.0 || ^v7.1.0", + "yoast/phpunit-polyfills": "^2.0" }, "suggest": { "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", @@ -289,11 +289,11 @@ "sdk" ], "support": { - "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", + "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.336.6" + "source": "https://github.com/aws/aws-sdk-php/tree/3.339.7" }, - "time": "2024-12-28T04:16:13+00:00" + "time": "2025-02-05T19:06:15+00:00" }, { "name": "behat/gherkin", @@ -802,16 +802,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.4", + "version": "1.5.5", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1" + "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/bc0593537a463e55cadf45fd938d23b75095b7e1", - "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/08c50d5ec4c6ced7d0271d2862dec8c1033283e6", + "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6", "shasum": "" }, "require": { @@ -858,7 +858,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.4" + "source": "https://github.com/composer/ca-bundle/tree/1.5.5" }, "funding": [ { @@ -874,20 +874,20 @@ "type": "tidelift" } ], - "time": "2024-11-27T15:35:25+00:00" + "time": "2025-01-08T16:17:16+00:00" }, { "name": "composer/class-map-generator", - "version": "1.5.0", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915" + "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915", - "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ffe442c5974c44a9343e37a0abcb1cc37319f5b9", + "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9", "shasum": "" }, "require": { @@ -931,7 +931,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.5.0" + "source": "https://github.com/composer/class-map-generator/tree/1.6.0" }, "funding": [ { @@ -947,20 +947,20 @@ "type": "tidelift" } ], - "time": "2024-11-25T16:11:06+00:00" + "time": "2025-02-05T10:05:34+00:00" }, { "name": "composer/composer", - "version": "2.8.4", + "version": "2.8.5", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "112e37d1dca22b3fdb81cf3524ab4994f47fdb8c" + "reference": "ae208dc1e182bd45d99fcecb956501da212454a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/112e37d1dca22b3fdb81cf3524ab4994f47fdb8c", - "reference": "112e37d1dca22b3fdb81cf3524ab4994f47fdb8c", + "url": "https://api.github.com/repos/composer/composer/zipball/ae208dc1e182bd45d99fcecb956501da212454a1", + "reference": "ae208dc1e182bd45d99fcecb956501da212454a1", "shasum": "" }, "require": { @@ -1045,7 +1045,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.8.4" + "source": "https://github.com/composer/composer/tree/2.8.5" }, "funding": [ { @@ -1061,7 +1061,7 @@ "type": "tidelift" } ], - "time": "2024-12-11T10:57:47+00:00" + "time": "2025-01-21T14:23:40+00:00" }, { "name": "composer/metadata-minifier", @@ -3043,16 +3043,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.40", + "version": "10.5.44", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e6ddda95af52f69c1e0c7b4f977cccb58048798c" + "reference": "1381c62769be4bb88fa4c5aec1366c7c66ca4f36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e6ddda95af52f69c1e0c7b4f977cccb58048798c", - "reference": "e6ddda95af52f69c1e0c7b4f977cccb58048798c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1381c62769be4bb88fa4c5aec1366c7c66ca4f36", + "reference": "1381c62769be4bb88fa4c5aec1366c7c66ca4f36", "shasum": "" }, "require": { @@ -3124,7 +3124,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.40" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.44" }, "funding": [ { @@ -3140,7 +3140,7 @@ "type": "tidelift" } ], - "time": "2024-12-21T05:49:06+00:00" + "time": "2025-01-31T07:00:38+00:00" }, { "name": "psr/cache", @@ -5102,16 +5102,16 @@ }, { "name": "symfony/console", - "version": "v6.4.15", + "version": "v6.4.17", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd" + "reference": "799445db3f15768ecc382ac5699e6da0520a0a04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", - "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", + "url": "https://api.github.com/repos/symfony/console/zipball/799445db3f15768ecc382ac5699e6da0520a0a04", + "reference": "799445db3f15768ecc382ac5699e6da0520a0a04", "shasum": "" }, "require": { @@ -5176,7 +5176,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.15" + "source": "https://github.com/symfony/console/tree/v6.4.17" }, "funding": [ { @@ -5192,7 +5192,7 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:19:14+00:00" + "time": "2024-12-07T12:07:30+00:00" }, { "name": "symfony/css-selector", @@ -5624,16 +5624,16 @@ }, { "name": "symfony/finder", - "version": "v6.4.13", + "version": "v6.4.17", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958" + "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/daea9eca0b08d0ed1dc9ab702a46128fd1be4958", - "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "url": "https://api.github.com/repos/symfony/finder/zipball/1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7", + "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7", "shasum": "" }, "require": { @@ -5668,7 +5668,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.13" + "source": "https://github.com/symfony/finder/tree/v6.4.17" }, "funding": [ { @@ -5684,20 +5684,20 @@ "type": "tidelift" } ], - "time": "2024-10-01T08:30:56+00:00" + "time": "2024-12-29T13:51:37+00:00" }, { "name": "symfony/mime", - "version": "v6.4.13", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855" + "reference": "917d77981eb1ea963608d5cda4d9c0cf72eaa68e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855", - "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "url": "https://api.github.com/repos/symfony/mime/zipball/917d77981eb1ea963608d5cda4d9c0cf72eaa68e", + "reference": "917d77981eb1ea963608d5cda4d9c0cf72eaa68e", "shasum": "" }, "require": { @@ -5753,7 +5753,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.13" + "source": "https://github.com/symfony/mime/tree/v6.4.18" }, "funding": [ { @@ -5769,7 +5769,7 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:07:50+00:00" + "time": "2025-01-23T13:10:52+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6637,16 +6637,16 @@ }, { "name": "symfony/var-dumper", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c" + "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c", - "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", + "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", "shasum": "" }, "require": { @@ -6700,7 +6700,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.0" + "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" }, "funding": [ { @@ -6716,20 +6716,20 @@ "type": "tidelift" } ], - "time": "2024-11-08T15:48:14+00:00" + "time": "2025-01-17T11:39:41+00:00" }, { "name": "symfony/yaml", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "099581e99f557e9f16b43c5916c26380b54abb22" + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22", - "reference": "099581e99f557e9f16b43c5916c26380b54abb22", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ac238f173df0c9c1120f862d0f599e17535a87ec", + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec", "shasum": "" }, "require": { @@ -6772,7 +6772,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.0" + "source": "https://github.com/symfony/yaml/tree/v7.2.3" }, "funding": [ { @@ -6788,7 +6788,7 @@ "type": "tidelift" } ], - "time": "2024-10-23T06:56:12+00:00" + "time": "2025-01-07T12:55:42+00:00" }, { "name": "theseer/tokenizer", @@ -7267,16 +7267,16 @@ }, { "name": "symfony/config", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "bcd3c4adf0144dee5011bb35454728c38adec055" + "reference": "7716594aaae91d9141be080240172a92ecca4d44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/bcd3c4adf0144dee5011bb35454728c38adec055", - "reference": "bcd3c4adf0144dee5011bb35454728c38adec055", + "url": "https://api.github.com/repos/symfony/config/zipball/7716594aaae91d9141be080240172a92ecca4d44", + "reference": "7716594aaae91d9141be080240172a92ecca4d44", "shasum": "" }, "require": { @@ -7322,7 +7322,7 @@ "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/v7.2.0" + "source": "https://github.com/symfony/config/tree/v7.2.3" }, "funding": [ { @@ -7338,20 +7338,20 @@ "type": "tidelift" } ], - "time": "2024-11-04T11:36:24+00:00" + "time": "2025-01-22T12:07:01+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "a475747af1a1c98272a5471abc35f3da81197c5d" + "reference": "1d321c4bc3fe926fd4c38999a4c9af4f5d61ddfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a475747af1a1c98272a5471abc35f3da81197c5d", - "reference": "a475747af1a1c98272a5471abc35f3da81197c5d", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/1d321c4bc3fe926fd4c38999a4c9af4f5d61ddfc", + "reference": "1d321c4bc3fe926fd4c38999a4c9af4f5d61ddfc", "shasum": "" }, "require": { @@ -7402,7 +7402,7 @@ "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/v7.2.0" + "source": "https://github.com/symfony/dependency-injection/tree/v7.2.3" }, "funding": [ { @@ -7418,20 +7418,20 @@ "type": "tidelift" } ], - "time": "2024-11-25T15:45:00+00:00" + "time": "2025-01-17T10:56:55+00:00" }, { "name": "symfony/stopwatch", - "version": "v7.2.0", + "version": "v7.2.2", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "696f418b0d722a4225e1c3d95489d262971ca924" + "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/696f418b0d722a4225e1c3d95489d262971ca924", - "reference": "696f418b0d722a4225e1c3d95489d262971ca924", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e46690d5b9d7164a6d061cab1e8d46141b9f49df", + "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df", "shasum": "" }, "require": { @@ -7464,7 +7464,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.2.0" + "source": "https://github.com/symfony/stopwatch/tree/v7.2.2" }, "funding": [ { @@ -7480,7 +7480,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-12-18T14:28:33+00:00" }, { "name": "symfony/var-exporter", @@ -7561,7 +7561,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -7573,6 +7573,6 @@ "ext-openssl": "*", "php": ">=8.2" }, - "platform-dev": [], + "platform-dev": {}, "plugin-api-version": "2.6.0" } From 2c694a1e77a4f83bd287bf83b2ad5be3fb49f983 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Thu, 6 Feb 2025 17:17:35 +0530 Subject: [PATCH 668/674] ACQE-7537: Reverting unwanted file change --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index 62d9205b8..f0ea832cb 100755 --- a/composer.json +++ b/composer.json @@ -71,4 +71,3 @@ }, "bin": ["bin/mftf"] } - From b33bdaacae1985889e5b39ae299744328a19a0d2 Mon Sep 17 00:00:00 2001 From: manjusha729 <93243302+manjusha729@users.noreply.github.com> Date: Mon, 24 Feb 2025 12:43:23 +0530 Subject: [PATCH 669/674] Update functional.suite.dist.yml --- 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 cacc6836f..25cad8342 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -38,4 +38,4 @@ modules: capabilities: unhandledPromptBehavior: "ignore" chromeOptions: - args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--ignore-certificate-errors", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad"] + args: ["--no-sandbox", "--window-size=1920,1080", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough", "--disable-dev-shm-usage", "--disable-component-update", "--disable-features=OptimizationHints","--disable-background-networking","--disable-domain-reliability","--disable-breakpad"] From 2bbddda5ce560f3cf001330034a58c541793a485 Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Wed, 26 Feb 2025 13:08:37 +0530 Subject: [PATCH 670/674] ACQE-7425: Unable to Read .credentials Values in Page Builder Module Added allowed types and test cases --- .../Test/Util/ActionMergeUtilTest.php | 29 ++++++++++++++++++- .../Resources/BasicFunctionalTest.txt | 1 + .../BasicFunctionalTest.xml | 1 + .../Module/MagentoWebDriver.php | 21 ++++++++++++++ .../Test/Util/ActionMergeUtil.php | 7 +++-- .../Util/TestGenerator.php | 1 + 6 files changed, 56 insertions(+), 4 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php index e388d176c..8604db683 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php @@ -284,7 +284,7 @@ public function testInvalidSecretFunctions(): void { $this->expectException(TestReferenceException::class); $this->expectExceptionMessage( - 'You cannot reference secret data outside of the fillField, magentoCLI and createData actions' + 'You cannot reference secret data outside of the fillField, magentoCLI, seeInField and createData actions' ); $actionObjectOne = new ActionObject( @@ -307,4 +307,31 @@ public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } + + /** + * Verify that a <seeInField> action is replaced by <seeInSecretField> when secret _CREDS are referenced. + * + * @return void + * @throws TestReferenceException + * @throws XmlException + */ + public function testValidSeeInSecretFieldFunction(): void + { + $actionObjectOne = new ActionObject( + 'actionKey1', + 'seeInField', + ['userInput' => '{{_CREDS.username}}', 'requiredCredentials' => 'username'] + ); + $actionObject = [$actionObjectOne]; + + $actionMergeUtil = new ActionMergeUtil('actionMergeUtilTest', 'TestCase'); + $result = $actionMergeUtil->resolveActionSteps($actionObject); + + $expectedValue = new ActionObject( + 'actionKey1', + 'seeInSecretField', + ['userInput' => '{{_CREDS.username}}','requiredCredentials' => 'username'] + ); + $this->assertEquals($expectedValue, $result['actionKey1']); + } } diff --git a/dev/tests/verification/Resources/BasicFunctionalTest.txt b/dev/tests/verification/Resources/BasicFunctionalTest.txt index d4631b706..5016fba93 100644 --- a/dev/tests/verification/Resources/BasicFunctionalTest.txt +++ b/dev/tests/verification/Resources/BasicFunctionalTest.txt @@ -170,6 +170,7 @@ class BasicFunctionalTestCest $I->seeElementInDOM(".functionalTestSelector"); // stepKey: seeElementInDOMKey1 $I->seeInCurrentUrl("/functionalUrl"); // stepKey: seeInCurrentUrlKey1 $I->seeInField(".functionalTestSelector", "someInput"); // stepKey: seeInFieldKey1 + $I->seeInSecretField(".functionalTestSelector", $I->getSecret("someKey")); // stepKey: seeInFieldKey2 $I->seeInPageSource("Home Page"); // stepKey: seeInPageSourceKey1 $I->seeInPageSource("<h1 class=\"page-title\">"); // stepKey: seeInPageSourceKey2 $I->seeInPopup("someInput"); // stepKey: seeInPopupKey1 diff --git a/dev/tests/verification/TestModule/Test/BasicFunctionalTest/BasicFunctionalTest.xml b/dev/tests/verification/TestModule/Test/BasicFunctionalTest/BasicFunctionalTest.xml index fa2b5e247..e0196f3ab 100644 --- a/dev/tests/verification/TestModule/Test/BasicFunctionalTest/BasicFunctionalTest.xml +++ b/dev/tests/verification/TestModule/Test/BasicFunctionalTest/BasicFunctionalTest.xml @@ -108,6 +108,7 @@ <seeElementInDOM selector=".functionalTestSelector" stepKey="seeElementInDOMKey1"/> <seeInCurrentUrl url="/functionalUrl" stepKey="seeInCurrentUrlKey1"/> <seeInField selector=".functionalTestSelector" userInput="someInput" stepKey="seeInFieldKey1" /> + <seeInField selector=".functionalTestSelector" userInput="{{_CREDS.someKey}}" stepKey="seeInFieldKey2" /> <seeInPageSource html="Home Page" stepKey="seeInPageSourceKey1"/> <seeInPageSource html="<h1 class="page-title">" stepKey="seeInPageSourceKey2"/> <seeInPopup userInput="someInput" stepKey="seeInPopupKey1"/> diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 057876659..e7350f5b9 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -864,6 +864,27 @@ public function magentoCLISecret($command, $timeout = null, $arguments = null) return $this->magentoCLI($decryptedCommand, $timeout, $arguments); } + /** + * Function used to verify sensitive credentials in the data, data is decrypted immediately prior to see to avoid + * exposure in console or log. + * + * @param string $field + * @param string $value + * @return void + * @throws TestFrameworkException + */ + public function seeInSecretField(string $field, string $value):void + { + // to protect any secrets from being printed to console the values are executed only at the webdriver level as a + // decrypted value + + $decryptedValue = CredentialStore::getInstance()->decryptSecretValue($value); + if ($decryptedValue === false) { + throw new TestFrameworkException("\nFailed to decrypt value {$value} for field {$field}\n"); + } + $this->seeInField($field, $decryptedValue); + } + /** * Override for _failed method in Codeception method. Adds png and html attachments to allure report * following parent execution of test failure processing. diff --git a/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php b/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php index 04f4ba1d5..acc1cce16 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php +++ b/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php @@ -26,8 +26,9 @@ class ActionMergeUtil const DEFAULT_SKIP_ON_ORDER = 'before'; const DEFAULT_SKIP_OFF_ORDER = 'after'; const DEFAULT_WAIT_ORDER = 'after'; - const APPROVED_ACTIONS = ['fillField', 'magentoCLI', 'field', 'waitForElement', 'seeInField']; - const SECRET_MAPPING = ['fillField' => 'fillSecretField', 'magentoCLI' => 'magentoCLISecret']; + const APPROVED_ACTIONS = ['fillField', 'magentoCLI', 'field', 'seeInField']; + const SECRET_MAPPING = ['fillField' => 'fillSecretField', 'magentoCLI' => 'magentoCLISecret', + 'seeInField' => 'seeInSecretField']; const CREDS_REGEX = "/{{_CREDS\.([\w|\/]+)}}/"; /** @@ -110,7 +111,7 @@ private function resolveSecretFieldAccess($resolvedActions) if ($actionHasSecretRef && !(in_array($actionType, self::APPROVED_ACTIONS))) { throw new TestReferenceException("You cannot reference secret data outside " . - "of the fillField, magentoCLI and createData actions"); + "of the fillField, magentoCLI, seeInField and createData actions"); } // Do NOT remap actions that don't need it. diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 01eab2996..78ca97152 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1413,6 +1413,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato case "loadSessionSnapshot": case "seeInField": case "seeOptionIsSelected": + case "seeInSecretField": $testSteps .= $this->wrapFunctionCall($actor, $actionObject, $selector, $input); break; case "seeInPageSource": From 2753584ab14df4b9f0ea4e105d09d83a31e979fc Mon Sep 17 00:00:00 2001 From: Keerthana SL <glo81187@adobe.com> Date: Wed, 26 Feb 2025 13:38:04 +0530 Subject: [PATCH 671/674] Updating composer.json and changelog --- CHANGELOG.md | 21 ++++++++++++++++++--- composer.json | 2 +- composer.lock | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63c6bc030..cdf12a1e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,21 @@ Magento Functional Testing Framework Changelog ================================================ +5.0.3 +--------- +### Fixes +* Allowed additional actions to read from credentials file to fix page builder failures. + +5.0.2 +--------- +### Fixes +* Removed support for chrome 131 + +5.0.1 +--------- +### Enhancement +* Provided support for chrome 131 + 5.0.0 --------- ### Enhancements @@ -53,16 +68,16 @@ Magento Functional Testing Framework Changelog 4.7.2 --------- ### Enhancements -* Fail static test when introduced filename does not equal the MFTF object name +* Fail static test when introduced filename does not equal the MFTF object name contained within. 4.7.1 --------- ### Enhancements * Bumped all symfony dependencies to `^6.0 -* Removed abandoned package codacy/coverage +* Removed abandoned package codacy/coverage * Removed abandoned package sebastian/phpcpd -* Bumped monolog/monolog to ^3.0 +* Bumped monolog/monolog to ^3.0 * Bumped nikic/php-parser to ^5.0 4.7.0 diff --git a/composer.json b/composer.json index 89ebfbeaf..f9cd0bcd9 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": "5.0.0", + "version": "5.0.3", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 002940525..66ef18fc6 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": "4092635850a3aa7f59f696051ba82151", + "content-hash": "7556e816d320192bd4d43e1710d665d8", "packages": [ { "name": "allure-framework/allure-codeception", From 5c8ba7f03f3e560068b2b893b26b7a3bfe62c7fb Mon Sep 17 00:00:00 2001 From: Manjusha S <glo24116@adobe.com> Date: Wed, 26 Feb 2025 22:03:51 +0530 Subject: [PATCH 672/674] MFTF 5.0.3 Release --- CHANGELOG.md | 15 +++++++++++++++ composer.json | 2 +- composer.lock | 6 +++--- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63c6bc030..2ff4e50f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,21 @@ Magento Functional Testing Framework Changelog ================================================ +5.0.3 +--------- +### Fixes +* Added support for chrome 131 + +5.0.2 +--------- +### Fixes +* Removed support for chrome 131 + +5.0.1 +--------- +### Enhancement +* Provided support for chrome 131 + 5.0.0 --------- ### Enhancements diff --git a/composer.json b/composer.json index 89ebfbeaf..f9cd0bcd9 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": "5.0.0", + "version": "5.0.3", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 002940525..df23d27c3 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": "4092635850a3aa7f59f696051ba82151", + "content-hash": "7556e816d320192bd4d43e1710d665d8", "packages": [ { "name": "allure-framework/allure-codeception", @@ -7561,7 +7561,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -7573,6 +7573,6 @@ "ext-openssl": "*", "php": ">=8.2" }, - "platform-dev": {}, + "platform-dev": [], "plugin-api-version": "2.6.0" } From 42dd3fc2382c7538594c989dfbe94703f025ce68 Mon Sep 17 00:00:00 2001 From: Karishmathakare19 <del57145@adobe.com> Date: Mon, 28 Apr 2025 21:47:31 +0530 Subject: [PATCH 673/674] ACQE-7829: MFTF Component Health - June Release * Components upgrade * ACQE-7829: Commented cache@v2 code to test PR checks * Removed commented code related to cache@v2 * reverted code related to Monitor coverage * reverted code related to Monitor coverage * reverted code related to Monitor coverage * Revert removal of caching --------- Co-authored-by: manjusha729 <93243302+manjusha729@users.noreply.github.com> Co-authored-by: Kevin Kozan <kkozan@magento.com> --- .github/workflows/main.yml | 8 +- composer.lock | 520 +++++++++++++++++++++---------------- 2 files changed, 304 insertions(+), 224 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f860dd5ae..a9570ebee 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,7 +25,7 @@ jobs: - name: Cache Composer packages id: composer-cache - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: vendor key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} @@ -66,7 +66,7 @@ jobs: - name: Cache Composer packages id: composer-cache - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: vendor key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} @@ -98,7 +98,7 @@ jobs: - name: Cache Composer packages id: composer-cache - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: vendor key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} @@ -136,7 +136,7 @@ jobs: - name: Cache Composer packages id: composer-cache - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: vendor key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} diff --git a/composer.lock b/composer.lock index df23d27c3..fb9e910e8 100644 --- a/composer.lock +++ b/composer.lock @@ -199,16 +199,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.339.7", + "version": "3.342.28", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "7b7e48ce7970c0416c5fda045df7b93948fbf643" + "reference": "16cec140483869b3d244a5995b55d5365465dc58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/7b7e48ce7970c0416c5fda045df7b93948fbf643", - "reference": "7b7e48ce7970c0416c5fda045df7b93948fbf643", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/16cec140483869b3d244a5995b55d5365465dc58", + "reference": "16cec140483869b3d244a5995b55d5365465dc58", "shasum": "" }, "require": { @@ -234,7 +234,6 @@ "ext-openssl": "*", "ext-pcntl": "*", "ext-sockets": "*", - "paragonie/random_compat": ">= 2", "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", "psr/cache": "^2.0 || ^3.0", "psr/simple-cache": "^2.0 || ^3.0", @@ -291,30 +290,36 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.339.7" + "source": "https://github.com/aws/aws-sdk-php/tree/3.342.28" }, - "time": "2025-02-05T19:06:15+00:00" + "time": "2025-04-16T18:13:32+00:00" }, { "name": "behat/gherkin", - "version": "v4.11.0", + "version": "v4.12.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "32821a17b12620951e755b5d49328a6421a5b5b5" + "reference": "cc3a7e224b36373be382b53ef02ede0f1807bb58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/32821a17b12620951e755b5d49328a6421a5b5b5", - "reference": "32821a17b12620951e755b5d49328a6421a5b5b5", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/cc3a7e224b36373be382b53ef02ede0f1807bb58", + "reference": "cc3a7e224b36373be382b53ef02ede0f1807bb58", "shasum": "" }, "require": { + "composer-runtime-api": "^2.2", "php": "8.1.* || 8.2.* || 8.3.* || 8.4.*" }, "require-dev": { "cucumber/cucumber": "dev-gherkin-24.1.0", - "phpunit/phpunit": "^9.6", + "friendsofphp/php-cs-fixer": "^3.65", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^2", + "phpstan/phpstan-phpunit": "^2", + "phpunit/phpunit": "^10.5", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", "symfony/yaml": "^5.4 || ^6.4 || ^7.0" }, "suggest": { @@ -339,11 +344,11 @@ { "name": "Konstantin Kudryashov", "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" + "homepage": "https://everzet.com" } ], "description": "Gherkin DSL parser for PHP", - "homepage": "http://behat.org/", + "homepage": "https://behat.org/", "keywords": [ "BDD", "Behat", @@ -354,22 +359,22 @@ ], "support": { "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.11.0" + "source": "https://github.com/Behat/Gherkin/tree/v4.12.0" }, - "time": "2024-12-06T10:07:25+00:00" + "time": "2025-02-26T14:28:23+00:00" }, { "name": "brick/math", - "version": "0.12.1", + "version": "0.12.3", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", - "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", "shasum": "" }, "require": { @@ -378,7 +383,7 @@ "require-dev": { "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^10.1", - "vimeo/psalm": "5.16.0" + "vimeo/psalm": "6.8.8" }, "type": "library", "autoload": { @@ -408,7 +413,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.1" + "source": "https://github.com/brick/math/tree/0.12.3" }, "funding": [ { @@ -416,20 +421,20 @@ "type": "github" } ], - "time": "2023-11-29T23:19:16+00:00" + "time": "2025-02-28T13:11:00+00:00" }, { "name": "codeception/codeception", - "version": "5.1.2", + "version": "5.2.1", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374" + "reference": "6e06224627dcd89e7d4753f44ba4df35034b6314" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374", - "reference": "3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/6e06224627dcd89e7d4753f44ba4df35034b6314", + "reference": "6e06224627dcd89e7d4753f44ba4df35034b6314", "shasum": "" }, "require": { @@ -439,20 +444,20 @@ "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "php": "^8.0", - "phpunit/php-code-coverage": "^9.2 || ^10.0 || ^11.0", - "phpunit/php-text-template": "^2.0 || ^3.0 || ^4.0", - "phpunit/php-timer": "^5.0.3 || ^6.0 || ^7.0", - "phpunit/phpunit": "^9.5.20 || ^10.0 || ^11.0", + "php": "^8.1", + "phpunit/php-code-coverage": "^9.2 || ^10.0 || ^11.0 || ^12.0", + "phpunit/php-text-template": "^2.0 || ^3.0 || ^4.0 || ^5.0", + "phpunit/php-timer": "^5.0.3 || ^6.0 || ^7.0 || ^8.0", + "phpunit/phpunit": "^9.5.20 || ^10.0 || ^11.0 || ^12.0", "psy/psysh": "^0.11.2 || ^0.12", - "sebastian/comparator": "^4.0.5 || ^5.0 || ^6.0", - "sebastian/diff": "^4.0.3 || ^5.0 || ^6.0", - "symfony/console": ">=4.4.24 <8.0", - "symfony/css-selector": ">=4.4.24 <8.0", - "symfony/event-dispatcher": ">=4.4.24 <8.0", - "symfony/finder": ">=4.4.24 <8.0", - "symfony/var-dumper": ">=4.4.24 <8.0", - "symfony/yaml": ">=4.4.24 <8.0" + "sebastian/comparator": "^4.0.5 || ^5.0 || ^6.0 || ^7.0", + "sebastian/diff": "^4.0.3 || ^5.0 || ^6.0 || ^7.0", + "symfony/console": ">=5.4.24 <8.0", + "symfony/css-selector": ">=5.4.24 <8.0", + "symfony/event-dispatcher": ">=5.4.24 <8.0", + "symfony/finder": ">=5.4.24 <8.0", + "symfony/var-dumper": ">=5.4.24 <8.0", + "symfony/yaml": ">=5.4.24 <8.0" }, "conflict": { "codeception/lib-innerbrowser": "<3.1.3", @@ -464,7 +469,7 @@ }, "require-dev": { "codeception/lib-innerbrowser": "*@dev", - "codeception/lib-web": "^1.0", + "codeception/lib-web": "*@dev", "codeception/module-asserts": "*@dev", "codeception/module-cli": "*@dev", "codeception/module-db": "*@dev", @@ -473,8 +478,8 @@ "codeception/util-universalframework": "*@dev", "ext-simplexml": "*", "jetbrains/phpstorm-attributes": "^1.0", - "symfony/dotenv": ">=4.4.24 <8.0", - "symfony/process": ">=4.4.24 <8.0", + "symfony/dotenv": ">=5.4.24 <8.0", + "symfony/process": ">=5.4.24 <8.0", "vlucas/phpdotenv": "^5.1" }, "suggest": { @@ -490,6 +495,11 @@ "codecept" ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.2.x-dev" + } + }, "autoload": { "files": [ "functions.php" @@ -524,7 +534,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/5.1.2" + "source": "https://github.com/Codeception/Codeception/tree/5.2.1" }, "funding": [ { @@ -532,20 +542,20 @@ "type": "open_collective" } ], - "time": "2024-03-07T07:19:42+00:00" + "time": "2025-02-20T14:52:49+00:00" }, { "name": "codeception/lib-asserts", - "version": "2.1.0", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/Codeception/lib-asserts.git", - "reference": "b8c7dff552249e560879c682ba44a4b963af91bc" + "reference": "06750a60af3ebc66faab4313981accec1be4eefc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/b8c7dff552249e560879c682ba44a4b963af91bc", - "reference": "b8c7dff552249e560879c682ba44a4b963af91bc", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/06750a60af3ebc66faab4313981accec1be4eefc", + "reference": "06750a60af3ebc66faab4313981accec1be4eefc", "shasum": "" }, "require": { @@ -584,29 +594,29 @@ ], "support": { "issues": "https://github.com/Codeception/lib-asserts/issues", - "source": "https://github.com/Codeception/lib-asserts/tree/2.1.0" + "source": "https://github.com/Codeception/lib-asserts/tree/2.2.0" }, - "time": "2023-02-10T18:36:23+00:00" + "time": "2025-03-10T20:41:33+00:00" }, { "name": "codeception/lib-web", - "version": "1.0.6", + "version": "1.0.7", "source": { "type": "git", "url": "https://github.com/Codeception/lib-web.git", - "reference": "01ff7f9ed8760ba0b0805a0b3a843b4e74165a60" + "reference": "1444ccc9b1d6721f3ced8703c8f4a9041b80df93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/lib-web/zipball/01ff7f9ed8760ba0b0805a0b3a843b4e74165a60", - "reference": "01ff7f9ed8760ba0b0805a0b3a843b4e74165a60", + "url": "https://api.github.com/repos/Codeception/lib-web/zipball/1444ccc9b1d6721f3ced8703c8f4a9041b80df93", + "reference": "1444ccc9b1d6721f3ced8703c8f4a9041b80df93", "shasum": "" }, "require": { "ext-mbstring": "*", "guzzlehttp/psr7": "^2.0", - "php": "^8.0", - "phpunit/phpunit": "^9.5 | ^10.0 | ^11.0", + "php": "^8.1", + "phpunit/phpunit": "^9.5 | ^10.0 | ^11.0 | ^12", "symfony/css-selector": ">=4.4.24 <8.0" }, "conflict": { @@ -637,9 +647,9 @@ ], "support": { "issues": "https://github.com/Codeception/lib-web/issues", - "source": "https://github.com/Codeception/lib-web/tree/1.0.6" + "source": "https://github.com/Codeception/lib-web/tree/1.0.7" }, - "time": "2024-02-06T20:50:08+00:00" + "time": "2025-02-09T12:05:55+00:00" }, { "name": "codeception/module-asserts", @@ -700,16 +710,16 @@ }, { "name": "codeception/module-webdriver", - "version": "4.0.2", + "version": "4.0.3", "source": { "type": "git", "url": "https://github.com/Codeception/module-webdriver.git", - "reference": "ef0ea8044eb01dc1e830df27fe431e71440a462f" + "reference": "551d214ddd57a9539acf1123d7c56ec82b1004df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/ef0ea8044eb01dc1e830df27fe431e71440a462f", - "reference": "ef0ea8044eb01dc1e830df27fe431e71440a462f", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/551d214ddd57a9539acf1123d7c56ec82b1004df", + "reference": "551d214ddd57a9539acf1123d7c56ec82b1004df", "shasum": "" }, "require": { @@ -720,7 +730,7 @@ "ext-mbstring": "*", "php": "^8.1", "php-webdriver/webdriver": "^1.14.0", - "phpunit/phpunit": "^10.0 || ^11.0" + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0" }, "suggest": { "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" @@ -755,27 +765,27 @@ ], "support": { "issues": "https://github.com/Codeception/module-webdriver/issues", - "source": "https://github.com/Codeception/module-webdriver/tree/4.0.2" + "source": "https://github.com/Codeception/module-webdriver/tree/4.0.3" }, - "time": "2024-08-10T00:18:42+00:00" + "time": "2025-02-14T07:10:05+00:00" }, { "name": "codeception/stub", - "version": "4.1.3", + "version": "4.1.4", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "4fcad2c165f365377486dc3fd8703b07f1f2fcae" + "reference": "6ce453073a0c220b254dd7f4383645615e4071c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/4fcad2c165f365377486dc3fd8703b07f1f2fcae", - "reference": "4fcad2c165f365377486dc3fd8703b07f1f2fcae", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/6ce453073a0c220b254dd7f4383645615e4071c3", + "reference": "6ce453073a0c220b254dd7f4383645615e4071c3", "shasum": "" }, "require": { "php": "^7.4 | ^8.0", - "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | ^11" + "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | ^11 | ^12" }, "conflict": { "codeception/codeception": "<5.0.6" @@ -796,22 +806,22 @@ "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", "support": { "issues": "https://github.com/Codeception/Stub/issues", - "source": "https://github.com/Codeception/Stub/tree/4.1.3" + "source": "https://github.com/Codeception/Stub/tree/4.1.4" }, - "time": "2024-02-02T19:21:00+00:00" + "time": "2025-02-14T06:56:33+00:00" }, { "name": "composer/ca-bundle", - "version": "1.5.5", + "version": "1.5.6", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6" + "reference": "f65c239c970e7f072f067ab78646e9f0b2935175" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/08c50d5ec4c6ced7d0271d2862dec8c1033283e6", - "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/f65c239c970e7f072f067ab78646e9f0b2935175", + "reference": "f65c239c970e7f072f067ab78646e9f0b2935175", "shasum": "" }, "require": { @@ -858,7 +868,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.5" + "source": "https://github.com/composer/ca-bundle/tree/1.5.6" }, "funding": [ { @@ -874,20 +884,20 @@ "type": "tidelift" } ], - "time": "2025-01-08T16:17:16+00:00" + "time": "2025-03-06T14:30:56+00:00" }, { "name": "composer/class-map-generator", - "version": "1.6.0", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9" + "reference": "134b705ddb0025d397d8318a75825fe3c9d1da34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ffe442c5974c44a9343e37a0abcb1cc37319f5b9", - "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/134b705ddb0025d397d8318a75825fe3c9d1da34", + "reference": "134b705ddb0025d397d8318a75825fe3c9d1da34", "shasum": "" }, "require": { @@ -931,7 +941,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.6.0" + "source": "https://github.com/composer/class-map-generator/tree/1.6.1" }, "funding": [ { @@ -947,20 +957,20 @@ "type": "tidelift" } ], - "time": "2025-02-05T10:05:34+00:00" + "time": "2025-03-24T13:50:44+00:00" }, { "name": "composer/composer", - "version": "2.8.5", + "version": "2.8.8", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "ae208dc1e182bd45d99fcecb956501da212454a1" + "reference": "85ff84d6c5260ba21740a7c5c9a111890805d6e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/ae208dc1e182bd45d99fcecb956501da212454a1", - "reference": "ae208dc1e182bd45d99fcecb956501da212454a1", + "url": "https://api.github.com/repos/composer/composer/zipball/85ff84d6c5260ba21740a7c5c9a111890805d6e7", + "reference": "85ff84d6c5260ba21740a7c5c9a111890805d6e7", "shasum": "" }, "require": { @@ -971,7 +981,7 @@ "composer/semver": "^3.3", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", - "justinrainbow/json-schema": "^5.3", + "justinrainbow/json-schema": "^6.3.1", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", "react/promise": "^2.11 || ^3.2", @@ -1045,7 +1055,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.8.5" + "source": "https://github.com/composer/composer/tree/2.8.8" }, "funding": [ { @@ -1061,7 +1071,7 @@ "type": "tidelift" } ], - "time": "2025-01-21T14:23:40+00:00" + "time": "2025-04-04T14:56:46+00:00" }, { "name": "composer/metadata-minifier", @@ -1656,16 +1666,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.9.2", + "version": "7.9.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", "shasum": "" }, "require": { @@ -1762,7 +1772,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + "source": "https://github.com/guzzle/guzzle/tree/7.9.3" }, "funding": [ { @@ -1778,20 +1788,20 @@ "type": "tidelift" } ], - "time": "2024-07-24T11:22:20+00:00" + "time": "2025-03-27T13:37:11+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.4", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", "shasum": "" }, "require": { @@ -1845,7 +1855,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.4" + "source": "https://github.com/guzzle/promises/tree/2.2.0" }, "funding": [ { @@ -1861,20 +1871,20 @@ "type": "tidelift" } ], - "time": "2024-10-17T10:06:22+00:00" + "time": "2025-03-27T13:27:01+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.7.0", + "version": "2.7.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", "shasum": "" }, "require": { @@ -1961,7 +1971,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.0" + "source": "https://github.com/guzzle/psr7/tree/2.7.1" }, "funding": [ { @@ -1977,34 +1987,44 @@ "type": "tidelift" } ], - "time": "2024-07-18T11:15:46+00:00" + "time": "2025-03-27T12:30:47+00:00" }, { "name": "justinrainbow/json-schema", - "version": "5.3.0", + "version": "6.4.1", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" + "reference": "35d262c94959571e8736db1e5c9bc36ab94ae900" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", - "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/35d262c94959571e8736db1e5c9bc36ab94ae900", + "reference": "35d262c94959571e8736db1e5c9bc36ab94ae900", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-json": "*", + "marc-mabe/php-enum": "^4.0", + "php": "^7.2 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "friendsofphp/php-cs-fixer": "3.3.0", "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" + "marc-mabe/php-enum-phpstan": "^2.0", + "phpspec/prophecy": "^1.19", + "phpstan/phpstan": "^1.12", + "phpunit/phpunit": "^8.5" }, "bin": [ "bin/validate-json" ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, "autoload": { "psr-4": { "JsonSchema\\": "src/JsonSchema/" @@ -2033,16 +2053,16 @@ } ], "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", + "homepage": "https://github.com/jsonrainbow/json-schema", "keywords": [ "json", "schema" ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" + "source": "https://github.com/jsonrainbow/json-schema/tree/6.4.1" }, - "time": "2024-07-06T21:00:26+00:00" + "time": "2025-04-04T13:08:07+00:00" }, { "name": "laminas/laminas-diactoros", @@ -2132,18 +2152,91 @@ ], "time": "2024-10-14T11:59:49+00:00" }, + { + "name": "marc-mabe/php-enum", + "version": "v4.7.1", + "source": { + "type": "git", + "url": "https://github.com/marc-mabe/php-enum.git", + "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed", + "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed", + "shasum": "" + }, + "require": { + "ext-reflection": "*", + "php": "^7.1 | ^8.0" + }, + "require-dev": { + "phpbench/phpbench": "^0.16.10 || ^1.0.4", + "phpstan/phpstan": "^1.3.1", + "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11", + "vimeo/psalm": "^4.17.0 | ^5.26.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.2-dev", + "dev-master": "4.7-dev" + } + }, + "autoload": { + "psr-4": { + "MabeEnum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Marc Bennewitz", + "email": "dev@mabe.berlin", + "homepage": "https://mabe.berlin/", + "role": "Lead" + } + ], + "description": "Simple and fast implementation of enumerations with native PHP", + "homepage": "https://github.com/marc-mabe/php-enum", + "keywords": [ + "enum", + "enum-map", + "enum-set", + "enumeration", + "enumerator", + "enummap", + "enumset", + "map", + "set", + "type", + "type-hint", + "typehint" + ], + "support": { + "issues": "https://github.com/marc-mabe/php-enum/issues", + "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.1" + }, + "time": "2024-11-28T04:54:44+00:00" + }, { "name": "monolog/monolog", - "version": "3.8.1", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4" + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4", - "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", "shasum": "" }, "require": { @@ -2221,7 +2314,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.8.1" + "source": "https://github.com/Seldaek/monolog/tree/3.9.0" }, "funding": [ { @@ -2233,7 +2326,7 @@ "type": "tidelift" } ], - "time": "2024-12-05T17:15:07+00:00" + "time": "2025-03-24T10:02:05+00:00" }, { "name": "mtdowling/jmespath.php", @@ -2353,16 +2446,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.12.1", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + "reference": "024473a478be9df5fdaca2c793f2232fe788e414" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", + "reference": "024473a478be9df5fdaca2c793f2232fe788e414", "shasum": "" }, "require": { @@ -2401,7 +2494,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" }, "funding": [ { @@ -2409,7 +2502,7 @@ "type": "tidelift" } ], - "time": "2024-11-08T17:47:46+00:00" + "time": "2025-02-12T12:17:51+00:00" }, { "name": "nikic/php-parser", @@ -3043,16 +3136,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.44", + "version": "10.5.45", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1381c62769be4bb88fa4c5aec1366c7c66ca4f36" + "reference": "bd68a781d8e30348bc297449f5234b3458267ae8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1381c62769be4bb88fa4c5aec1366c7c66ca4f36", - "reference": "1381c62769be4bb88fa4c5aec1366c7c66ca4f36", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bd68a781d8e30348bc297449f5234b3458267ae8", + "reference": "bd68a781d8e30348bc297449f5234b3458267ae8", "shasum": "" }, "require": { @@ -3124,7 +3217,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.44" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.45" }, "funding": [ { @@ -3140,7 +3233,7 @@ "type": "tidelift" } ], - "time": "2025-01-31T07:00:38+00:00" + "time": "2025-02-06T16:08:12+00:00" }, { "name": "psr/cache", @@ -3554,16 +3647,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.7", + "version": "v0.12.8", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c" + "reference": "85057ceedee50c49d4f6ecaff73ee96adb3b3625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", - "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/85057ceedee50c49d4f6ecaff73ee96adb3b3625", + "reference": "85057ceedee50c49d4f6ecaff73ee96adb3b3625", "shasum": "" }, "require": { @@ -3627,9 +3720,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.7" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.8" }, - "time": "2024-12-10T01:58:33+00:00" + "time": "2025-03-16T03:05:19+00:00" }, { "name": "ralouphie/getallheaders", @@ -3677,16 +3770,16 @@ }, { "name": "ramsey/collection", - "version": "2.0.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", "shasum": "" }, "require": { @@ -3694,25 +3787,22 @@ }, "require-dev": { "captainhook/plugin-composer": "^5.3", - "ergebnis/composer-normalize": "^2.28.3", - "fakerphp/faker": "^1.21", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", "hamcrest/hamcrest-php": "^2.0", - "jangregor/phpstan-prophecy": "^1.0", - "mockery/mockery": "^1.5", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpcsstandards/phpcsutils": "^1.0.0-rc1", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.18.4", - "ramsey/coding-standard": "^2.0.3", - "ramsey/conventional-commits": "^1.3", - "vimeo/psalm": "^5.4" + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" }, "type": "library", "extra": { @@ -3750,19 +3840,9 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.0.0" + "source": "https://github.com/ramsey/collection/tree/2.1.1" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", - "type": "tidelift" - } - ], - "time": "2022-12-31T21:50:55+00:00" + "time": "2025-03-22T05:38:12+00:00" }, { "name": "ramsey/uuid", @@ -5102,16 +5182,16 @@ }, { "name": "symfony/console", - "version": "v6.4.17", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "799445db3f15768ecc382ac5699e6da0520a0a04" + "reference": "2e4af9c952617cc3f9559ff706aee420a8464c36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/799445db3f15768ecc382ac5699e6da0520a0a04", - "reference": "799445db3f15768ecc382ac5699e6da0520a0a04", + "url": "https://api.github.com/repos/symfony/console/zipball/2e4af9c952617cc3f9559ff706aee420a8464c36", + "reference": "2e4af9c952617cc3f9559ff706aee420a8464c36", "shasum": "" }, "require": { @@ -5176,7 +5256,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.17" + "source": "https://github.com/symfony/console/tree/v6.4.20" }, "funding": [ { @@ -5192,7 +5272,7 @@ "type": "tidelift" } ], - "time": "2024-12-07T12:07:30+00:00" + "time": "2025-03-03T17:16:38+00:00" }, { "name": "symfony/css-selector", @@ -5688,16 +5768,16 @@ }, { "name": "symfony/mime", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "917d77981eb1ea963608d5cda4d9c0cf72eaa68e" + "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/917d77981eb1ea963608d5cda4d9c0cf72eaa68e", - "reference": "917d77981eb1ea963608d5cda4d9c0cf72eaa68e", + "url": "https://api.github.com/repos/symfony/mime/zipball/ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", + "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", "shasum": "" }, "require": { @@ -5753,7 +5833,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.18" + "source": "https://github.com/symfony/mime/tree/v6.4.19" }, "funding": [ { @@ -5769,7 +5849,7 @@ "type": "tidelift" } ], - "time": "2025-01-23T13:10:52+00:00" + "time": "2025-02-17T21:23:52+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6406,16 +6486,16 @@ }, { "name": "symfony/process", - "version": "v6.4.15", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "3cb242f059c14ae08591c5c4087d1fe443564392" + "reference": "e2a61c16af36c9a07e5c9906498b73e091949a20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3cb242f059c14ae08591c5c4087d1fe443564392", - "reference": "3cb242f059c14ae08591c5c4087d1fe443564392", + "url": "https://api.github.com/repos/symfony/process/zipball/e2a61c16af36c9a07e5c9906498b73e091949a20", + "reference": "e2a61c16af36c9a07e5c9906498b73e091949a20", "shasum": "" }, "require": { @@ -6447,7 +6527,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.15" + "source": "https://github.com/symfony/process/tree/v6.4.20" }, "funding": [ { @@ -6463,7 +6543,7 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:19:14+00:00" + "time": "2025-03-10T17:11:00+00:00" }, { "name": "symfony/service-contracts", @@ -6720,16 +6800,16 @@ }, { "name": "symfony/yaml", - "version": "v7.2.3", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec" + "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/ac238f173df0c9c1120f862d0f599e17535a87ec", - "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", + "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", "shasum": "" }, "require": { @@ -6772,7 +6852,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.3" + "source": "https://github.com/symfony/yaml/tree/v7.2.5" }, "funding": [ { @@ -6788,7 +6868,7 @@ "type": "tidelift" } ], - "time": "2025-01-07T12:55:42+00:00" + "time": "2025-03-03T07:12:39+00:00" }, { "name": "theseer/tokenizer", @@ -7342,16 +7422,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v7.2.3", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "1d321c4bc3fe926fd4c38999a4c9af4f5d61ddfc" + "reference": "58ab71379f14a741755717cece2868bf41ed45d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/1d321c4bc3fe926fd4c38999a4c9af4f5d61ddfc", - "reference": "1d321c4bc3fe926fd4c38999a4c9af4f5d61ddfc", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/58ab71379f14a741755717cece2868bf41ed45d8", + "reference": "58ab71379f14a741755717cece2868bf41ed45d8", "shasum": "" }, "require": { @@ -7359,7 +7439,7 @@ "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^3.5", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/var-exporter": "^6.4.20|^7.2.5" }, "conflict": { "ext-psr": "<1.1|>=2", @@ -7402,7 +7482,7 @@ "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/v7.2.3" + "source": "https://github.com/symfony/dependency-injection/tree/v7.2.5" }, "funding": [ { @@ -7418,20 +7498,20 @@ "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2025-03-13T12:21:46+00:00" }, { "name": "symfony/stopwatch", - "version": "v7.2.2", + "version": "v7.2.4", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df" + "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e46690d5b9d7164a6d061cab1e8d46141b9f49df", - "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", + "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", "shasum": "" }, "require": { @@ -7464,7 +7544,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.2.2" + "source": "https://github.com/symfony/stopwatch/tree/v7.2.4" }, "funding": [ { @@ -7480,20 +7560,20 @@ "type": "tidelift" } ], - "time": "2024-12-18T14:28:33+00:00" + "time": "2025-02-24T10:49:57+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.2.0", + "version": "v7.2.5", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "1a6a89f95a46af0f142874c9d650a6358d13070d" + "reference": "c37b301818bd7288715d40de634f05781b686ace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1a6a89f95a46af0f142874c9d650a6358d13070d", - "reference": "1a6a89f95a46af0f142874c9d650a6358d13070d", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c37b301818bd7288715d40de634f05781b686ace", + "reference": "c37b301818bd7288715d40de634f05781b686ace", "shasum": "" }, "require": { @@ -7540,7 +7620,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.2.0" + "source": "https://github.com/symfony/var-exporter/tree/v7.2.5" }, "funding": [ { @@ -7556,7 +7636,7 @@ "type": "tidelift" } ], - "time": "2024-10-18T07:58:17+00:00" + "time": "2025-03-13T12:21:46+00:00" } ], "aliases": [], From 3b7549f2c20f595f6c85627dc20d892d9a430572 Mon Sep 17 00:00:00 2001 From: Pradyumna Bhat <cod32466@adobe.com> Date: Wed, 30 Apr 2025 16:04:41 +0530 Subject: [PATCH 674/674] ACQE-7352: Fix spomky-labs/otphp deprecation messages --- .../DataTransport/Auth/Tfa/Clock.php | 24 +++++++++++++++++++ .../DataTransport/Auth/Tfa/OTP.php | 9 ++++++- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/Magento/FunctionalTestingFramework/DataTransport/Auth/Tfa/Clock.php diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/Tfa/Clock.php b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/Tfa/Clock.php new file mode 100644 index 000000000..2961d1641 --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/Tfa/Clock.php @@ -0,0 +1,24 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +declare(strict_types=1); + +namespace Magento\FunctionalTestingFramework\DataTransport\Auth\Tfa; + +use DateTimeImmutable; +use Psr\Clock\ClockInterface; + +class Clock implements ClockInterface +{ + /** + * Return DateTimeImmutable class object + * + * @return DateTimeImmutable + */ + public function now(): DateTimeImmutable + { + return new DateTimeImmutable(); + } +} diff --git a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/Tfa/OTP.php b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/Tfa/OTP.php index b12733b33..a92ba65fa 100644 --- a/src/Magento/FunctionalTestingFramework/DataTransport/Auth/Tfa/OTP.php +++ b/src/Magento/FunctionalTestingFramework/DataTransport/Auth/Tfa/OTP.php @@ -57,7 +57,14 @@ private static function create($path) throw new TestFrameworkException('Unable to get OTP' . PHP_EOL . $e->getMessage()); } - self::$totps[$path] = TOTP::create($secret); + self::$totps[$path] = TOTP::create( + $secret, + TOTP::DEFAULT_PERIOD, + TOTP::DEFAULT_DIGEST, + TOTP::DEFAULT_DIGITS, + TOTP::DEFAULT_EPOCH, + new Clock() + ); self::$totps[$path]->setIssuer('MFTF'); self::$totps[$path]->setLabel('MFTF Testing'); }