421 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			421 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\Framework\Communication;
 | 
						|
 | 
						|
/**
 | 
						|
 * Test of communication configuration reading and parsing.
 | 
						|
 *
 | 
						|
 * @magentoCache config disabled
 | 
						|
 */
 | 
						|
class ConfigTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Check how valid communication XML config is parsed.
 | 
						|
     */
 | 
						|
    public function testGetTopics()
 | 
						|
    {
 | 
						|
        $topics = $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml', __DIR__ . '/_files/valid_communication_extra.xml']
 | 
						|
        )->getTopics();
 | 
						|
        $expectedParsedTopics = include __DIR__ . '/_files/valid_communication_expected.php';
 | 
						|
        $this->assertEquals($expectedParsedTopics, $topics);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get topic configuration by its name
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testGetTopicsNumeric()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Service method specified in the definition of topic "customerDeletedNumbers" is not av'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance([__DIR__ . '/_files/valid_communication_numeric.xml'])->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    // @codingStandardsIgnoreStart
 | 
						|
    /**
 | 
						|
     * Get topic configuration by its name
 | 
						|
     *
 | 
						|
    Element 'topic', attribute 'schema': [facet 'pattern'] The value '55\Customer\Api\CustomerRepositoryInterface::delete' is not accepted by the pattern '[a-zA-Z]+[a-zA-Z0-9\\]+::[a-zA-Z0-9]+'.
 | 
						|
    Line: 9
 | 
						|
 | 
						|
    Element 'topic', attribute 'schema': '55\Customer\Api\CustomerRepositoryInterface::delete' is not a valid value of the atomic type 'schemaType'.
 | 
						|
    Line: 9
 | 
						|
 | 
						|
    Element 'handler', attribute 'type': [facet 'pattern'] The value '55\Customer\Api\CustomerRepositoryInterface' is not accepted by the pattern '[a-zA-Z]+[a-zA-Z0-9\\]+'.
 | 
						|
    Line: 10
 | 
						|
 | 
						|
    Element 'handler', attribute 'type': '55\Customer\Api\CustomerRepositoryInterface' is not a valid value of the atomic type 'serviceTypeType'.
 | 
						|
    Line: 10
 | 
						|
    Verify the XML and try again.
 | 
						|
     *
 | 
						|
     */
 | 
						|
    // @codingStandardsIgnoreEnd
 | 
						|
    public function testGetTopicsNumericInvalid()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
 | 
						|
        $this->expectExceptionMessage('The XML in file "0" is invalid:');
 | 
						|
 | 
						|
        $this->getConfigInstance([__DIR__ . '/_files/invalid_communication_numeric.xml'])->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get topic configuration by its name
 | 
						|
     */
 | 
						|
    public function testGetTopic()
 | 
						|
    {
 | 
						|
        $topics = $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml', __DIR__ . '/_files/valid_communication_extra.xml']
 | 
						|
        )->getTopic('customerCreated');
 | 
						|
        $expectedParsedTopics = include __DIR__ . '/_files/valid_communication_expected.php';
 | 
						|
        $this->assertEquals($expectedParsedTopics['customerCreated'], $topics);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get topic configuration by its name
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testGetTopicInvalidName()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
 | 
						|
        $this->expectExceptionMessage('Topic "invalidTopic" is not configured.');
 | 
						|
 | 
						|
        $this->getConfigInstance([__DIR__ . '/_files/valid_communication.xml'])->getTopic('invalidTopic');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionMissingRequest()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Either "request" or "schema" attribute must be specified for topic "customerUpdated"'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance([__DIR__ . '/_files/communication_missing_request.xml'])->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionNotExistingServiceMethod()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage('Service method specified in the definition of topic "customerRetrieved" is not');
 | 
						|
 | 
						|
        $this->getConfigInstance([__DIR__ . '/_files/communication_not_existing_service_method.xml'])->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionNotExistingService()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage('Service method specified in the definition of topic "customerRetrieved" is not');
 | 
						|
 | 
						|
        $this->getConfigInstance([__DIR__ . '/_files/communication_not_existing_service.xml'])->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionNoAttributes()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Either "request" or "schema" attribute must be specified for topic "customerRetrieved"'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance([__DIR__ . '/_files/communication_no_attributes.xml'])->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionInvalidResponseSchema()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Response schema definition for topic "customerUpdated" should reference existing'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance([__DIR__ . '/_files/communication_response_not_existing_service.xml'])->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionInvalidRequestSchema()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Request schema definition for topic "customerUpdated" should reference existing'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance([__DIR__ . '/_files/communication_request_not_existing_service.xml'])->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionMultipleHandlersSynchronousMode()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Topic "customerDeleted" is configured for synchronous requests, that is why it must'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance([__DIR__ . '/_files/communication_multiple_handlers_synchronous_mode.xml'])
 | 
						|
            ->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionInvalidHandler()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Service method specified in the definition of handler "customHandler" for topic "custo'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance([__DIR__ . '/_files/communication_not_existing_handler_method.xml'])->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionInvalidTopicNameInEnv()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Topic name "customerAdded" and attribute "name" = "customerCreated" must be equal'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml'],
 | 
						|
            __DIR__ . '/_files/communication_invalid_topic_name.php'
 | 
						|
        )->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionTopicWithoutDataInEnv()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage('Topic "customerCreated" must contain data');
 | 
						|
 | 
						|
        $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml'],
 | 
						|
            __DIR__ . '/_files/communication_topic_without_data.php'
 | 
						|
        )->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionTopicWithMissedKeysInEnv()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage('Topic "customerCreated" has missed keys: [response]');
 | 
						|
 | 
						|
        $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml'],
 | 
						|
            __DIR__ . '/_files/communication_topic_with_missed_keys.php'
 | 
						|
        )->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionTopicWithExcessiveKeysInEnv()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage('Topic "customerCreated" has excessive keys: [some_incorrect_key]');
 | 
						|
 | 
						|
        $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml'],
 | 
						|
            __DIR__ . '/_files/communication_topic_with_excessive_keys.php'
 | 
						|
        )->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionTopicWithNonMatchedNameInEnv()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Topic name "customerDeleted" and attribute "name" = "customerRemoved" must be equal'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml'],
 | 
						|
            __DIR__ . '/_files/communication_with_non_matched_name.php'
 | 
						|
        )->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionMultipleHandlersSynchronousModeInEnv()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Topic "customerDeleted" is configured for synchronous requests, that is why it must'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml'],
 | 
						|
            __DIR__ . '/_files/communication_multiple_handlers_synchronous_mode.php'
 | 
						|
        )->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionInvalidRequestSchemaInEnv()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Request schema definition for topic "customerCreated" should reference existing service'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml'],
 | 
						|
            __DIR__ . '/_files/communication_request_not_existing_service.php'
 | 
						|
        )->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionInvalidResponseSchemaInEnv()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Response schema definition for topic "customerCreated" should reference existing type o'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml'],
 | 
						|
            __DIR__ . '/_files/communication_response_not_existing_service.php'
 | 
						|
        )->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionInvalidMethodInHandlerInEnv()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Service method specified in the definition of handler "customerCreatedFirst" for topic'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml'],
 | 
						|
            __DIR__ . '/_files/communication_not_existing_handler_method.php'
 | 
						|
        )->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionWithDisabledHandlerInEnv()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Disabled handler "default" for topic "customerCreated" cannot be added to the config fi'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml'],
 | 
						|
            __DIR__ . '/_files/communication_with_disabled_handler.php'
 | 
						|
        )->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionIncorrectRequestSchemaTypeInEnv()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'Request schema type for topic "customerCreated" must be "object_interface" or "service_'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml'],
 | 
						|
            __DIR__ . '/_files/communication_incorrect_request_schema_type.php'
 | 
						|
        )->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     */
 | 
						|
    public function testGetTopicsExceptionIsNotBooleanTypeOfIsSynchronousInEnv()
 | 
						|
    {
 | 
						|
        $this->expectException(\LogicException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            'The attribute "is_synchronous" for topic "customerCreated" should have the value of the'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->getConfigInstance(
 | 
						|
            [__DIR__ . '/_files/valid_communication.xml'],
 | 
						|
            __DIR__ . '/_files/communication_is_synchronous_is_not_boolean.php'
 | 
						|
        )->getTopics();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Create config instance initialized with configuration from $configFilePath
 | 
						|
     *
 | 
						|
     * @param array $configFilePaths
 | 
						|
     * @param string|null $envConfigFilePath
 | 
						|
     * @return \Magento\Framework\Communication\ConfigInterface
 | 
						|
     */
 | 
						|
    protected function getConfigInstance($configFilePaths, $envConfigFilePath = null)
 | 
						|
    {
 | 
						|
        $fileResolver = $this->getMockForAbstractClass(\Magento\Framework\Config\FileResolverInterface::class);
 | 
						|
        $fileResolverResult = [];
 | 
						|
        foreach ($configFilePaths as $configFilePath) {
 | 
						|
            $fileResolverResult[] = file_get_contents($configFilePath);
 | 
						|
        }
 | 
						|
        $fileResolver->expects($this->any())
 | 
						|
            ->method('get')
 | 
						|
            ->willReturn($fileResolverResult);
 | 
						|
        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
 | 
						|
        $xmlReader = $objectManager->create(
 | 
						|
            \Magento\Framework\Communication\Config\Reader\XmlReader::class,
 | 
						|
            ['fileResolver' => $fileResolver]
 | 
						|
        );
 | 
						|
        $deploymentConfigReader = $this->getMockBuilder(\Magento\Framework\App\DeploymentConfig\Reader::class)
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->setMethods([])
 | 
						|
            ->getMock();
 | 
						|
        $envConfigData = include $envConfigFilePath ?: __DIR__ . '/_files/valid_communication_input.php';
 | 
						|
        $deploymentConfigReader->expects($this->any())->method('load')->willReturn($envConfigData);
 | 
						|
        $deploymentConfig = $objectManager->create(
 | 
						|
            \Magento\Framework\App\DeploymentConfig::class,
 | 
						|
            ['reader' => $deploymentConfigReader]
 | 
						|
        );
 | 
						|
        $methodsMap = $objectManager->create(\Magento\Framework\Reflection\MethodsMap::class);
 | 
						|
        $envReader = $objectManager->create(
 | 
						|
            \Magento\Framework\Communication\Config\Reader\EnvReader::class,
 | 
						|
            [
 | 
						|
                'deploymentConfig' => $deploymentConfig,
 | 
						|
                'methodsMap' => $methodsMap
 | 
						|
            ]
 | 
						|
        );
 | 
						|
        $readersConfig = [
 | 
						|
            'xmlReader' => ['reader' => $xmlReader, 'sortOrder' => 10],
 | 
						|
            'envReader' => ['reader' => $envReader, 'sortOrder' => 20]
 | 
						|
        ];
 | 
						|
        /** @var \Magento\Framework\Communication\Config\CompositeReader $reader */
 | 
						|
        $reader = $objectManager->create(
 | 
						|
            \Magento\Framework\Communication\Config\CompositeReader::class,
 | 
						|
            ['readers' => $readersConfig]
 | 
						|
        );
 | 
						|
        /** @var \Magento\Framework\Communication\Config $config */
 | 
						|
        $configData = $objectManager->create(
 | 
						|
            \Magento\Framework\Communication\Config\Data::class,
 | 
						|
            [
 | 
						|
                'reader' => $reader
 | 
						|
            ]
 | 
						|
        );
 | 
						|
        return $objectManager->create(
 | 
						|
            \Magento\Framework\Communication\ConfigInterface::class,
 | 
						|
            ['configData' => $configData]
 | 
						|
        );
 | 
						|
    }
 | 
						|
}
 |