From d50f5b983173e61e39a707304e6a1dcfa2481449 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Thu, 15 Jul 2021 11:08:40 +0300 Subject: [PATCH 1/6] 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 2/6] 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 45e2436ce3480f7cf8f6eb5b9c38841607590a77 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Thu, 22 Jul 2021 23:28:18 +0300 Subject: [PATCH 3/6] 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 4/6] 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 04ea4ab25fdfd8e3f88d44fb2163d0c22a17ea50 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Fri, 23 Jul 2021 17:43:11 +0300 Subject: [PATCH 5/6] 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 63a1ed4f6ee65c1a083d16bb99faf397219c4302 Mon Sep 17 00:00:00 2001 From: "andrii.zinkevych" Date: Wed, 28 Jul 2021 17:02:58 +0300 Subject: [PATCH 6/6] 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(